[hibernate-commits] Hibernate SVN: r19788 - in core/branches/gradle2/hibernate-core: src and 246 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Wed Jun 23 03:20:11 EDT 2010


Author: steve.ebersole at jboss.com
Date: 2010-06-23 03:19:32 -0400 (Wed, 23 Jun 2010)
New Revision: 19788

Added:
   core/branches/gradle2/hibernate-core/src/intgTest/
   core/branches/gradle2/hibernate-core/src/intgTest/java/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/FailureExpectedCollector.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/cid/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/cid/AbstractCompositeIdTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/cid/Mappings.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/cid/MyInterface.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/cid/MyInterfaceImpl.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/propertyref/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/propertyref/AbstractComponentPropertyRefTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/propertyref/Address.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/propertyref/AddressImpl.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/propertyref/Mappings.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/propertyref/Server.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/propertyref/ServerImpl.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/Address.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/AnyTypeTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/ComplexPropertyValue.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/IntegerPropertyValue.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/Person.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/Properties.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/PropertySet.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/PropertyValue.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/StringPropertyValue.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/array/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/array/A.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/array/A.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/array/ArrayTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/array/B.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ast/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ast/ASTIteratorTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ast/ASTUtilTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batch/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batch/BatchTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batch/DataPoint.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batch/DataPoint.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batchfetch/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batchfetch/BatchFetchTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batchfetch/Model.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batchfetch/ProductLine.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batchfetch/ProductLine.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bidi/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bidi/Auction.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bidi/Auction.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bidi/Auction2.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bidi/AuctionTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bidi/AuctionTest2.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bidi/Bid.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/Bean.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/Bean.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/BeanReflectionHelper.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/ProxyBean.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/cglib/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/cglib/CGLIBThreadLocalTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/cglib/InvocationTargetExceptionTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/cglib/ReflectionOptimizerTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/javassist/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/javassist/InvocationTargetExceptionTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/javassist/ReflectionOptimizerTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/A.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/BidirectionalOneToManyCascadeTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/Child.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/Child.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/DeleteOrphanChild.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/DeleteOrphanChild.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/G.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/H.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/Job.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/Job.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/JobBatch.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/JobBatch.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/MultiPathCascade.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/MultiPathCascadeTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/Parent.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/Parent.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/RefreshTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/CascadeMergeToChildBeforeParent.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/CascadeMergeToChildBeforeParentTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/MultiPathCircleCascade.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/MultiPathCircleCascadeTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/Node.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/Route.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/Tour.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/Transport.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/Vehicle.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cfg/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cfg/Cacheable.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cfg/CacheableFileTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cfg/ConfigurationSerializationTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cfg/ListenerTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/CompositeIdTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/CompositeIdWithGeneratorTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/Customer.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/Customer.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/LineItem.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/LineItem.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/Order.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/Order.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/Product.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/Product.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/PurchaseDetail.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/PurchaseRecord.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/PurchaseRecord.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/PurchaseRecordIdGenerator.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/backref/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/backref/map/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/backref/map/compkey/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/backref/map/compkey/BackrefCompositeMapKeyTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/backref/map/compkey/MapKey.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/backref/map/compkey/Mappings.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/backref/map/compkey/Part.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/backref/map/compkey/Product.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/bag/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/bag/BagOwner.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/bag/Mappings.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/bag/PersistentBagTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/idbag/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/idbag/IdbagOwner.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/idbag/Mappings.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/idbag/PersistentIdBagTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/list/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/list/ListOwner.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/list/Mappings.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/list/PersistentListTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/map/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/map/Child.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/map/Mappings.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/map/Parent.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/map/PersistentMapTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/Animal.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/CollectionTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/Email.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/Mammal.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/Permission.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/User.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/UserPermissions.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/Zoo.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/Zoo.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/set/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/set/Child.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/set/Container.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/set/Mappings.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/set/MappingsNonLazy.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/set/Parent.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/set/PersistentSetNonLazyTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/set/PersistentSetTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/basic/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/basic/ComponentTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/basic/Employee.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/basic/OptionalComponent.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/basic/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/basic/User.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/basic/User.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/collection/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/collection/CascadeToComponentCollectionTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/collection/Definition.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/collection/LocalizedStrings.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/collection/Mappings.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/collection/Value.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/toone/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/toone/Address.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/toone/CascadeToComponentAssociationTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/toone/Document.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/toone/Mappings.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/toone/PersonalInfo.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/toone/User.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/compositeelement/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/compositeelement/Child.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/compositeelement/CompositeElementTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/compositeelement/Parent.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/compositeelement/Parent.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/AggressiveReleaseTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/BasicConnectionProviderTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/ConnectionManagementTestCase.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/CurrentSessionConnectionTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/Other.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/Silly.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/Silly.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/SuppliedConnectionTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/ThreadLocalCurrentSessionTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/AbstractFoo.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/Animal.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/Bar.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/CityState.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/Course.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/CourseMeeting.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/CourseMeetingId.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/CriteriaQueryTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/Enrolment.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/Enrolment.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/Foo.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/GreatFoo.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/LikeTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/LongInElementsTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/StringExpression.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/Student.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/StudentDTO.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/TestObject.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/TestObject.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cuk/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cuk/Account.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cuk/Address.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cuk/CompositePropertyRefTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cuk/Person.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cuk/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cut/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cut/CompositeUserTypeTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cut/MonetoryAmount.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cut/MonetoryAmountUserType.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cut/MutualFund.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cut/Transaction.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cut/Transaction.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cut/types.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/deletetransient/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/deletetransient/Address.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/deletetransient/DeleteTransientEntityTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/deletetransient/Note.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/deletetransient/Person.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/deletetransient/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/deletetransient/Suite.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/function/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/function/AnsiTrimEmulationFunctionTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/function/MySQLRoundFunctionTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/function/Product.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/function/Product.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/functional/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/functional/cache/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/functional/cache/SQLFunctionsInterSystemsTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/functional/cache/TestInterSystemsFunctionsClass.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/functional/cache/TestInterSystemsFunctionsClass.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/unit/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/unit/lockhint/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/unit/lockhint/AbstractLockHintTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/unit/lockhint/SQLServerLockHintsTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/unit/lockhint/SybaseASE15LockHintsTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/unit/lockhint/SybaseLockHintsTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/discriminator/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/discriminator/Address.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/discriminator/Customer.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/discriminator/DiscriminatorTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/discriminator/Employee.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/discriminator/Person.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/discriminator/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/Address.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/Company.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/Customer.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/DataProxyHandler.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/ProxyHelper.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/interceptor/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/interceptor/Customer.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/interceptor/InterceptorDynamicEntityTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/interceptor/ProxyInterceptor.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/package.html
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer/Customer.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer/EntityNameInterceptor.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer/MyEntityInstantiator.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer/MyEntityTuplizer.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer/TuplizerDynamicEntityTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer2/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer2/Customer.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer2/ImprovedTuplizerDynamicEntityTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer2/MyEntityInstantiator.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer2/MyEntityTuplizer.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ecid/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ecid/Course.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ecid/Course.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ecid/EmbeddedCompositeIdTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ecid/UniversityCourse.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/accessors/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/accessors/Dom4jAccessorTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/basic/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/basic/AB.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/basic/Account.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/basic/Dom4jTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/basic/Employer.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/component/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/component/Component.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/component/ComponentOwner.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/component/ComponentReference.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/component/Dom4jComponentTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/component/Mapping.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/many2one/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/many2one/Car.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/many2one/Car.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/many2one/CarPart.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/many2one/CarType.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/many2one/Dom4jManyToOneTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/map/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/map/basic/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/map/basic/DynamicClassTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/map/basic/ProductLine.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/map/subclass/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/map/subclass/Mappings.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/map/subclass/SubclassDynamicMapTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/multi/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/multi/MultiRepresentationTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/multi/Stock.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/multi/Stock.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/multi/Valuation.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/multi/Valuation.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/AbstractCollectionEventTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/AbstractParentWithCollection.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/BrokenCollectionEventTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/Child.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/ChildEntity.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/ChildValue.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/CollectionListeners.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/Entity.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/ParentWithCollection.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/AbstractAssociationCollectionEventTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/manytomany/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/manytomany/BidirectionalManyToManyBagToSetCollectionEventTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/manytomany/BidirectionalManyToManyBagToSetMapping.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/manytomany/BidirectionalManyToManySetToSetCollectionEventTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/manytomany/BidirectionalManyToManySetToSetMapping.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/manytomany/ChildWithBidirectionalManyToMany.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/manytomany/ParentWithBidirectionalManyToMany.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManyBagCollectionEventTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManyBagMapping.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManyBagSubclassCollectionEventTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManyBagSubclassMapping.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManySetCollectionEventTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManySetMapping.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/ChildWithManyToOne.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/ParentWithBidirectionalOneToMany.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/ParentWithBidirectionalOneToManySubclass.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/ParentWithCollectionOfEntities.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/manytomany/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/manytomany/UnidirectionalManyToManyBagCollectionEventTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/manytomany/UnidirectionalManyToManyBagMapping.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/onetomany/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/onetomany/UnidirectionalOneToManyBagCollectionEventTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/onetomany/UnidirectionalOneToManyBagMapping.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/onetomany/UnidirectionalOneToManySetCollectionEventTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/onetomany/UnidirectionalOneToManySetMapping.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/values/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/values/ParentWithCollectionOfValues.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/values/ValuesBagCollectionEventTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/values/ValuesBagMapping.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/events/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/events/CallbackTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/exception/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/exception/Group.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/exception/Group.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/exception/SQLExceptionConversionTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/exception/User.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/exception/User.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/Customer.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/Customer.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/Employee.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/Employee.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/ExtendsTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/Person.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/allinone.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/allseparateinone.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/entitynames.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/packageentitynames.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/unionsubclass.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extralazy/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extralazy/Document.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extralazy/ExtraLazyTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extralazy/Group.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extralazy/SessionAttribute.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extralazy/User.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extralazy/UserGroup.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/join/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/join/Course.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/join/CourseOffering.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/join/Department.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/join/Enrollment.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/join/JoinFetchProfileTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/join/Mappings.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/join/Student.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Category.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Category.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Department.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Department.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/DynamicFilterTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/LineItem.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/LineItem.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Order.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Order.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Product.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Product.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Salesperson.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Salesperson.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/defs.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/Basic.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/BasicFilteredBulkManipulationTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/Customer.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/Employee.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/Joined.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/JoinedFilteredBulkManipulationTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/User.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/filter-defs.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/formulajoin/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/formulajoin/Detail.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/formulajoin/FormulaJoinTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/formulajoin/Master.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/formulajoin/Master.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/AbstractGeneratedPropertyTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/ComponentOwner.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/ComponentOwner.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/GeneratedPropertyEntity.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/GeneratedPropertyEntity.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/MSSQLGeneratedPropertyEntity.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/PartiallyGeneratedComponentTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/TimestampGeneratedValuesWithCachingTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/TriggerGeneratedValuesWithCachingTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/TriggerGeneratedValuesWithoutCachingTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/identity/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/identity/IdentityGeneratedKeysTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/identity/MyChild.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/identity/MyEntity.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/identity/MyEntity.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/identity/MySibling.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/select/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/select/MyEntity.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/select/MyEntity.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/select/SelectGeneratorTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/seqidentity/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/seqidentity/MyEntity.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/seqidentity/MyEntity.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/seqidentity/SequenceIdentityTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/ASTParserLoadingTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Address.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Animal.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Animal.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/BooleanLiteralEntity.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/BooleanLiteralEntity.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/BulkManipulationTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Car.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Cat.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/ClassicTranslatorTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Classification.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/ClassificationType.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/ComponentContainer.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/ComponentContainer.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/CrazyCompositeKey.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/CrazyIdFieldNames.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/CriteriaClassicAggregationReturnTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/CriteriaHQLAlignmentTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Dog.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/DomesticAnimal.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/EJBQLTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/EntityWithArgFunctionAsColumn.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/EntityWithCrazyCompositeKey.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/EntityWithCrazyCompositeKey.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/EntityWithFunctionAsColumnHolder.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/EntityWithNoArgFunctionAsColumn.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/FooBarCopy.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/FunctionNameAsColumnTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/FunctionNamesAsColumns.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/HQLTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/HeresAnotherCrazyIdFieldName.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/HqlParserTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Human.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Image.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Image.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/IntegerVersioned.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Joiner.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/KeyManyToOneEntity.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/KeyManyToOneEntity.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/KeyManyToOneKeyEntity.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Lizard.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Mammal.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/MoreCrazyIdFieldNameStuffEntity.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Name.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/PettingZoo.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Pickup.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/QueryTranslatorTestCase.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Reptile.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/SUV.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/ScrollableCollectionFetchingTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/SimpleAssociatedEntity.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/SimpleEntityWithAssociation.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/SimpleEntityWithAssociation.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/StateProvince.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/TimestampVersioned.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Truck.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/User.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/VariousKeywordPropertyEntity.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/VariousKeywordPropertyEntity.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Vehicle.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Vehicle.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Versions.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/WithClauseTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Zoo.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Car.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Car.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/MultipleHiLoPerTableGeneratorTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Plane.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Plane.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Product.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Product.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Radio.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Radio.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/UseIdentifierRollbackTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/sqlrep/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/sqlrep/Node.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/sqlrep/Node.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/sqlrep/sqlbinary/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/sqlrep/sqlbinary/UUIDBinaryTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/sqlrep/sqlchar/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/sqlrep/sqlchar/UUIDCharTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/strategy/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/strategy/CustomStrategyTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/strategy/Node.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/strategy/Node.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idbag/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idbag/Group.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idbag/IdBagTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idbag/User.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idbag/UserGroup.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idclass/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idclass/Customer.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idclass/Customer.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idclass/CustomerId.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idclass/FavoriteCustomer.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idclass/IdClassTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/biginteger/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/biginteger/increment/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/biginteger/increment/BigIntegerIncrementGeneratorTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/biginteger/increment/Entity.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/biginteger/increment/Mapping.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/biginteger/sequence/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/biginteger/sequence/BigIntegerSequenceGeneratorTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/biginteger/sequence/Entity.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/biginteger/sequence/Mapping.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/forcedtable/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/forcedtable/Basic.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/forcedtable/BasicForcedTableSequenceTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/forcedtable/Entity.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/forcedtable/HiLo.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/forcedtable/HiLoForcedTableSequenceTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/forcedtable/Pooled.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/forcedtable/PooledForcedTableSequenceTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/sequence/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/sequence/Basic.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/sequence/BasicSequenceTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/sequence/Entity.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/sequence/HiLo.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/sequence/HiLoSequenceTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/sequence/Pooled.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/sequence/PooledSequenceTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/table/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/table/Basic.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/table/BasicTableTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/table/Entity.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/table/HiLo.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/table/HiLoTableTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/table/Pooled.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/table/PooledTableTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idprops/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idprops/IdentifierPropertyReferencesTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idprops/LineItem.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idprops/LineItemPK.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idprops/Mapping.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idprops/Order.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idprops/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/Contract.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/ContractVariation.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/ContractVariation.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/ImmutableTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/Info.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/Party.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/Plan.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/AbstractEntityWithManyToManyTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/AbstractEntityWithOneToManyTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/Contract.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/ContractVariation.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/Info.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/Owner.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/Party.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/Plan.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/ContractVariation.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/ContractVariationOneToManyJoin.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/ContractVariationVersioned.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/ContractVariationVersionedOneToManyJoin.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/EntityWithInverseManyToManyTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/EntityWithInverseOneToManyJoinTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/EntityWithInverseOneToManyTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/VersionedEntityWithInverseManyToManyTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/VersionedEntityWithInverseOneToManyFailureExpectedTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/VersionedEntityWithInverseOneToManyJoinFailureExpectedTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/VersionedEntityWithInverseOneToManyJoinTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/VersionedEntityWithInverseOneToManyTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/ContractVariation.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/ContractVariationOneToManyJoin.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/ContractVariationUnidir.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/ContractVariationVersioned.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/ContractVariationVersionedOneToManyJoin.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/EntityWithNonInverseManyToManyTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/EntityWithNonInverseManyToManyUnidirTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/EntityWithNonInverseOneToManyJoinTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/EntityWithNonInverseOneToManyTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/EntityWithNonInverseOneToManyUnidirTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/VersionedEntityWithNonInverseManyToManyTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/VersionedEntityWithNonInverseOneToManyJoinTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/VersionedEntityWithNonInverseOneToManyTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/insertordering/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/insertordering/Group.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/insertordering/InsertOrderingTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/insertordering/Mapping.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/insertordering/Membership.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/insertordering/User.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/buildtime/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/buildtime/InstrumentTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/AbstractExecutable.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/Executable.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestCustomColumnReadAndWrite.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestDirtyCheckExecutable.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestFetchAllExecutable.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestInjectFieldInterceptorExecutable.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestIsPropertyInitializedExecutable.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestLazyExecutable.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestLazyManyToOneExecutable.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestLazyPropertyCustomTypeExecutable.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestManyToOneProxyExecutable.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestSharedPKOneToOneExecutable.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/CustomBlobType.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/Document.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/Documents.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/Entity.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/EntityWithOneToOnes.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/Folder.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/OneToOneNoProxy.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/OneToOneProxy.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/Owner.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/Problematic.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/Problematic.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/SharedPKOneToOne.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/runtime/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/runtime/AbstractTransformingClassLoaderInstrumentTestCase.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/runtime/CGLIBInstrumentationTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/runtime/JavassistInstrumentationTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/CollectionInterceptor.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/Image.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/Image.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/InstantiateInterceptor.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/InterceptorTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/Log.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/PropertyInterceptor.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/StatefulInterceptor.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/User.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/User.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/Document.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/DocumentImpl.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/DocumentInterceptor.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/Folder.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/FolderImpl.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/InterfaceProxyTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/Item.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/Item.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/ItemImpl.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/SecureDocument.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/SecureDocumentImpl.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/iterate/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/iterate/Item.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/iterate/Item.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/iterate/IterateTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jdbc/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jdbc/Boat.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jdbc/GeneralWorkTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jdbc/Mappings.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jdbc/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/Customer.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/Employee.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/JoinTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/OptionalJoinTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/Person.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/Thing.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/Thing.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/User.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinedsubclass/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinedsubclass/Address.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinedsubclass/Customer.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinedsubclass/Employee.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinedsubclass/JoinedSubclassTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinedsubclass/Person.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinedsubclass/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/Bid.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/Category.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/Comment.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/Group.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/Item.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/ItemBid.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/JoinFetchTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/User.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/UserGroup.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/AbstractJPATest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/Item.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/Item.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/MyEntity.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/MyEntity.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/MySubclassEntity.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/Part.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/Part.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/CascadeTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/Child.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/ChildAssigned.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/ChildInfo.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/ChildInfoAssigned.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/Other.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/OtherAssigned.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/Parent.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/ParentAssigned.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/ParentChild.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/ParentInfo.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/ParentInfoAssigned.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/fetch/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/fetch/FetchingTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/fetch/Person.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/fetch/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/fetch/Stay.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/lock/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/lock/JPALockTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/lock/RepeatableReadTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/package.html
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/proxy/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/proxy/JPAProxyTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/ql/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/ql/JPAQLComplianceTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/ql/NativeQueryTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/removed/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/removed/RemovedEntityTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/component/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/component/Customer.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/component/EagerKeyManyToOneTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/component/EagerMapping.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/component/LazyKeyManyToOneTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/component/LazyMapping.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/component/Order.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/embedded/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/embedded/Customer.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/embedded/KeyManyToOneTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/embedded/Mapping.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/embedded/Order.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazycache/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazycache/Document.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazycache/Documents.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazycache/InstrumentCacheTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazyonetoone/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazyonetoone/Employee.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazyonetoone/Employment.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazyonetoone/LazyOneToOneTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazyonetoone/Person.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazyonetoone/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/A.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ABC.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ABCExtends.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ABCProxy.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ABCProxyTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ABCTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Abstract.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/AbstractProxy.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/AltSimple.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Assignable.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/B.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Bar.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/BarProxy.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/BasicNameable.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Baz.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Baz.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Blobber.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Blobber.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Broken.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Broken.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/C1.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/C2.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/CacheTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Category.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Category.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Child.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Circular.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Circular.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Commento.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Company.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Component.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ComponentCollection.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ComponentNotNull.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ComponentNotNullMaster.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ComponentNotNullMaster.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ComponentNotNullTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Componentizable.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Componentizable.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/CompositeElement.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/CompositeIdId.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/CompositeIdId.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Contained.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Container.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Container.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Custom.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Custom.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/CustomPersister.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/CustomSQL.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/CustomSQLTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/D.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Detail.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/DoubleStringType.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Down.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Drug.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/E.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Eye.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Eye.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fee.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fee.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fixed.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fo.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fo.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Foo.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/FooBar.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/FooBarTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/FooComponent.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/FooProxy.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fum.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fum.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/FumCompositeID.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/FumTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fumm.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fumm.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Glarch.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Glarch.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/GlarchProxy.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Holder.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Holder.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/I.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/IJ.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/IJ2.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/IJ2Test.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/IJTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Immutable.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Immutable.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Inner.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/InnerKey.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Intervention.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/J.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Jay.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/K.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/LegacyTestCase.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Location.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Location.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Lower.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MainObject.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MainObject.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Many.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Many.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Map.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MapTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Marelo.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Master.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MasterDetail.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MasterDetailTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Medication.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Middle.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Middle.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MiddleKey.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Mono.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MoreStuff.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Multi.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Multi.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MultiExtends.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MultiTableTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Multiplicity.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MultiplicityType.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Nameable.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Nameable.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Named.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/NestingComponent.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/NonReflectiveBinderTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Object2.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Object2.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/One.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/One.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/OneToOneCacheTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Outer.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/OuterKey.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Parent.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ParentChild.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ParentChildTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Part.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Party.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Po.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/QueryByExampleTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Qux.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Qux.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Resource.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Result.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ReverseComparator.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Role.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/S.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/SQLFunctionsTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/SQLLoaderTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Several.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Simple.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Simple.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Single.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/SingleSeveral.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Sortable.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/StatisticsTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/StringComparator.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Stuff.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Stuff.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/SubComponent.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/SubDetail.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/SubMulti.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Super.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Top.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Trivial.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/TrivialClass.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Up.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/UpDown.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Vetoer.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Vetoer.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/W.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/WZ.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Wicked.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/X.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/XY.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Y.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Z.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/BlobLocatorTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/ClobLocatorTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/ImageMappings.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/ImageTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/LobHolder.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/LobMappings.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/LongByteArrayHolder.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/LongByteArrayTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/LongStringHolder.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/LongStringTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/MaterializedBlobMappings.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/MaterializedBlobTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/MaterializedClobMappings.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/MaterializedClobTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/SerializableData.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/SerializableHolder.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/SerializableMappings.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/SerializableTypeTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/TextMappings.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/TextTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/Group.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/ManyToManyTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/User.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/UserGroup.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/batchload/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/batchload/BatchedManyToManyTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/batchload/Group.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/batchload/User.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/batchload/UserGroupBatchLoad.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/ordered/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/ordered/Group.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/ordered/OrderedManyToManyTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/ordered/User.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/ordered/UserGroup.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/AbstractManyToManyAssociationClassTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/Group.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/Membership.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/User.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/compositeid/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/compositeid/ManyToManyAssociationClassCompositeIdTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/compositeid/Mappings.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/compositeid/MembershipWithCompositeId.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/surrogateid/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/surrogateid/assigned/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/surrogateid/assigned/ManyToManyAssociationClassAssignedIdTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/surrogateid/assigned/Mappings.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/surrogateid/generated/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/surrogateid/generated/ManyToManyAssociationClassGeneratedIdTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/surrogateid/generated/Mappings.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/map/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/map/Group.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/map/MapIndexFormulaTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/map/SessionAttribute.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/map/User.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/map/UserGroup.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapcompelem/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapcompelem/Item.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapcompelem/MapCompositeElementTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapcompelem/Part.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapcompelem/Product.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapcompelem/ProductPart.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapelemformula/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapelemformula/Group.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapelemformula/MapElementFormulaTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapelemformula/User.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapelemformula/UserGroup.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapping/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapping/PersistentClassVisitorTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapping/ValueVisitorTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mappingexception/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mappingexception/InvalidMapping.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mappingexception/InvalidMapping.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mappingexception/MappingExceptionTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mappingexception/User.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mappingexception/User.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mixed/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mixed/Document.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mixed/DocumentInterceptor.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mixed/Folder.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mixed/Item.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mixed/Item.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mixed/MixedTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mixed/SecureDocument.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/namingstrategy/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/namingstrategy/Customers.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/namingstrategy/Customers.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/namingstrategy/NamingStrategyTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/namingstrategy/TestNamingStrategy.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/immutable/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/immutable/Child.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/immutable/ImmutableEntityNaturalIdTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/immutable/ImmutableNaturalIdTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/immutable/Parent.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/immutable/ParentChildWithManyToOne.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/immutable/User.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/immutable/User.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/mutable/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/mutable/MutableNaturalIdTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/mutable/User.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/mutable/User.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/AbstractOperationTestCase.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Address.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Competition.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Competition.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Competitor.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/CreateTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/DeleteTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Employee.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Employer.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Employer.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/GetLoadTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/MergeTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Node.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Node.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/NumberedNode.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/OneToOne.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/OptLockEntity.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/PersonalDetails.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/SaveOrUpdateTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/TimestampedEntity.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/VersionedEntity.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ondelete/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ondelete/Address.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ondelete/Employee.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ondelete/OnDeleteTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ondelete/Person.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ondelete/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ondelete/Salesperson.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/AbstractRecursiveBidirectionalOneToManyTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/Child.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/Node.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/Node.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/OneToManyTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/Parent.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/Parent.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/RecursiveBidirectionalOneToManyCacheTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/RecursiveBidirectionalOneToManyNoCacheTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/formula/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/formula/Address.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/formula/OneToOneFormulaTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/formula/Person.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/formula/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/joined/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/joined/Address.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/joined/Entity.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/joined/JoinedSubclassOneToOneTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/joined/Org.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/joined/Person.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/joined/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/link/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/link/Customer.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/link/Employee.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/link/OneToOneLinkTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/link/Person.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/link/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/nopojo/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/nopojo/DynamicMapOneToOneTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/nopojo/Person.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/optional/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/optional/Address.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/optional/Entity.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/optional/OptionalOneToOneTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/optional/Org.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/optional/Person.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/optional/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/singletable/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/singletable/Address.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/singletable/DiscrimSubclassOneToOneTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/singletable/Entity.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/singletable/Org.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/singletable/Person.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/singletable/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/AbstractOperationTestCase.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Address.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Competition.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Competition.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Competitor.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/CreateTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/DeleteTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Employee.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Employer.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Employer.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/GetLoadTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/MergeTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Node.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Node.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/NumberedNode.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/OneToOne.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/OptLockEntity.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/PersonalDetails.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/SaveOrUpdateTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/TimestampedEntity.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/VersionedEntity.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/optlock/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/optlock/Document.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/optlock/Document.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/optlock/OptimisticLockTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/optlock/PublicationDate.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ordered/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ordered/OrderByTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ordered/Search.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ordered/Search.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/Mail.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/Mail.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/OrphanTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/Part.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/Product.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/Product.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/PropertyRefTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/User.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/User.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/bidirectional/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/bidirectional/DeleteOneToOneOrphansTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/bidirectional/Employee.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/bidirectional/EmployeeInfo.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/bidirectional/Mapping.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/composite/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/composite/DeleteOneToOneOrphansTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/composite/Employee.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/composite/EmployeeInfo.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/composite/Mapping.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/bidirectional/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/bidirectional/DeleteOneToOneOrphansTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/bidirectional/Employee.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/bidirectional/EmployeeInfo.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/bidirectional/Mapping.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/unidirectional/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/unidirectional/DeleteOneToOneOrphansTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/unidirectional/Employee.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/unidirectional/EmployeeInfo.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/unidirectional/Mapping.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/bidirectional/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/bidirectional/DeleteOneToOneOrphansTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/bidirectional/Employee.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/bidirectional/EmployeeInfo.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/bidirectional/Mapping.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/unidirectional/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/unidirectional/DeleteOneToOneOrphansTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/unidirectional/Employee.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/unidirectional/EmployeeInfo.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/unidirectional/Mapping.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/pagination/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/pagination/DataPoint.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/pagination/DataPoint.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/pagination/PaginationTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/basic/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/basic/Account.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/basic/Address.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/basic/Group.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/basic/Person.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/basic/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/basic/PropertyRefTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/complete/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/complete/Account.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/complete/CompleteComponentPropertyRefTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/complete/Identity.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/complete/Mapping.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/complete/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/partial/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/partial/Account.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/partial/Identity.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/partial/Mapping.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/partial/PartialComponentPropertyRefTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/partial/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/discrim/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/discrim/Account.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/discrim/Customer.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/discrim/Person.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/discrim/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/discrim/SubclassPropertyRefTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/joined/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/joined/Account.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/joined/BankAccount.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/joined/JoinedSubclassPropertyRefTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/joined/Person.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/joined/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/union/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/union/Account.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/union/Customer.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/union/Person.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/union/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/union/UnionSubclassPropertyRefTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/proxy/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/proxy/Container.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/proxy/DataPoint.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/proxy/DataPoint.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/proxy/Info.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/proxy/Owner.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/proxy/ProxyTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/querycache/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/querycache/Item.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/querycache/Item.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/querycache/QueryCacheTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/Customer.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/Employee.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/GetHqlQueryPlanTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/Joined.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/NativeSQLQueryPlanEqualsTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/NativeSQLQueryReturnEqualsAndHashCodeTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/User.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/filter-defs.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/AbstractReadOnlyTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/Container.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/Course.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/DataPoint.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/DataPoint.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/Enrolment.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/Enrolment.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/Info.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/Owner.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/ReadOnlyCriteriaQueryTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/ReadOnlyProxyTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/ReadOnlySessionLazyNonLazyTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/ReadOnlySessionTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/ReadOnlyTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/ReadOnlyVersionedNodesTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/Student.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/StudentDTO.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/TextHolder.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/TextHolder.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/VersionedNode.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/VersionedNode.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/reattachment/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/reattachment/Child.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/reattachment/CollectionReattachmentTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/reattachment/Mappings.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/reattachment/Parent.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/reattachment/ProxyReattachmentTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/resulttransformer/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/resulttransformer/Contract.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/resulttransformer/Contract.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/resulttransformer/PartnerA.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/resulttransformer/PartnerB.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/resulttransformer/ResultTransformerTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/rowid/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/rowid/Point.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/rowid/RowIdTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/rowid/RowIdType.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/schemaupdate/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/schemaupdate/1_Version.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/schemaupdate/2_Version.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/schemaupdate/MigrationTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/schemaupdate/Version.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sorted/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sorted/Search.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sorted/Search.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sorted/SortTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/check/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/check/ExceptionCheckingEntity.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/check/OracleCheckStyleTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/check/ParamCheckingEntity.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/check/ResultCheckStyleTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/check/oracle-mappings.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Dimension.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Employment.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Group.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/ImageHolder.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/MonetaryAmount.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/MonetaryAmountUserType.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Order.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Organization.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Product.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/SpaceShip.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Speech.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/TextHolder.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/CustomSQLTestSupport.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/CustomStoredProcTestSupport.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/datadirect/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/datadirect/oracle/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/datadirect/oracle/DataDirectOracleCustomSQLTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/datadirect/oracle/StoredProcedures.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/db2/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/db2/DB2CustomSQLTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/db2/Mappings.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/mysql/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/mysql/Mappings.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/mysql/MySQLCustomSQLTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/oracle/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/oracle/Mappings.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/oracle/OracleCustomSQLTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/oracle/StoredProcedures.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/sqlserver/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/sqlserver/Mappings.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/sqlserver/SQLServerCustomSQLTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/sybase/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/sybase/Mappings.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/sybase/SybaseCustomSQLTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/identity/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/identity/CustomInsertSQLWithIdentityColumnTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/identity/Mappings.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/query/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/query/NativeSQLQueries.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/query/NativeSQLQueriesTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/quotedidentifiers/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/quotedidentifiers/Mappings.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/quotedidentifiers/NativeSqlAndQuotedIdentifiersTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/quotedidentifiers/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/Contact.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/Contact.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/Country.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/Document.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/Document.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/Org.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/Paper.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/StatelessSessionQueryTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/StatelessSessionTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/fetching/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/fetching/Mappings.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/fetching/Resource.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/fetching/StatelessSessionFetchingTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/fetching/Task.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/fetching/User.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/Continent.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/Continent.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/Continent2.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/Country.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/Locality.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/Province.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/SessionStatsTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/State.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/StatsTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/Customer.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/DiscrimSubclassFilterTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/Employee.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/JoinedSubclassFilterTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/UnionSubclassFilterTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/discrim-subclass.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/joined-subclass.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/union-subclass.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselect/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselect/Alien.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselect/Being.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselect/Beings.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselect/Human.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselect/SubselectTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselectfetch/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselectfetch/Child.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselectfetch/Parent.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselectfetch/ParentChild.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselectfetch/SubselectFetchTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ternary/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ternary/Employee.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ternary/Site.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ternary/Ternary.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ternary/TernaryTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/timestamp/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/timestamp/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/timestamp/TimestampTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/timestamp/User.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/timestamp/User.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/tm/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/tm/CMTTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/tm/Item.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedmanytoone/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedmanytoone/Address.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedmanytoone/AddressId.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedmanytoone/Customer.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedmanytoone/Customer.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedmanytoone/TypedManyToOneTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedonetoone/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedonetoone/Address.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedonetoone/AddressId.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedonetoone/Customer.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedonetoone/Customer.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedonetoone/TypedOneToOneTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typeparameters/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typeparameters/DefaultValueIntegerType.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typeparameters/TypeParameterTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typeparameters/Typedef.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typeparameters/Widget.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typeparameters/Widget.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unconstrained/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unconstrained/Employee.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unconstrained/Person.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unconstrained/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unconstrained/UnconstrainedTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unidir/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unidir/BackrefTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unidir/Child.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unidir/Parent.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unidir/ParentChild.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Alien.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Being.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Beings.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Employee.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Hive.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Human.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Location.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Thing.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/UnionSubclassTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/alias/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/alias/CarBuyer.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/alias/Customer.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/alias/PersonID.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/alias/SellCarTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/alias/Seller.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/alias/mapping.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass2/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass2/Address.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass2/Customer.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass2/Employee.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass2/Person.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass2/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass2/UnionSubclassTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/Email.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/IMyList.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/MyList.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/MyListType.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/PersistentMyList.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/User.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/UserCollectionTypeTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/UserPermissions.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/parameterized/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/parameterized/DefaultableList.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/parameterized/DefaultableListImpl.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/parameterized/DefaultableListType.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/parameterized/Entity.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/parameterized/Mapping.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/parameterized/ParameterizedUserCollectionTypeTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/parameterized/PersistentDefaultableList.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/PropertiesHelperTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/StringHelperTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/dtd/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/dtd/Child.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/dtd/EntityResolverTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/dtd/Parent.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/dtd/Parent.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/dtd/child.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/Person.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/PersonThing.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/Task.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/Thing.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/VersionTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/db/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/db/DbVersionTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/db/Group.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/db/Permission.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/db/User.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/db/User.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/sybase/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/sybase/Permission.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/sybase/SybaseTimestampVersioningTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/sybase/User.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/sybase/User.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/where/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/where/File.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/where/File.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/where/WhereTest.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/cache/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/cache/BaseCacheProviderTestCase.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/cache/Item.hbm.xml
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/cache/Item.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/cache/VersionedItem.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/AbstractClassLoaderIsolatedTestCase.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/DialectChecks.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/FailureExpected.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/RequiresDialect.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/RequiresDialectFeature.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/SkipForDialect.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/SkipLog.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/TestSuiteVisitor.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/UnitTestCase.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/functional/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/functional/DatabaseSpecificFunctionalTestCase.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/functional/ExecutionEnvironment.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/functional/FunctionalTestCase.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/functional/FunctionalTestClassTestSuite.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/functional/annotations/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/functional/annotations/HibernateTestCase.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/tm/
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/tm/ConnectionProviderImpl.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/tm/SimpleJtaTransactionImpl.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/tm/SimpleJtaTransactionManagerImpl.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/tm/TransactionManagerLookupImpl.java
   core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/tm/package.html
   core/branches/gradle2/hibernate-core/src/intgTest/resources/
   core/branches/gradle2/hibernate-core/src/intgTest/resources/hibernate.cfg.xml
   core/branches/gradle2/hibernate-core/src/intgTest/resources/log4j.properties
Removed:
   core/branches/gradle2/hibernate-core/pom.xml
Modified:
   core/branches/gradle2/hibernate-core/hibernate-core.gradle
Log:
converted hibernate-core and hibernate-annotations to use intgTest stuff

Modified: core/branches/gradle2/hibernate-core/hibernate-core.gradle
===================================================================
--- core/branches/gradle2/hibernate-core/hibernate-core.gradle	2010-06-23 06:15:02 UTC (rev 19787)
+++ core/branches/gradle2/hibernate-core/hibernate-core.gradle	2010-06-23 07:19:32 UTC (rev 19788)
@@ -1,29 +1,44 @@
 apply plugin: 'java'
 apply plugin: 'antlr'
+apply plugin: org.hibernate.gradle.util.IntegrationTestPlugin
 
+sourceSets {
+    intgTest {
+        resources{
+            // resources inherently exclude sources
+            srcDir 'src/intgTest/java'
+        }
+    }
+}
+
 dependencies {
-    antVersion = '1.6.5'
-
-    compile(
-            [group: 'commons-collections', name: 'commons-collections', version: '3.1'],
-            [group: 'dom4j', name: 'dom4j', version: dom4jVersion, transitive: false],
-            "javax.transaction:jta:1.1"
-    )
-    antlr(
-            [group: 'antlr', name: 'antlr', version: antlrVersion]
-    )
-    provided(
-            [group: 'javassist', name: 'javassist', version: javassistVersion],
-            [group: 'cglib', name: 'cglib', version: cglibVersion, transitive: true],
-            [group: 'ant', name: 'ant', version: antVersion],
-            [group: 'org.jboss.javaee', name: 'jboss-jacc-api_JDK4', version: '1.1.0', transitive: false]
-    )
+    compile( libraries.commons_collections )
+    compile( libraries.jta )
+    compile( libraries.dom4j ) {
+        transitive = false
+    }
+    antlr( libraries.antlr )
+    provided( libraries.javassist )
+    provided( libraries.cglib ) {
+        transitive = true
+    }
+    provided( libraries.ant )
+    provided( libraries.jacc )
+    testRuntime( 'jaxen:jaxen:1.1 at jar' )
+    testRuntime( libraries.javassist )
+    testRuntime( libraries.cglib ) {
+        transitive = true
+    }
 }
 
+
 manifest.mainAttributes(
         'Main-Class': 'org.hibernate.Version'
 )
 
 ideaModule {
-    sourceDirs.add(file('target/generated-src/antlr/main'))
+    sourceDirs.add( file( buildDirName + '/generated-src/antlr/main' ) )
+    testSourceDirs.addAll( sourceSets.intgTest.java.srcDirs )
+    testSourceDirs.addAll( sourceSets.intgTest.resources.srcDirs )
 }
+

Deleted: core/branches/gradle2/hibernate-core/pom.xml
===================================================================
--- core/branches/gradle2/hibernate-core/pom.xml	2010-06-23 06:15:02 UTC (rev 19787)
+++ core/branches/gradle2/hibernate-core/pom.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -1,179 +0,0 @@
-<?xml version="1.0"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.hibernate</groupId>
-        <artifactId>hibernate-parent</artifactId>
-        <version>3.6.0-SNAPSHOT</version>
-        <relativePath>../parent/pom.xml</relativePath>
-    </parent>
-
-    <groupId>org.hibernate</groupId>
-    <artifactId>hibernate-core</artifactId>
-    <packaging>jar</packaging>
-
-    <name>Hibernate Core</name>
-    <description>The core functionality of Hibernate</description>
-
-    <dependencies>
-        <dependency>
-            <groupId>antlr</groupId>
-            <artifactId>antlr</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>commons-collections</groupId>
-            <artifactId>commons-collections</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>dom4j</groupId>
-            <artifactId>dom4j</artifactId>
-        </dependency>
-
-        <!-- optional deps for bytecode providers until those are finally properly scoped -->
-        <dependency>
-            <groupId>javassist</groupId>
-            <artifactId>javassist</artifactId>
-            <optional>true</optional>
-        </dependency>
-        <dependency>
-            <groupId>cglib</groupId>
-            <artifactId>cglib</artifactId>
-            <optional>true</optional>
-        </dependency>
-
-        <dependency>
-            <!-- YUCK, YUCK, YUCK!!!! -->
-            <groupId>javax.transaction</groupId>
-            <artifactId>jta</artifactId>
-            <version>1.1</version>
-        </dependency>
-        <dependency>
-            <groupId>org.jboss.javaee</groupId>
-            <artifactId>jboss-jacc-api_JDK4</artifactId>
-            <version>1.1.0</version>
-            <scope>provided</scope>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.jboss.javaee</groupId>
-                    <artifactId>jboss-servlet-api_3.0</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.jboss.logging</groupId>
-                    <artifactId>jboss-logging-spi</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.jboss</groupId>
-                    <artifactId>jboss-common-core</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>ant</groupId>
-            <artifactId>ant</artifactId>
-            <version>1.6.5</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>com.h2database</groupId>
-            <artifactId>h2</artifactId>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>antlr-maven-plugin</artifactId>
-                <version>${antlrPluginVersion}</version>
-                <configuration>
-                    <grammars>hql.g,hql-sql.g,sql-gen.g,order-by.g,order-by-render.g</grammars>
-                    <traceParser>true</traceParser>
-                    <traceTreeParser>true</traceTreeParser>
-                </configuration>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>generate</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.jboss.maven.plugins</groupId>
-                <artifactId>maven-injection-plugin</artifactId>
-                <configuration>
-                    <bytecodeInjections>
-                        <bytecodeInjection>
-                            <expression>${pom.version}</expression>
-                            <targetMembers>
-                            	<methodBodyReturn>
-                            	    <className>org.hibernate.Version</className>
-                            	    <methodName>getVersionString</methodName>
-                            	</methodBodyReturn>
-                            </targetMembers>
-                        </bytecodeInjection>
-                    </bytecodeInjections>
-                </configuration>
-            </plugin>
-            <plugin>
-                <artifactId>maven-jar-plugin</artifactId>
-                <configuration>
-                    <archive>
-                        <manifest>
-                            <mainClass>org.hibernate.Version</mainClass>
-                        </manifest>
-                    </archive>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-    <reporting>
-        <plugins>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>antlr-maven-plugin</artifactId>
-                <version>${antlrPluginVersion}</version>
-                <configuration>
-                    <!-- eventually should be based on the second phase grammar -->
-                    <grammars>hql.g</grammars>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-javadoc-plugin</artifactId>
-                <configuration>
-                    <!-- 
-                    for the time being, gonna ignore the custom stylesheet (what did it do anyway???) 
-                    <stylesheetfile>xyz</stylesheetfile>
-                    -->
-                    <groups>
-                        <group>
-                            <title>Core API</title>
-                            <packages>org.hibernate:org.hibernate.classic:org.hibernate.criterion:org.hibernate.metadata:org.hibernate.cfg:org.hibernate.usertype</packages>
-                        </group>
-                        <group>
-                            <title>Extension API</title>
-                            <packages>org.hibernate.id:org.hibernate.connection:org.hibernate.transaction:org.hibernate.type:org.hibernate.dialect*:org.hibernate.cache*:org.hibernate.event*:org.hibernate.action:org.hibernate.property:org.hibernate.loader*:org.hibernate.persister*:org.hibernate.proxy:org.hibernate.tuple:org.hibernate.transform:org.hibernate.collection:org.hibernate.jdbc</packages>
-                        </group>
-                        <group>
-                            <title>Miscellaneous API</title>
-                            <packages>org.hibernate.stat:org.hibernate.tool.hbm2ddl:org.hibernate.jmx:org.hibernate.mapping:org.hibernate.tool.instrument</packages>
-                        </group>
-                        <group>
-                            <title>Internal Implementation</title>
-			    <packages>org.hibernate.engine:org.hibernate.impl:org.hibernate.sql:org.hibernate.lob:org.hibernate.util:org.hibernate.exception:org.hibernate.hql:org.hibernate.hql.ast:org.hibernate.hql.antlr:org.hibernate.hql.classic:org.hibernate.intercept:org.hibernate.secure:org.hibernate.pretty</packages>
-                        </group>
-                    </groups>
-                </configuration>
-            </plugin>
-        </plugins>
-    </reporting>
-
-    <properties>
-        <antlrPluginVersion>2.1</antlrPluginVersion>
-    </properties>
-</project>

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/FailureExpectedCollector.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/FailureExpectedCollector.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/FailureExpectedCollector.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,51 @@
+package org.hibernate.test;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.hibernate.testing.junit.TestSuiteVisitor;
+
+/**
+ * A simple class to collect the names of "failure expected" tests...
+ *
+ * @author Steve Ebersole
+ */
+public class FailureExpectedCollector {
+
+	public static void main(String[] args) {
+		Set testNames = collectAllFailureExpectedTestNames();
+		Iterator itr = testNames.iterator();
+		int i = 0;
+		while ( itr.hasNext() ) {
+			i++;
+			System.out.println( i + ") " + itr.next() );
+		}
+	}
+
+	public static Set collectAllFailureExpectedTestNames() {
+		Set names = new HashSet();
+// todo : need to come up with a new scheme to do this...
+//		collectFailureExpectedTestNames( names, ( TestSuite ) AllTests.unfilteredSuite() );
+		return names;
+	}
+
+	public static void collectFailureExpectedTestNames(final Set names, TestSuite suite) {
+		TestSuiteVisitor.Handler handler = new TestSuiteVisitor.Handler() {
+			public void handleTestCase(Test test) {
+				TestCase testCase = ( TestCase ) test;
+				if ( testCase.getName().endsWith( "FailureExpected" ) ) {
+					names.add( testCase.getClass().getName() + "#" + testCase.getName() );
+				}
+			}
+			public void startingTestSuite(TestSuite suite) {}
+			public void completedTestSuite(TestSuite suite) {}
+		};
+		TestSuiteVisitor visitor = new TestSuiteVisitor( handler );
+		visitor.visit( suite );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/FailureExpectedCollector.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/cid/AbstractCompositeIdTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/cid/AbstractCompositeIdTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/cid/AbstractCompositeIdTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,44 @@
+package org.hibernate.test.abstractembeddedcomponents.cid;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+import junit.framework.Test;
+
+/**
+ * @author Steve Ebersole
+ */
+public class AbstractCompositeIdTest extends FunctionalTestCase {
+	public AbstractCompositeIdTest(String x) {
+		super( x );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( AbstractCompositeIdTest.class );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "abstractembeddedcomponents/cid/Mappings.hbm.xml" };
+	}
+
+	public void testEmbeddedCompositeIdentifierOnAbstractClass() {
+		MyInterfaceImpl myInterface = new MyInterfaceImpl();
+		myInterface.setKey1( "key1" );
+		myInterface.setKey2( "key2" );
+		myInterface.setName( "test" );
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.save( myInterface );
+		s.flush();
+
+		s.createQuery( "from MyInterface" ).list();
+
+		s.delete( myInterface );
+		t.commit();
+		s.close();
+
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/cid/AbstractCompositeIdTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/cid/Mappings.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/cid/Mappings.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/cid/Mappings.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.abstractembeddedcomponents.cid">
+
+    <class name="MyInterface" table="MY_INTF" proxy="MyInterface">
+        <composite-id>
+            <key-property name="key1" type="string"/>
+            <key-property name="key2" type="string"/>
+        </composite-id>
+        <discriminator column="TYPE" type="string" length="10"/>
+        <property name="name" type="string"/>
+    </class>
+
+    <subclass name="MyInterfaceImpl" extends="MyInterface" discriminator-value="1" proxy="MyInterface">
+    </subclass>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/cid/Mappings.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/cid/MyInterface.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/cid/MyInterface.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/cid/MyInterface.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,15 @@
+package org.hibernate.test.abstractembeddedcomponents.cid;
+
+import java.io.Serializable;
+
+/**
+ * @author Steve Ebersole
+ */
+public interface MyInterface extends Serializable {
+	public String getKey1();
+	public void setKey1(String key1);
+	public String getKey2();
+	public void setKey2(String key2);
+	public String getName();
+	public void setName(String name);
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/cid/MyInterface.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/cid/MyInterfaceImpl.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/cid/MyInterfaceImpl.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/cid/MyInterfaceImpl.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,36 @@
+package org.hibernate.test.abstractembeddedcomponents.cid;
+
+import org.hibernate.test.abstractembeddedcomponents.cid.MyInterface;
+
+/**
+ * @author Steve Ebersole
+ */
+public class MyInterfaceImpl implements MyInterface {
+	private String key1;
+	private String key2;
+	private String name;
+
+	public String getKey1() {
+		return key1;
+	}
+
+	public void setKey1(String key1) {
+		this.key1 = key1;
+	}
+
+	public String getKey2() {
+		return key2;
+	}
+
+	public void setKey2(String key2) {
+		this.key2 = key2;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/cid/MyInterfaceImpl.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/propertyref/AbstractComponentPropertyRefTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/propertyref/AbstractComponentPropertyRefTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/propertyref/AbstractComponentPropertyRefTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,49 @@
+package org.hibernate.test.abstractembeddedcomponents.propertyref;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+import junit.framework.Test;
+
+/**
+ * @author Steve Ebersole
+ */
+public class AbstractComponentPropertyRefTest extends FunctionalTestCase {
+	public AbstractComponentPropertyRefTest(String name) {
+		super( name );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( AbstractComponentPropertyRefTest.class );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "abstractembeddedcomponents/propertyref/Mappings.hbm.xml" };
+	}
+
+	public void testPropertiesRefCascades() {
+		Session session = openSession();
+		Transaction trans = session.beginTransaction();
+		ServerImpl server = new ServerImpl();
+		session.save( server );
+		AddressImpl address = new AddressImpl();
+		server.setAddress( address );
+		address.setServer( server );
+		session.flush();
+		session.createQuery( "from Server s join fetch s.address" ).list();
+		trans.commit();
+		session.close();
+
+		assertNotNull( server.getId() );
+		assertNotNull( address.getId() );
+
+		session = openSession();
+		trans = session.beginTransaction();
+		session.delete( address );
+		session.delete( server );
+		trans.commit();
+		session.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/propertyref/AbstractComponentPropertyRefTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/propertyref/Address.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/propertyref/Address.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/propertyref/Address.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,13 @@
+package org.hibernate.test.abstractembeddedcomponents.propertyref;
+
+/**
+ * @author Steve Ebersole
+ */
+public interface Address {
+	public Long getId();
+	public void setId(Long id);
+	public String getAddressType();
+	public void setAddressType(String addressType);
+	public Server getServer();
+	public void setServer(Server server);
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/propertyref/Address.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/propertyref/AddressImpl.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/propertyref/AddressImpl.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/propertyref/AddressImpl.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,36 @@
+package org.hibernate.test.abstractembeddedcomponents.propertyref;
+
+import org.hibernate.test.abstractembeddedcomponents.propertyref.Address;
+
+/**
+ * @author Steve Ebersole
+ */
+public class AddressImpl implements Address {
+	private Long id;
+	private String addressType;
+	private Server server;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getAddressType() {
+		return addressType;
+	}
+
+	public void setAddressType(String addressType) {
+		this.addressType = addressType;
+	}
+
+	public Server getServer() {
+		return server;
+	}
+
+	public void setServer(Server server) {
+		this.server = server;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/propertyref/AddressImpl.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/propertyref/Mappings.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/propertyref/Mappings.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/propertyref/Mappings.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,43 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.abstractembeddedcomponents.propertyref">
+
+    <class name="Address" table="ADDRESS" proxy="Address">
+        <id name="id" type="long" column="ADDRESS_ID">
+            <generator class="native"/>
+        </id>
+        <discriminator column="ADDRESS_TYPE" type="string" length="30"/>
+        <properties name="uniqueAddress">
+            <property name="addressType" column="ADDRESS_TYPE" type="string" insert="false" update="false" length="30"/>
+            <many-to-one name="server" column="SERVER_ID" class="Server" not-null="true"/>
+        </properties>
+    </class>
+
+    <subclass name="AddressImpl" extends="Address" discriminator-value="2" proxy="Address">
+    </subclass>
+
+    <class name="Server" table="SERVER" proxy="Server">
+        <id name="id" type="long" column="SERVER_ID">
+            <generator class="native"/>
+        </id>
+        <discriminator column="SERVER_TYPE" type="string" length="10"/>
+        <property name="serverType" type="string" column="SERVER_TYPE" length="10" update="false" insert="false"/>
+    </class>
+
+    <subclass name="ServerImpl" extends="Server" discriminator-value="1" proxy="Server">
+        <many-to-one name="address"
+                     class="AddressImpl"
+                     property-ref="uniqueAddress"
+                     cascade="all"
+                     unique="true"
+                     update="false"
+                     insert="false">
+            <column name="ADDRESS_TYPE"/>
+            <column name="SERVER_ID"/>
+        </many-to-one>
+    </subclass>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/propertyref/Mappings.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/propertyref/Server.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/propertyref/Server.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/propertyref/Server.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,15 @@
+package org.hibernate.test.abstractembeddedcomponents.propertyref;
+
+import org.hibernate.test.abstractembeddedcomponents.propertyref.Address;
+
+/**
+ * @author Steve Ebersole
+ */
+public interface Server {
+	public Long getId();
+	public void setId(Long id);
+	public String getServerType();
+	public void setServerType(String serverType);
+	public Address getAddress();
+	public void setAddress(Address address);
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/propertyref/Server.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/propertyref/ServerImpl.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/propertyref/ServerImpl.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/propertyref/ServerImpl.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,37 @@
+package org.hibernate.test.abstractembeddedcomponents.propertyref;
+
+import org.hibernate.test.abstractembeddedcomponents.propertyref.Address;
+import org.hibernate.test.abstractembeddedcomponents.propertyref.Server;
+
+/**
+ * @author Steve Ebersole
+ */
+public class ServerImpl implements Server {
+	private Long id;
+	private String serverType;
+	private Address address;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getServerType() {
+		return serverType;
+	}
+
+	public void setServerType(String serverType) {
+		this.serverType = serverType;
+	}
+
+	public Address getAddress() {
+		return address;
+	}
+
+	public void setAddress(Address address) {
+		this.address = address;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/abstractembeddedcomponents/propertyref/ServerImpl.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/Address.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/Address.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/Address.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,30 @@
+package org.hibernate.test.any;
+
+import java.util.Set;
+import java.util.HashSet;
+
+/**
+ * todo: describe Address
+ *
+ * @author Steve Ebersole
+ */
+public class Address {
+	private Long id;
+	private Set lines = new HashSet();
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Set getLines() {
+		return lines;
+	}
+
+	public void setLines(Set lines) {
+		this.lines = lines;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/Address.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/AnyTypeTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/AnyTypeTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/AnyTypeTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,59 @@
+package org.hibernate.test.any;
+
+import org.hibernate.Session;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+
+import junit.framework.Test;
+
+/**
+ * todo: describe AnyTypeTest
+ *
+ * @author Steve Ebersole
+ */
+public class AnyTypeTest extends FunctionalTestCase {
+	public AnyTypeTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "any/Person.hbm.xml" };
+	}
+
+	public String getCacheConcurrencyStrategy() {
+		// having second level cache causes a condition whereby the original test case would not fail...
+		return null;
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( AnyTypeTest.class );
+	}
+
+	/**
+	 * Specific test for HHH-1663...
+	 */
+	public void testFlushProcessing() {
+		Session session = openSession();
+		session.beginTransaction();
+		Person person = new Person();
+		Address address = new Address();
+		person.setData( address );
+		session.saveOrUpdate(person);
+		session.saveOrUpdate(address);
+		session.getTransaction().commit();
+		session.close();
+
+		session = openSession();
+		session.beginTransaction();
+        person = (Person) session.load( Person.class, person.getId() );
+        person.setName("makingpersondirty");
+		session.getTransaction().commit();
+		session.close();
+
+		session = openSession();
+		session.beginTransaction();
+		session.delete( person );
+		session.getTransaction().commit();
+		session.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/AnyTypeTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/ComplexPropertyValue.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/ComplexPropertyValue.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/ComplexPropertyValue.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,47 @@
+package org.hibernate.test.any;
+
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Iterator;
+
+/**
+ * todo: describe ${NAME}
+ *
+ * @author Steve Ebersole
+ */
+public class ComplexPropertyValue implements PropertyValue {
+	private Long id;
+	private Map subProperties = new HashMap();
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Map getSubProperties() {
+		return subProperties;
+	}
+
+	public void setSubProperties(Map subProperties) {
+		this.subProperties = subProperties;
+	}
+
+	public String asString() {
+		return "complex[" + keyString() + "]";
+	}
+
+	private String keyString() {
+		StringBuffer buff = new StringBuffer();
+		Iterator itr = subProperties.keySet().iterator();
+		while ( itr.hasNext() ) {
+			buff.append( itr.next() );
+			if ( itr.hasNext() ) {
+				buff.append( ", " );
+			}
+		}
+		return buff.toString();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/ComplexPropertyValue.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/IntegerPropertyValue.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/IntegerPropertyValue.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/IntegerPropertyValue.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,38 @@
+package org.hibernate.test.any;
+
+/**
+ * todo: describe IntegerPropertyValue
+ *
+ * @author Steve Ebersole
+ */
+public class IntegerPropertyValue implements PropertyValue {
+	private Long id;
+	private int value;
+
+	public IntegerPropertyValue() {
+	}
+
+	public IntegerPropertyValue(int value) {
+		this.value = value;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public int getValue() {
+		return value;
+	}
+
+	public void setValue(int value) {
+		this.value = value;
+	}
+
+	public String asString() {
+		return Integer.toString( value );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/IntegerPropertyValue.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/Person.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/Person.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/Person.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.any">
+
+    <class name="Person" table="T_ANY_PERSON">
+        <id name="id" column="ID_">
+            <generator class="increment" />
+        </id>
+        <property name="name" />
+        <any name="data" id-type="long" cascade="none">
+            <meta-value value="A" class="Address"/>
+            <column name="DATATYPE_"/>
+            <column name="DATAID_"/>
+        </any>
+    </class>
+
+    <class name="Address" table="T_ANY_ADDRESS">
+        <id name="id" column="ID_">
+            <generator class="increment" />
+        </id>
+        <set name="lines" table="LINE">
+            <key column="ADDRESS" />
+            <element type="string" />
+        </set>
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/Person.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,37 @@
+package org.hibernate.test.any;
+
+/**
+ * todo: describe Person
+ *
+ * @author Steve Ebersole
+ */
+public class Person {
+	private Long id;
+	private String name;
+	private Object data;
+
+
+	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 Object getData() {
+		return data;
+	}
+
+	public void setData(Object data) {
+		this.data = data;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/Person.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/Properties.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/Properties.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/Properties.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,56 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.any">
+
+    <class name="PropertySet" table="T_PROP_SET">
+        <id name="id" column="ID" type="long">
+            <generator class="increment"/>
+        </id>
+        <property name="name" column="NAME" type="string"/>
+        <any name="someSpecificProperty" id-type="long" meta-type="string" cascade="all">
+            <meta-value value="I" class="IntegerPropertyValue"/>
+            <meta-value value="S" class="StringPropertyValue"/>
+            <meta-value value="C" class="ComplexPropertyValue" />
+            <column name="S_S_PROP_TYPE"/>
+            <column name="S_S_PROP_ID"/>
+        </any>
+        <map name="generalProperties" table="T_GEN_PROPS" lazy="true" cascade="all">
+            <key column="PROP_SET_ID"/>
+            <map-key type="string" column="GEN_PROP_NAME"/>
+            <many-to-any id-type="long" meta-type="string">
+                <meta-value value="I" class="IntegerPropertyValue"/>
+                <meta-value value="S" class="StringPropertyValue"/>
+                <column name="PROP_TYPE"/>
+                <column name="PROP_ID"/>
+            </many-to-any>
+        </map>
+    </class>
+
+    <class name="StringPropertyValue" table="T_CHAR_PROP">
+        <id name="id" column="ID" type="long">
+            <generator class="increment"/>
+        </id>
+        <property name="value" column="VAL" not-null="true" type="string"/>
+    </class>
+
+    <class name="IntegerPropertyValue" table="T_NUM_PROP">
+        <id name="id" column="ID" type="long">
+            <generator class="increment"/>
+        </id>
+        <property name="value" column="VAL" not-null="true" type="integer"/>
+    </class>
+
+    <class name="ComplexPropertyValue" table="T_COMPLEX_PROP">
+        <id name="id" column="ID" type="long">
+            <generator class="increment"/>
+        </id>
+        <map name="subProperties" table="T_COMPLEX_SUB_PROPS" lazy="true">
+            <key column="PROP_ID" />
+            <map-key type="string" column="SUB_PROP_NAME" />
+            <element type="string" column="SUB_PROP_VAL" />
+        </map>
+    </class>
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/Properties.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/PropertySet.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/PropertySet.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/PropertySet.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,55 @@
+package org.hibernate.test.any;
+
+import java.util.Map;
+import java.util.HashMap;
+
+/**
+ * todo: describe PropertySet
+ *
+ * @author Steve Ebersole
+ */
+public class PropertySet {
+	private Long id;
+	private String name;
+	private PropertyValue someSpecificProperty;
+	private Map generalProperties = new HashMap();
+
+	public PropertySet() {
+	}
+
+	public PropertySet(String name) {
+		this.name = name;
+	}
+
+	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 PropertyValue getSomeSpecificProperty() {
+		return someSpecificProperty;
+	}
+
+	public void setSomeSpecificProperty(PropertyValue someSpecificProperty) {
+		this.someSpecificProperty = someSpecificProperty;
+	}
+
+	public Map getGeneralProperties() {
+		return generalProperties;
+	}
+
+	public void setGeneralProperties(Map generalProperties) {
+		this.generalProperties = generalProperties;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/PropertySet.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/PropertyValue.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/PropertyValue.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/PropertyValue.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,10 @@
+package org.hibernate.test.any;
+
+/**
+ * todo: describe PropertyValue
+ *
+ * @author Steve Ebersole
+ */
+public interface PropertyValue {
+	public String asString();
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/PropertyValue.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/StringPropertyValue.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/StringPropertyValue.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/StringPropertyValue.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,38 @@
+package org.hibernate.test.any;
+
+/**
+ * todo: describe StringPropertyValue
+ *
+ * @author Steve Ebersole
+ */
+public class StringPropertyValue implements PropertyValue {
+	private Long id;
+	private String value;
+
+	public StringPropertyValue() {
+	}
+
+	public StringPropertyValue(String value) {
+		this.value = value;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getValue() {
+		return value;
+	}
+
+	public void setValue(String value) {
+		this.value = value;
+	}
+
+	public String asString() {
+		return value;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/any/StringPropertyValue.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/array/A.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/array/A.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/array/A.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,38 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+  This mapping demonstrates content-based discrimination for the
+  table-per-hierarchy mapping strategy, using a formula
+  discriminator.
+
+-->
+
+<hibernate-mapping 
+	package="org.hibernate.test.array">
+	
+	<class name="A" lazy="true" table="aaa">
+		
+		<id name="id">
+			<generator class="native"/>
+		</id>
+
+		<array name="bs" cascade="all" fetch="join">
+			<key column="a_id"/>
+			<list-index column="idx"/>
+			<one-to-many class="B"/>
+		</array>
+
+	</class>
+
+	<class name="B" lazy="true" table="bbb">
+		<id name="id">
+			<generator class="native"/>
+		</id>
+	</class>
+
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/array/A.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/array/A.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/array/A.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/array/A.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,26 @@
+//$Id: A.java 6527 2005-04-26 16:58:52Z oneovthafew $
+package org.hibernate.test.array;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class A {
+	private Integer id;
+	private B[] bs;
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public B[] getBs() {
+		return bs;
+	}
+
+	public void setBs(B[] bs) {
+		this.bs = bs;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/array/A.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/array/ArrayTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/array/ArrayTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/array/ArrayTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,53 @@
+//$Id: ArrayTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.array;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ArrayTest extends FunctionalTestCase {
+
+	public ArrayTest(String x) {
+		super( x );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "array/A.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( ArrayTest.class );
+	}
+
+	public void testArrayJoinFetch() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		A a = new A();
+		B b = new B();
+		a.setBs( new B[] {b} );
+		s.persist( a );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		a = (A) s.get( A.class, a.getId() );
+		assertNotNull( a );
+		assertNotNull( a.getBs() );
+		assertEquals( a.getBs().length, 1 );
+		assertNotNull( a.getBs()[0] );
+		
+		s.delete(a);
+		s.delete(a.getBs()[0]);
+		tx.commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/array/ArrayTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/array/B.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/array/B.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/array/B.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,17 @@
+//$Id: B.java 6527 2005-04-26 16:58:52Z oneovthafew $
+package org.hibernate.test.array;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class B {
+	private Integer id;
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/array/B.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ast/ASTIteratorTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ast/ASTIteratorTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ast/ASTIteratorTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,120 @@
+// $Id: ASTIteratorTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.ast;
+
+import java.io.PrintWriter;
+
+import antlr.ASTFactory;
+import antlr.collections.AST;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.hibernate.hql.antlr.HqlTokenTypes;
+import org.hibernate.hql.ast.HqlParser;
+import org.hibernate.hql.ast.util.ASTIterator;
+import org.hibernate.hql.ast.util.ASTParentsFirstIterator;
+import org.hibernate.hql.ast.util.ASTPrinter;
+import org.hibernate.hql.ast.util.ASTUtil;
+import org.hibernate.testing.junit.UnitTestCase;
+
+/**
+ * Test ASTIterator.
+ */
+public class ASTIteratorTest extends UnitTestCase {
+	private ASTFactory factory;
+
+	/**
+	 * Standard JUnit test case constructor.
+	 *
+	 * @param name The name of the test case.
+	 */
+	public ASTIteratorTest(String name) {
+		super( name );
+	}
+
+	public static Test suite() {
+		return new TestSuite( ASTIteratorTest.class );
+	}
+
+	protected void setUp() throws Exception {
+		super.setUp();
+		factory = new ASTFactory();
+	}
+
+	/**
+	 * Test a simple tree, make sure the iterator encounters every node.
+	 */
+	public void testSimpleTree() throws Exception {
+		String input = "select foo from foo in class org.hibernate.test.Foo, fee in class org.hibernate.test.Fee where foo.dependent = fee order by foo.string desc, foo.component.count asc, fee.id";
+		HqlParser parser = HqlParser.getInstance( input );
+		parser.statement();
+		AST ast = parser.getAST();
+		ASTPrinter printer = new ASTPrinter( HqlTokenTypes.class );
+		printer.showAst( ast, new PrintWriter( System.out ) );
+		ASTIterator iterator = new ASTIterator( ast );
+		int count = 0;
+		while ( iterator.hasNext() ) {
+			assertTrue( iterator.next() instanceof AST );
+			count++;
+		}
+		assertEquals( 43, count );
+
+		UnsupportedOperationException uoe = null;
+		try {
+			iterator.remove();
+		}
+		catch ( UnsupportedOperationException e ) {
+			uoe = e;
+		}
+		assertNotNull( uoe );
+	}
+
+	public void testParentsFirstIterator() throws Exception {
+		AST[] tree = new AST[4];
+		AST grandparent = tree[0] = ASTUtil.create( factory, 1, "grandparent" );
+		AST parent = tree[1] = ASTUtil.create( factory, 2, "parent" );
+		AST child = tree[2] = ASTUtil.create( factory, 3, "child" );
+		AST baby = tree[3] = ASTUtil.create( factory, 4, "baby" );
+		AST t = ASTUtil.createTree( factory, tree );
+		AST brother = ASTUtil.create( factory, 10, "brother" );
+		child.setNextSibling( brother );
+		AST sister = ASTUtil.create( factory, 11, "sister" );
+		brother.setNextSibling( sister );
+		AST uncle = factory.make( new AST[]{
+			factory.create( 20, "uncle" ),
+			factory.create( 21, "cousin1" ),
+			factory.create( 22, "cousin2" ),
+			factory.create( 23, "cousin3" )} );
+		parent.setNextSibling( uncle );
+		System.out.println( t.toStringTree() );
+
+		System.out.println( "--- ASTParentsFirstIterator ---" );
+		ASTParentsFirstIterator iter = new ASTParentsFirstIterator( t );
+		int count = 0;
+		while ( iter.hasNext() ) {
+			AST n = iter.nextNode();
+			count++;
+			System.out.println( n );
+		}
+		assertEquals( 10, count );
+
+		System.out.println( "--- ASTIterator ---" );
+		ASTIterator iter2 = new ASTIterator( t );
+		int count2 = 0;
+		while ( iter2.hasNext() ) {
+			AST n = iter2.nextNode();
+			count2++;
+			System.out.println( n );
+		}
+		assertEquals( 10, count2 );
+
+		System.out.println( "--- ASTParentsFirstIterator (parent) ---" );
+		ASTParentsFirstIterator iter3 = new ASTParentsFirstIterator( parent );
+		int count3 = 0;
+		while ( iter3.hasNext() ) {
+			AST n = iter3.nextNode();
+			count3++;
+			System.out.println( n );
+		}
+		assertEquals( 5, count3 );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ast/ASTIteratorTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ast/ASTUtilTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ast/ASTUtilTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ast/ASTUtilTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,77 @@
+// $Id: ASTUtilTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.ast;
+
+import antlr.ASTFactory;
+import antlr.collections.AST;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.hibernate.hql.ast.util.ASTUtil;
+import org.hibernate.testing.junit.UnitTestCase;
+
+/**
+ * Unit test for ASTUtil.
+ */
+public class ASTUtilTest extends UnitTestCase {
+	private ASTFactory factory;
+
+	/**
+	 * Standard JUnit test case constructor.
+	 *
+	 * @param name The name of the test case.
+	 */
+	public ASTUtilTest(String name) {
+		super( name );
+	}
+
+	protected void setUp() throws Exception {
+		super.setUp();
+		factory = new ASTFactory();
+	}
+
+	public void testCreate() throws Exception {
+		AST n = ASTUtil.create( factory, 1, "one");
+		assertNull( n.getFirstChild() );
+		assertEquals("one",n.getText());
+		assertEquals(1,n.getType());
+	}
+	/**
+	 * Test adding a tree of children.
+	 */
+	public void testCreateTree() throws Exception {
+		AST[] tree = new AST[4];
+		AST grandparent = tree[0] = ASTUtil.create(factory, 1, "grandparent");
+		AST parent = tree[1] = ASTUtil.create(factory,2,"parent");
+		AST child = tree[2] = ASTUtil.create(factory,3,"child");
+		AST baby = tree[3] = ASTUtil.create(factory,4,"baby");
+		AST t = ASTUtil.createTree( factory, tree);
+		assertSame(t,grandparent);
+		assertSame(parent,t.getFirstChild());
+		assertSame(child,t.getFirstChild().getFirstChild());
+		assertSame(baby,t.getFirstChild().getFirstChild().getFirstChild());
+	}
+
+	public void testFindPreviousSibling() throws Exception {
+		AST child1 = ASTUtil.create(factory,2, "child1");
+		AST child2 = ASTUtil.create(factory,3, "child2");
+		AST n = factory.make( new AST[] {
+			ASTUtil.create(factory, 1, "parent"),
+			child1,
+			child2,
+		});
+		assertSame(child1,ASTUtil.findPreviousSibling( n,child2));
+		Exception e = null;
+		try {
+			ASTUtil.findPreviousSibling(child1,null);
+		}
+		catch (Exception x) {
+			e = x;
+		}
+		assertNotNull(e);
+	}
+
+	public static Test suite() {
+		return new TestSuite( ASTUtilTest.class );
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ast/ASTUtilTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batch/BatchTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batch/BatchTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batch/BatchTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,89 @@
+//$Id: BatchTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.batch;
+
+import java.math.BigDecimal;
+
+import junit.framework.Test;
+
+import org.hibernate.CacheMode;
+import org.hibernate.ScrollMode;
+import org.hibernate.ScrollableResults;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+
+/**
+ * This is how to do batch processing in Hibernate.
+ * Remember to enable JDBC batch updates, or this
+ * test will take a Very Long Time!
+ *
+ * @author Gavin King
+ */
+public class BatchTest extends FunctionalTestCase {
+
+	public BatchTest(String str) {
+		super( str );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "batch/DataPoint.hbm.xml" };
+	}
+
+	public String getCacheConcurrencyStrategy() {
+		return null;
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setProperty( Environment.STATEMENT_BATCH_SIZE, "20" );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( BatchTest.class );
+	}
+
+	public void testBatchInsertUpdate() {
+		long start = System.currentTimeMillis();
+		final int N = 5000; //26 secs with batch flush, 26 without
+		//final int N = 100000; //53 secs with batch flush, OOME without
+		//final int N = 250000; //137 secs with batch flush, OOME without
+
+		Session s = openSession();
+		s.setCacheMode( CacheMode.IGNORE );
+		Transaction t = s.beginTransaction();
+		for ( int i = 0; i < N; i++ ) {
+			DataPoint dp = new DataPoint();
+			dp.setX( new BigDecimal( i * 0.1d ).setScale( 19, BigDecimal.ROUND_DOWN ) );
+			dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale( 19, BigDecimal.ROUND_DOWN ) );
+			s.save( dp );
+			if ( i % 20 == 0 ) {
+				s.flush();
+				s.clear();
+			}
+		}
+		t.commit();
+		s.close();
+
+		s = openSession();
+		s.setCacheMode( CacheMode.IGNORE );
+		t = s.beginTransaction();
+		int i = 0;
+		ScrollableResults sr = s.createQuery( "from DataPoint dp order by dp.x asc" )
+				.scroll( ScrollMode.FORWARD_ONLY );
+		while ( sr.next() ) {
+			DataPoint dp = ( DataPoint ) sr.get( 0 );
+			dp.setDescription( "done!" );
+			if ( ++i % 20 == 0 ) {
+				s.flush();
+				s.clear();
+			}
+		}
+		t.commit();
+		s.close();
+		System.out.println( System.currentTimeMillis() - start );
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batch/BatchTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batch/DataPoint.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batch/DataPoint.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batch/DataPoint.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping 
+	package="org.hibernate.test.batch">
+
+	<class name="DataPoint" 
+		dynamic-update="true">
+		<!--rowid="rowid"--> <!-- remove this if not oracle -->
+		<id name="id">
+			<generator class="increment"/>
+		</id>
+		<property name="x">
+			<column name="xval" not-null="true" length="4" unique-key="xy"/>
+		</property>
+		<property name="y">
+			<column name="yval" not-null="true" length="4" unique-key="xy"/>
+		</property>
+		<property name="description"/>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batch/DataPoint.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batch/DataPoint.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batch/DataPoint.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batch/DataPoint.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,62 @@
+//$Id: DataPoint.java 4343 2004-08-16 11:46:19Z oneovthafew $
+package org.hibernate.test.batch;
+
+import java.math.BigDecimal;
+
+/**
+ * @author Gavin King
+ */
+public class DataPoint {
+	private long id;
+	private BigDecimal x;
+	private BigDecimal y;
+	private String description;
+	/**
+	 * @return Returns the description.
+	 */
+	public String getDescription() {
+		return description;
+	}
+	/**
+	 * @param description The description to set.
+	 */
+	public void setDescription(String description) {
+		this.description = description;
+	}
+	/**
+	 * @return Returns the id.
+	 */
+	public long getId() {
+		return id;
+	}
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(long id) {
+		this.id = id;
+	}
+	/**
+	 * @return Returns the x.
+	 */
+	public BigDecimal getX() {
+		return x;
+	}
+	/**
+	 * @param x The x to set.
+	 */
+	public void setX(BigDecimal x) {
+		this.x = x;
+	}
+	/**
+	 * @return Returns the y.
+	 */
+	public BigDecimal getY() {
+		return y;
+	}
+	/**
+	 * @param y The y to set.
+	 */
+	public void setY(BigDecimal y) {
+		this.y = y;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batch/DataPoint.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batchfetch/BatchFetchTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batchfetch/BatchFetchTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batchfetch/BatchFetchTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,122 @@
+//$Id: BatchFetchTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.batchfetch;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class BatchFetchTest extends FunctionalTestCase {
+
+	public BatchFetchTest(String str) {
+		super( str );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "batchfetch/ProductLine.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( BatchFetchTest.class );
+	}
+
+	public void testBatchFetch() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		ProductLine cars = new ProductLine();
+		cars.setDescription( "Cars" );
+		Model monaro = new Model( cars );
+		monaro.setName( "monaro" );
+		monaro.setDescription( "Holden Monaro" );
+		Model hsv = new Model( cars );
+		hsv.setName( "hsv" );
+		hsv.setDescription( "Holden Commodore HSV" );
+		s.save( cars );
+
+		ProductLine oss = new ProductLine();
+		oss.setDescription( "OSS" );
+		Model jboss = new Model( oss );
+		jboss.setName( "JBoss" );
+		jboss.setDescription( "JBoss Application Server" );
+		Model hibernate = new Model( oss );
+		hibernate.setName( "Hibernate" );
+		hibernate.setDescription( "Hibernate" );
+		Model cache = new Model( oss );
+		cache.setName( "JBossCache" );
+		cache.setDescription( "JBoss TreeCache" );
+		s.save( oss );
+
+		t.commit();
+		s.close();
+
+		s.getSessionFactory().evict( Model.class );
+		s.getSessionFactory().evict( ProductLine.class );
+
+		s = openSession();
+		t = s.beginTransaction();
+
+		List list = s.createQuery( "from ProductLine pl order by pl.description" ).list();
+		cars = ( ProductLine ) list.get( 0 );
+		oss = ( ProductLine ) list.get( 1 );
+		assertFalse( Hibernate.isInitialized( cars.getModels() ) );
+		assertFalse( Hibernate.isInitialized( oss.getModels() ) );
+		assertEquals( cars.getModels().size(), 2 ); //fetch both collections
+		assertTrue( Hibernate.isInitialized( cars.getModels() ) );
+		assertTrue( Hibernate.isInitialized( oss.getModels() ) );
+
+		s.clear();
+
+		list = s.createQuery( "from Model m" ).list();
+		hibernate = ( Model ) s.get( Model.class, hibernate.getId() );
+		hibernate.getProductLine().getId();
+		for ( Iterator i = list.iterator(); i.hasNext(); ) {
+			assertFalse( Hibernate.isInitialized( ( ( Model ) i.next() ).getProductLine() ) );
+		}
+		assertEquals( hibernate.getProductLine().getDescription(), "OSS" ); //fetch both productlines
+
+		s.clear();
+
+		Iterator iter = s.createQuery( "from Model" ).iterate();
+		list = new ArrayList();
+		while ( iter.hasNext() ) {
+			list.add( iter.next() );
+		}
+		Model m = ( Model ) list.get( 0 );
+		m.getDescription(); //fetch a batch of 4
+
+		s.clear();
+
+		list = s.createQuery( "from ProductLine" ).list();
+		ProductLine pl = ( ProductLine ) list.get( 0 );
+		ProductLine pl2 = ( ProductLine ) list.get( 1 );
+		s.evict( pl2 );
+		pl.getModels().size(); //fetch just one collection! (how can we write an assertion for that??)
+
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		list = s.createQuery( "from ProductLine pl order by pl.description" ).list();
+		cars = ( ProductLine ) list.get( 0 );
+		oss = ( ProductLine ) list.get( 1 );
+		assertEquals( cars.getModels().size(), 2 );
+		assertEquals( oss.getModels().size(), 3 );
+		s.delete( cars );
+		s.delete( oss );
+		t.commit();
+		s.close();
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batchfetch/BatchFetchTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batchfetch/Model.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batchfetch/Model.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batchfetch/Model.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,44 @@
+//$Id: Model.java 4460 2004-08-29 12:04:14Z oneovthafew $
+package org.hibernate.test.batchfetch;
+
+/**
+ * @author Gavin King
+ */
+public class Model {
+	private String id;
+	private String name;
+	private String description;
+	private ProductLine productLine;
+	
+	Model() {}
+	
+	public Model(ProductLine pl) {
+		this.productLine = pl;
+		pl.getModels().add(this);
+	}
+	
+	public String getDescription() {
+		return description;
+	}
+	public void setDescription(String description) {
+		this.description = description;
+	}
+	public String getId() {
+		return id;
+	}
+	public void setId(String id) {
+		this.id = id;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public ProductLine getProductLine() {
+		return productLine;
+	}
+	public void setProductLine(ProductLine productLine) {
+		this.productLine = productLine;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batchfetch/Model.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batchfetch/ProductLine.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batchfetch/ProductLine.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batchfetch/ProductLine.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,61 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.batchfetch">
+
+<!-- 
+
+  This mapping demonstrates the use of batch fetching
+  for collections and entities.
+     
+-->
+
+    <class name="ProductLine" 
+    		batch-size="64">
+    
+    	<id name="id" 
+    		column="productId" 
+    		length="32">
+    		<generator class="uuid.hex"/>
+    	</id>
+    	
+    	<property name="description" 
+    		not-null="true" 
+    		length="200"/>
+    	
+    	<set name="models" 
+    			batch-size="64"
+    			cascade="all"
+    			inverse="true">
+    		<key column="productId"/>
+    		<one-to-many class="Model"/>
+    	</set>
+    	
+	</class>
+
+    <class name="Model" 
+    		batch-size="64">
+    
+    	<id name="id" 
+    		column="modelId" 
+    		length="32">
+    		<generator class="uuid.hex"/>
+    	</id>
+    	
+    	<property name="name"
+    		not-null="true"
+    		length="25"/>
+    		
+    	<property name="description" 
+    		not-null="true" 
+    		length="200"/>
+    	
+    	<many-to-one name="productLine" 
+    		column="productId"
+    		not-null="true"/>
+    	
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batchfetch/ProductLine.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batchfetch/ProductLine.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batchfetch/ProductLine.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batchfetch/ProductLine.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,34 @@
+//$Id: ProductLine.java 4460 2004-08-29 12:04:14Z oneovthafew $
+package org.hibernate.test.batchfetch;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author Gavin King
+ */
+public class ProductLine {
+
+	private String id;
+	private String description;
+	private Set models = new HashSet();
+	
+	public String getDescription() {
+		return description;
+	}
+	public void setDescription(String description) {
+		this.description = description;
+	}
+	public String getId() {
+		return id;
+	}
+	public void setId(String id) {
+		this.id = id;
+	}
+	public Set getModels() {
+		return models;
+	}
+	public void setModels(Set models) {
+		this.models = models;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/batchfetch/ProductLine.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bidi/Auction.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bidi/Auction.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bidi/Auction.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,45 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping 
+	package="org.hibernate.test.bidi">
+
+	<class name="Auction" table="TAuction">
+		<id name="id">
+			<generator class="native"/>
+		</id>
+		<property name="description"/>
+		<property name="end" column="endDatetime"/>
+		<bag name="bids" inverse="true" 
+				cascade="persist">
+			<key column="auctionId"/>
+			<one-to-many class="Bid"/>
+		</bag>
+		<one-to-one name="successfulBid" 
+				property-ref="abc">
+			<formula>id</formula>
+			<formula>1</formula>
+		</one-to-one>
+	</class>
+	
+	<class name="Bid" table="TBid">
+		<id name="id">
+			<generator class="native"/>
+		</id>
+		<property name="amount" 
+				scale="19" 
+				precision="31" />
+		<property name="datetime" 
+				column="createdDatetime"/>
+		<properties name="abc">
+			<many-to-one name="item" 
+					column="auctionId" 
+					cascade="persist"/>
+			<property name="successful" 
+					column="success"/>
+		</properties>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bidi/Auction.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bidi/Auction.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bidi/Auction.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bidi/Auction.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,48 @@
+//$Id: Auction.java 5733 2005-02-14 15:56:06Z oneovthafew $
+package org.hibernate.test.bidi;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author Gavin King
+ */
+public class Auction {
+	private Long id;
+	private String description;
+	private List bids = new ArrayList();
+	private Bid successfulBid;
+	private Date end;
+	
+	public Date getEnd() {
+		return end;
+	}
+	public void setEnd(Date end) {
+		this.end = end;
+	}
+	public List getBids() {
+		return bids;
+	}
+	public void setBids(List bids) {
+		this.bids = bids;
+	}
+	public String getDescription() {
+		return description;
+	}
+	public void setDescription(String description) {
+		this.description = description;
+	}
+	public Long getId() {
+		return id;
+	}
+	public void setId(Long id) {
+		this.id = id;
+	}
+	public Bid getSuccessfulBid() {
+		return successfulBid;
+	}
+	public void setSuccessfulBid(Bid successfulBid) {
+		this.successfulBid = successfulBid;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bidi/Auction.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bidi/Auction2.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bidi/Auction2.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bidi/Auction2.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,38 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping 
+	package="org.hibernate.test.bidi">
+
+	<class name="Auction" table="TAuction2">
+		<id name="id">
+			<generator class="native"/>
+		</id>
+		<property name="description"/>
+		<property name="end" column="endDatetime"/>
+		<bag name="bids" inverse="true" 
+				cascade="persist">
+			<key column="auctionId"/>
+			<one-to-many class="Bid"/>
+		</bag>
+		<many-to-one name="successfulBid"/>
+	</class>
+	
+	<class name="Bid" table="TBid2">
+		<id name="id">
+			<generator class="native"/>
+		</id>
+		<property name="amount" scale="19" precision="31"/>
+		<property name="datetime" 
+				column="createdDatetime"/>
+		<many-to-one name="item" 
+				column="auctionId" 
+				cascade="persist"/>
+		<property name="successful">
+			<formula>exists(select a.id from TAuction2 a where a.successfulBid=id)</formula>
+		</property>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bidi/Auction2.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bidi/AuctionTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bidi/AuctionTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bidi/AuctionTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,119 @@
+//$Id: AuctionTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.bidi;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.dialect.PostgreSQLDialect;
+
+/**
+ * @author Gavin King
+ */
+public class AuctionTest extends FunctionalTestCase {
+
+	public AuctionTest(String str) {
+		super( str );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "bidi/Auction.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( AuctionTest.class );
+	}
+
+	public void testLazy() {
+		if ( getDialect() instanceof PostgreSQLDialect ) {
+			return; //doesn't like boolean=1
+		}
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Auction a = new Auction();
+		a.setDescription( "an auction for something" );
+		a.setEnd( new Date() );
+		Bid b = new Bid();
+		b.setAmount( new BigDecimal( 123.34 ).setScale( 19, BigDecimal.ROUND_DOWN ) );
+		b.setSuccessful( true );
+		b.setDatetime( new Date() );
+		b.setItem( a );
+		a.getBids().add( b );
+		a.setSuccessfulBid( b );
+		s.persist( b );
+		t.commit();
+		s.close();
+
+		Long aid = a.getId();
+		Long bid = b.getId();
+
+		s = openSession();
+		t = s.beginTransaction();
+		b = ( Bid ) s.load( Bid.class, bid );
+		assertFalse( Hibernate.isInitialized( b ) );
+		a = ( Auction ) s.get( Auction.class, aid );
+		assertFalse( Hibernate.isInitialized( a.getBids() ) );
+		assertTrue( Hibernate.isInitialized( a.getSuccessfulBid() ) );
+		assertSame( a.getBids().iterator().next(), b );
+		assertSame( b, a.getSuccessfulBid() );
+		assertTrue( Hibernate.isInitialized( b ) );
+		assertTrue( b.isSuccessful() );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		b = ( Bid ) s.load( Bid.class, bid );
+		assertFalse( Hibernate.isInitialized( b ) );
+		a = ( Auction ) s.createQuery( "from Auction a left join fetch a.bids" ).uniqueResult();
+		assertTrue( Hibernate.isInitialized( b ) );
+		assertTrue( Hibernate.isInitialized( a.getBids() ) );
+		assertSame( b, a.getSuccessfulBid() );
+		assertSame( a.getBids().iterator().next(), b );
+		assertTrue( b.isSuccessful() );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		b = ( Bid ) s.load( Bid.class, bid );
+		a = ( Auction ) s.load( Auction.class, aid );
+		assertFalse( Hibernate.isInitialized( b ) );
+		assertFalse( Hibernate.isInitialized( a ) );
+		s.createQuery( "from Auction a left join fetch a.successfulBid" ).list();
+		assertTrue( Hibernate.isInitialized( b ) );
+		assertTrue( Hibernate.isInitialized( a ) );
+		assertSame( b, a.getSuccessfulBid() );
+		assertFalse( Hibernate.isInitialized( a.getBids() ) );
+		assertSame( a.getBids().iterator().next(), b );
+		assertTrue( b.isSuccessful() );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		b = ( Bid ) s.load( Bid.class, bid );
+		a = ( Auction ) s.load( Auction.class, aid );
+		assertFalse( Hibernate.isInitialized( b ) );
+		assertFalse( Hibernate.isInitialized( a ) );
+		assertSame( s.get( Bid.class, bid ), b );
+		assertTrue( Hibernate.isInitialized( b ) );
+		assertSame( s.get( Auction.class, aid ), a );
+		assertTrue( Hibernate.isInitialized( a ) );
+		assertSame( b, a.getSuccessfulBid() );
+		assertFalse( Hibernate.isInitialized( a.getBids() ) );
+		assertSame( a.getBids().iterator().next(), b );
+		assertTrue( b.isSuccessful() );
+		t.commit();
+		s.close();
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bidi/AuctionTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bidi/AuctionTest2.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bidi/AuctionTest2.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bidi/AuctionTest2.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,122 @@
+//$Id: AuctionTest2.java 10981 2006-12-13 00:14:17Z steve.ebersole at jboss.com $
+package org.hibernate.test.bidi;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+import junit.framework.Test;
+
+/**
+ * @author Gavin King
+ */
+public class AuctionTest2 extends FunctionalTestCase {
+
+	public AuctionTest2(String str) {
+		super( str );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "bidi/Auction2.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( AuctionTest2.class );
+	}
+
+	public boolean createSchema() {
+		return getDialect().supportsExistsInSelect();
+	}
+
+	public void testLazy() {
+		if ( ! getDialect().supportsExistsInSelect() ) {
+			reportSkip( "dialect does not support exist fragments in the select clause", "bidi support" );
+			return;
+		}
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Auction a = new Auction();
+		a.setDescription( "an auction for something" );
+		a.setEnd( new Date() );
+		Bid b = new Bid();
+		b.setAmount( new BigDecimal( 123.34 ).setScale( 19, BigDecimal.ROUND_DOWN ) );
+		b.setSuccessful( true );
+		b.setDatetime( new Date() );
+		b.setItem( a );
+		a.getBids().add( b );
+		a.setSuccessfulBid( b );
+		s.persist( b );
+		t.commit();
+		s.close();
+
+		Long aid = a.getId();
+		Long bid = b.getId();
+
+		s = openSession();
+		t = s.beginTransaction();
+		b = ( Bid ) s.load( Bid.class, bid );
+		assertFalse( Hibernate.isInitialized( b ) );
+		a = ( Auction ) s.get( Auction.class, aid );
+		assertFalse( Hibernate.isInitialized( a.getBids() ) );
+		assertFalse( Hibernate.isInitialized( a.getSuccessfulBid() ) );
+		assertSame( a.getBids().iterator().next(), b );
+		assertSame( b, a.getSuccessfulBid() );
+		assertTrue( Hibernate.isInitialized( b ) );
+		assertTrue( b.isSuccessful() );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		b = ( Bid ) s.load( Bid.class, bid );
+		assertFalse( Hibernate.isInitialized( b ) );
+		a = ( Auction ) s.createQuery( "from Auction a left join fetch a.bids" ).uniqueResult();
+		assertTrue( Hibernate.isInitialized( b ) );
+		assertTrue( Hibernate.isInitialized( a.getBids() ) );
+		assertSame( b, a.getSuccessfulBid() );
+		assertSame( a.getBids().iterator().next(), b );
+		assertTrue( b.isSuccessful() );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		b = ( Bid ) s.load( Bid.class, bid );
+		a = ( Auction ) s.load( Auction.class, aid );
+		assertFalse( Hibernate.isInitialized( b ) );
+		assertFalse( Hibernate.isInitialized( a ) );
+		s.createQuery( "from Auction a left join fetch a.successfulBid" ).list();
+		assertTrue( Hibernate.isInitialized( b ) );
+		assertTrue( Hibernate.isInitialized( a ) );
+		assertSame( b, a.getSuccessfulBid() );
+		assertFalse( Hibernate.isInitialized( a.getBids() ) );
+		assertSame( a.getBids().iterator().next(), b );
+		assertTrue( b.isSuccessful() );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		b = ( Bid ) s.load( Bid.class, bid );
+		a = ( Auction ) s.load( Auction.class, aid );
+		assertFalse( Hibernate.isInitialized( b ) );
+		assertFalse( Hibernate.isInitialized( a ) );
+		assertSame( s.get( Bid.class, bid ), b );
+		assertTrue( Hibernate.isInitialized( b ) );
+		assertSame( s.get( Auction.class, aid ), a );
+		assertTrue( Hibernate.isInitialized( a ) );
+		assertSame( b, a.getSuccessfulBid() );
+		assertFalse( Hibernate.isInitialized( a.getBids() ) );
+		assertSame( a.getBids().iterator().next(), b );
+		assertTrue( b.isSuccessful() );
+		t.commit();
+		s.close();
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bidi/AuctionTest2.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bidi/Bid.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bidi/Bid.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bidi/Bid.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,47 @@
+//$Id: Bid.java 5733 2005-02-14 15:56:06Z oneovthafew $
+package org.hibernate.test.bidi;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author Gavin King
+ */
+public class Bid {
+	private Long id;
+	private Auction item;
+	private BigDecimal amount;
+	private boolean successful;
+	private Date datetime; 
+
+	public Long getId() {
+		return id;
+	}
+	public void setId(Long id) {
+		this.id = id;
+	}
+	public BigDecimal getAmount() {
+		return amount;
+	}
+	public void setAmount(BigDecimal amount) {
+		this.amount = amount;
+	}
+	public Auction getItem() {
+		return item;
+	}
+	public void setItem(Auction item) {
+		this.item = item;
+	}
+	public boolean isSuccessful() {
+		return successful;
+	}
+	public void setSuccessful(boolean successful) {
+		this.successful = successful;
+	}
+	public Date getDatetime() {
+		return datetime;
+	}
+	public void setDatetime(Date datetime) {
+		this.datetime = datetime;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bidi/Bid.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/Bean.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/Bean.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/Bean.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.bytecode">
+
+	<class name="Bean">
+		<id name="someString" type="string">
+			<generator class="assigned"/>
+		</id>
+        <property name="someLong" type="long" column="S_LONG_1" />
+        <property name="someInteger" type="int" column="S_INT_1" />
+        <property name="someDate" type="timestamp" column="S_DATE_1" />
+        <property name="somelong" type="long" column="S_LONG_2" />
+        <property name="someint" type="int" column="S_INT_2" />
+        <property name="someObject" type="serializable" column="S_OBJ_1" />
+	</class>
+
+
+	<class name="ProxyBean" lazy="true">
+		<id name="someString" type="string">
+			<generator class="assigned"/>
+		</id>
+		<property name="someLong" type="long" column="S_LONG_1" />
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/Bean.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/Bean.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/Bean.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/Bean.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,78 @@
+package org.hibernate.test.bytecode;
+
+import java.util.Date;
+import java.text.ParseException;
+
+/**
+ * @author Steve Ebersole
+ */
+public class Bean {
+	private String someString;
+	private Long someLong;
+	private Integer someInteger;
+	private Date someDate;
+	private long somelong;
+	private int someint;
+	private Object someObject;
+
+
+	public String getSomeString() {
+		return someString;
+	}
+
+	public void setSomeString(String someString) {
+		this.someString = someString;
+	}
+
+	public Long getSomeLong() {
+		return someLong;
+	}
+
+	public void setSomeLong(Long someLong) {
+		this.someLong = someLong;
+	}
+
+	public Integer getSomeInteger() {
+		return someInteger;
+	}
+
+	public void setSomeInteger(Integer someInteger) {
+		this.someInteger = someInteger;
+	}
+
+	public Date getSomeDate() {
+		return someDate;
+	}
+
+	public void setSomeDate(Date someDate) {
+		this.someDate = someDate;
+	}
+
+	public long getSomelong() {
+		return somelong;
+	}
+
+	public void setSomelong(long somelong) {
+		this.somelong = somelong;
+	}
+
+	public int getSomeint() {
+		return someint;
+	}
+
+	public void setSomeint(int someint) {
+		this.someint = someint;
+	}
+
+	public Object getSomeObject() {
+		return someObject;
+	}
+
+	public void setSomeObject(Object someObject) {
+		this.someObject = someObject;
+	}
+
+	public void throwException() throws ParseException {
+		throw new ParseException( "you asked for it...", 0 );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/Bean.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/BeanReflectionHelper.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/BeanReflectionHelper.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/BeanReflectionHelper.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,78 @@
+package org.hibernate.test.bytecode;
+
+import org.hibernate.property.BasicPropertyAccessor;
+import org.hibernate.property.Getter;
+import org.hibernate.property.Setter;
+
+import java.util.Date;
+
+/**
+ * @author Steve Ebersole
+ */
+public class BeanReflectionHelper {
+
+	public static final Object[] TEST_VALUES = new Object[] {
+			"hello", new Long(1), new Integer(1), new Date(), new Long(1), new Integer(1), new Object()
+	};
+
+	private static final String[] getterNames = new String[7];
+	private static final String[] setterNames = new String[7];
+	private static final Class[] types = new Class[7];
+
+	static {
+		BasicPropertyAccessor propertyAccessor = new BasicPropertyAccessor();
+		Getter getter = propertyAccessor.getGetter( Bean.class, "someString" );
+		Setter setter = propertyAccessor.getSetter( Bean.class, "someString" );
+		getterNames[0] = getter.getMethodName();
+		types[0] = getter.getReturnType();
+		setterNames[0] = setter.getMethodName();
+
+		getter = propertyAccessor.getGetter( Bean.class, "someLong" );
+		setter = propertyAccessor.getSetter( Bean.class, "someLong" );
+		getterNames[1] = getter.getMethodName();
+		types[1] = getter.getReturnType();
+		setterNames[1] = setter.getMethodName();
+
+		getter = propertyAccessor.getGetter( Bean.class, "someInteger" );
+		setter = propertyAccessor.getSetter( Bean.class, "someInteger" );
+		getterNames[2] = getter.getMethodName();
+		types[2] = getter.getReturnType();
+		setterNames[2] = setter.getMethodName();
+
+		getter = propertyAccessor.getGetter( Bean.class, "someDate" );
+		setter = propertyAccessor.getSetter( Bean.class, "someDate" );
+		getterNames[3] = getter.getMethodName();
+		types[3] = getter.getReturnType();
+		setterNames[3] = setter.getMethodName();
+
+		getter = propertyAccessor.getGetter( Bean.class, "somelong" );
+		setter = propertyAccessor.getSetter( Bean.class, "somelong" );
+		getterNames[4] = getter.getMethodName();
+		types[4] = getter.getReturnType();
+		setterNames[4] = setter.getMethodName();
+
+		getter = propertyAccessor.getGetter( Bean.class, "someint" );
+		setter = propertyAccessor.getSetter( Bean.class, "someint" );
+		getterNames[5] = getter.getMethodName();
+		types[5] = getter.getReturnType();
+		setterNames[5] = setter.getMethodName();
+
+		getter = propertyAccessor.getGetter( Bean.class, "someObject" );
+		setter = propertyAccessor.getSetter( Bean.class, "someObject" );
+		getterNames[6] = getter.getMethodName();
+		types[6] = getter.getReturnType();
+		setterNames[6] = setter.getMethodName();
+	}
+
+	public static String[] getGetterNames() {
+		return getterNames;
+	}
+
+	public static String[] getSetterNames() {
+		return setterNames;
+	}
+
+	public static Class[] getTypes() {
+		return types;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/BeanReflectionHelper.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/ProxyBean.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/ProxyBean.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/ProxyBean.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,31 @@
+package org.hibernate.test.bytecode;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: Paul
+ * Date: Mar 9, 2007
+ * Time: 11:31:40 AM
+ * To change this template use File | Settings | File Templates.
+ */
+public class ProxyBean {
+	private String someString;
+	private long someLong;
+
+
+	public String getSomeString() {
+		return someString;
+	}
+
+	public void setSomeString(String someString) {
+		this.someString = someString;
+	}
+
+
+	public long getSomeLong() {
+		return someLong;
+	}
+
+	public void setSomeLong(long someLong) {
+		this.someLong = someLong;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/ProxyBean.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/cglib/CGLIBThreadLocalTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/cglib/CGLIBThreadLocalTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/cglib/CGLIBThreadLocalTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,73 @@
+package org.hibernate.test.bytecode.cglib;
+
+import org.hibernate.cfg.*;
+import org.hibernate.*;
+import org.hibernate.proxy.*;
+import org.hibernate.test.bytecode.*;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+import junit.framework.*;
+
+import java.lang.reflect.*;
+
+
+/**
+ * Test that the static thread local callback object is cleared out of the proxy class after instantiated.
+ * This tests that the memory leak reported by HHH-2481 hasn't been re-introduced.
+ *
+ * @author Paul Malolepsy
+ */
+public class CGLIBThreadLocalTest extends FunctionalTestCase {
+	public CGLIBThreadLocalTest(String name) {
+		super(name);
+	}
+
+	public String[] getMappings() {
+		return new String[]{"bytecode/Bean.hbm.xml"};
+	}
+
+	public static TestSuite suite() {
+		return new FunctionalTestClassTestSuite(CGLIBThreadLocalTest.class);
+	}
+
+	public void testCglibClearing() {
+		if (!(Environment.getBytecodeProvider() instanceof org.hibernate.bytecode.cglib.BytecodeProviderImpl)) {
+			// because of the scoping :(
+			reportSkip("env not configured for cglib provider", "cglib thread local callback clearing");
+			return;
+		}
+
+		//create the object for the test
+		Session s = openSession();
+		s.beginTransaction();
+		ProxyBean proxyBean = new ProxyBean();
+		proxyBean.setSomeString("my-bean");
+		proxyBean.setSomeLong(1234);
+		s.save(proxyBean);
+		s.getTransaction().commit();
+		s.close();
+
+		// read the object as a proxy
+		s = openSession();
+		s.beginTransaction();
+		proxyBean = (ProxyBean) s.load(ProxyBean.class, proxyBean.getSomeString());
+		assertTrue(proxyBean instanceof HibernateProxy);
+		try {
+			//check that the static thread callbacks thread local has been cleared out
+			Field field = proxyBean.getClass().getDeclaredField("CGLIB$THREAD_CALLBACKS");
+			field.setAccessible(true);
+			ThreadLocal threadCallbacksThreadLocal = (ThreadLocal) field.get(null);
+			assertTrue(threadCallbacksThreadLocal.get() == null);
+		} catch (NoSuchFieldException e1) {
+			fail("unable to find CGLIB$THREAD_CALLBACKS field in proxy.");
+		} catch (Throwable t) {
+			fail("unexpected exception type : " + t);
+		} finally {
+			//clean up
+			s.delete(proxyBean);
+			s.getTransaction().commit();
+			s.close();
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/cglib/CGLIBThreadLocalTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/cglib/InvocationTargetExceptionTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/cglib/InvocationTargetExceptionTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/cglib/InvocationTargetExceptionTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,66 @@
+package org.hibernate.test.bytecode.cglib;
+
+import org.hibernate.test.bytecode.Bean;
+import org.hibernate.Session;
+import org.hibernate.Hibernate;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.cfg.Environment;
+
+import junit.framework.TestSuite;
+
+import java.text.ParseException;
+
+/**
+ * Test that the Javassist-based lazy initializer properly handles
+ * InvocationTargetExceptions
+ *
+ * @author Steve Ebersole
+ */
+public class InvocationTargetExceptionTest extends FunctionalTestCase {
+	public InvocationTargetExceptionTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "bytecode/Bean.hbm.xml" };
+	}
+
+	public static TestSuite suite() {
+		return new FunctionalTestClassTestSuite( InvocationTargetExceptionTest.class );
+	}
+
+	public void testProxiedInvocationException() {
+		if ( ! ( Environment.getBytecodeProvider() instanceof org.hibernate.bytecode.cglib.BytecodeProviderImpl ) ) {
+			// because of the scoping :(
+			reportSkip( "env not configured for cglib provider", "bytecode-provider InvocationTargetException handling" );
+			return;
+		}
+		Session s = openSession();
+		s.beginTransaction();
+		Bean bean = new Bean();
+		bean.setSomeString( "my-bean" );
+		s.save( bean );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		bean = ( Bean ) s.load( Bean.class, bean.getSomeString() );
+		assertFalse( Hibernate.isInitialized( bean ) );
+		try {
+			bean.throwException();
+			fail( "exception not thrown" );
+		}
+		catch ( ParseException e ) {
+			// expected behavior
+		}
+		catch( Throwable t ) {
+			fail( "unexpected exception type : " + t );
+		}
+
+		s.delete( bean );
+		s.getTransaction().commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/cglib/InvocationTargetExceptionTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/cglib/ReflectionOptimizerTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/cglib/ReflectionOptimizerTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/cglib/ReflectionOptimizerTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,52 @@
+package org.hibernate.test.bytecode.cglib;
+
+import junit.framework.TestSuite;
+
+import org.hibernate.bytecode.ReflectionOptimizer;
+import org.hibernate.bytecode.cglib.BytecodeProviderImpl;
+import org.hibernate.testing.junit.UnitTestCase;
+import org.hibernate.test.bytecode.Bean;
+import org.hibernate.test.bytecode.BeanReflectionHelper;
+
+/**
+ * @author Steve Ebersole
+ */
+public class ReflectionOptimizerTest extends UnitTestCase {
+
+	public ReflectionOptimizerTest(String string) {
+		super( string );
+	}
+
+	public void testReflectionOptimization() {
+		BytecodeProviderImpl provider = new BytecodeProviderImpl();
+		ReflectionOptimizer optimizer = provider.getReflectionOptimizer(
+				Bean.class,
+		        BeanReflectionHelper.getGetterNames(),
+		        BeanReflectionHelper.getSetterNames(),
+		        BeanReflectionHelper.getTypes()
+		);
+		assertNotNull( optimizer );
+		assertNotNull( optimizer.getInstantiationOptimizer() );
+		assertNotNull( optimizer.getAccessOptimizer() );
+
+		Object instance = optimizer.getInstantiationOptimizer().newInstance();
+		assertEquals( instance.getClass(), Bean.class );
+		Bean bean = ( Bean ) instance;
+
+		optimizer.getAccessOptimizer().setPropertyValues( bean, BeanReflectionHelper.TEST_VALUES );
+		assertEquals( bean.getSomeString(), BeanReflectionHelper.TEST_VALUES[0] );
+		Object[] values = optimizer.getAccessOptimizer().getPropertyValues( bean );
+		assertEquivalent( values, BeanReflectionHelper.TEST_VALUES );
+	}
+
+	private void assertEquivalent(Object[] checkValues, Object[] values) {
+		assertEquals( "Different lengths", checkValues.length, values.length );
+		for ( int i = 0; i < checkValues.length; i++ ) {
+			assertEquals( "different values at index [" + i + "]", checkValues[i], values[i] );
+		}
+	}
+
+	public static TestSuite suite() {
+		return new TestSuite( ReflectionOptimizerTest.class );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/cglib/ReflectionOptimizerTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/javassist/InvocationTargetExceptionTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/javassist/InvocationTargetExceptionTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/javassist/InvocationTargetExceptionTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,68 @@
+package org.hibernate.test.bytecode.javassist;
+
+import java.text.ParseException;
+
+import junit.framework.TestSuite;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.cfg.Environment;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.bytecode.Bean;
+
+/**
+ * Test that the Javassist-based lazy initializer properly handles
+ * InvocationTargetExceptions
+ *
+ * @author Steve Ebersole
+ */
+public class InvocationTargetExceptionTest extends FunctionalTestCase {
+	public InvocationTargetExceptionTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "bytecode/Bean.hbm.xml" };
+	}
+
+	public static TestSuite suite() {
+		return new FunctionalTestClassTestSuite( InvocationTargetExceptionTest.class );
+	}
+
+	public void testProxiedInvocationException() {
+		if ( !( Environment.getBytecodeProvider() instanceof org.hibernate.bytecode.javassist.BytecodeProviderImpl ) ) {
+			// because of the scoping :(
+			reportSkip(
+					"env not configured for javassist provider", "bytecode-provider InvocationTargetException handling"
+			);
+			return;
+		}
+		Session s = openSession();
+		s.beginTransaction();
+		Bean bean = new Bean();
+		bean.setSomeString( "my-bean" );
+		s.save( bean );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		bean = ( Bean ) s.load( Bean.class, bean.getSomeString() );
+		assertFalse( Hibernate.isInitialized( bean ) );
+		try {
+			bean.throwException();
+			fail( "exception not thrown" );
+		}
+		catch ( ParseException e ) {
+			// expected behavior
+		}
+		catch ( Throwable t ) {
+			fail( "unexpected exception type : " + t );
+		}
+
+		s.delete( bean );
+		s.getTransaction().commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/javassist/InvocationTargetExceptionTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/javassist/ReflectionOptimizerTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/javassist/ReflectionOptimizerTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/javassist/ReflectionOptimizerTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,52 @@
+package org.hibernate.test.bytecode.javassist;
+
+import junit.framework.TestSuite;
+
+import org.hibernate.bytecode.ReflectionOptimizer;
+import org.hibernate.bytecode.javassist.BytecodeProviderImpl;
+import org.hibernate.testing.junit.UnitTestCase;
+import org.hibernate.test.bytecode.Bean;
+import org.hibernate.test.bytecode.BeanReflectionHelper;
+
+/**
+ * @author Steve Ebersole
+ */
+public class ReflectionOptimizerTest extends UnitTestCase {
+
+	public ReflectionOptimizerTest(String string) {
+		super( string );
+	}
+
+	public void testReflectionOptimization() {
+		BytecodeProviderImpl provider = new BytecodeProviderImpl();
+		ReflectionOptimizer optimizer = provider.getReflectionOptimizer(
+				Bean.class,
+		        BeanReflectionHelper.getGetterNames(),
+		        BeanReflectionHelper.getSetterNames(),
+		        BeanReflectionHelper.getTypes()
+		);
+		assertNotNull( optimizer );
+		assertNotNull( optimizer.getInstantiationOptimizer() );
+		assertNotNull( optimizer.getAccessOptimizer() );
+
+		Object instance = optimizer.getInstantiationOptimizer().newInstance();
+		assertEquals( instance.getClass(), Bean.class );
+		Bean bean = ( Bean ) instance;
+
+		optimizer.getAccessOptimizer().setPropertyValues( bean, BeanReflectionHelper.TEST_VALUES );
+		assertEquals( bean.getSomeString(), BeanReflectionHelper.TEST_VALUES[0] );
+		Object[] values = optimizer.getAccessOptimizer().getPropertyValues( bean );
+		assertEquivalent( values, BeanReflectionHelper.TEST_VALUES );
+	}
+
+	private void assertEquivalent(Object[] checkValues, Object[] values) {
+		assertEquals( "Different lengths", checkValues.length, values.length );
+		for ( int i = 0; i < checkValues.length; i++ ) {
+			assertEquals( "different values at index [" + i + "]", checkValues[i], values[i] );
+		}
+	}
+
+	public static TestSuite suite() {
+		return new TestSuite( ReflectionOptimizerTest.class );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/bytecode/javassist/ReflectionOptimizerTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/A.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/A.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/A.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,130 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+
+package org.hibernate.test.cascade;
+
+import java.util.Set;
+import java.util.HashSet;
+
+/**
+ * @author <a href="mailto:ovidiu at feodorov.com">Ovidiu Feodorov</a>
+ *
+ * Copyright 2008 Ovidiu Feodorov
+ *
+ */
+public class A
+{
+    // Constants -----------------------------------------------------------------------------------
+
+    // Static --------------------------------------------------------------------------------------
+
+    // Attributes ----------------------------------------------------------------------------------
+
+    private long id;
+
+    private String data;
+
+    // A 1 - * H
+    private Set hs;
+
+    // A 1 - 1 G
+    private G g;
+
+
+    // Constructors --------------------------------------------------------------------------------
+
+    public A()
+    {
+        hs = new HashSet();
+    }
+
+    public A(String data)
+    {
+        this();
+        this.data = data;
+    }
+
+    // Public --------------------------------------------------------------------------------------
+
+    public long getId()
+    {
+        return id;
+    }
+
+    public void setId(long id)
+    {
+        this.id = id;
+    }
+
+    public void setData(String data)
+    {
+        this.data = data;
+    }
+
+    public String getData()
+    {
+        return data;
+    }
+
+    public void setHs(Set hs)
+    {
+        this.hs = hs;
+    }
+
+    public Set getHs()
+    {
+        return hs;
+    }
+
+    public void setG(G g)
+    {
+        this.g = g;
+    }
+
+    public G getG()
+    {
+        return g;
+    }
+
+    public void addH(H h)
+    {
+        hs.add(h);
+        h.setA(this);
+    }
+
+    public String toString()
+    {
+        return "A[" + id + ", " + data + "]";
+    }
+
+    // Package protected ---------------------------------------------------------------------------
+
+    // Protected -----------------------------------------------------------------------------------
+
+    // Private -------------------------------------------------------------------------------------
+
+    // Inner classes -------------------------------------------------------------------------------
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/A.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/BidirectionalOneToManyCascadeTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/BidirectionalOneToManyCascadeTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/BidirectionalOneToManyCascadeTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,145 @@
+//$Id: $
+
+package org.hibernate.test.cascade;
+
+import java.util.Collections;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gail Badner (based on annotations test case submitted by Edward Costello)
+ */
+
+/**
+ * Test case to illustrate that when a delete-orphan cascade is used on a
+ * one-to-many collection and the many-to-one side is also cascaded a
+ * TransientObjectException is thrown.
+ */
+public class BidirectionalOneToManyCascadeTest extends FunctionalTestCase {
+
+	public BidirectionalOneToManyCascadeTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] {
+				"cascade/Child.hbm.xml",
+				"cascade/DeleteOrphanChild.hbm.xml",
+				"cascade/Parent.hbm.xml"
+		};
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( BidirectionalOneToManyCascadeTest.class );
+	}
+
+	/**
+	 * Saves the parent object with a child when both the one-to-many and
+	 * many-to-one associations use cascade="all"
+	 */
+	public void testSaveParentWithChild() {
+		Session session = openSession();
+		Transaction txn = session.beginTransaction();
+		Parent parent = new Parent();
+		Child child = new Child();
+		child.setParent( parent );
+		parent.setChildren( Collections.singleton( child ) );
+		session.save( parent );
+		txn.commit();
+		session.close();
+
+		session = openSession();
+		txn = session.beginTransaction();
+		parent = ( Parent ) session.get( Parent.class, parent.getId() );
+		assertEquals( 1, parent.getChildren().size() );
+		assertEquals( 0, parent.getDeleteOrphanChildren().size() );
+		session.delete( parent );
+		txn.commit();
+		session.close();
+	}
+
+	/**
+	 * Saves the child object with the parent when both the one-to-many and
+	 * many-to-one associations use cascade="all"
+	 */
+	public void testSaveChildWithParent() {
+		Session session = openSession();
+		Transaction txn = session.beginTransaction();
+		Parent parent = new Parent();
+		Child child = new Child();
+		child.setParent( parent );
+		parent.setChildren( Collections.singleton( child ) );
+		session.save( child );
+		txn.commit();
+		session.close();
+
+		session = openSession();
+		txn = session.beginTransaction();
+		parent = ( Parent ) session.get( Parent.class, parent.getId() );
+		assertEquals( 1, parent.getChildren().size() );
+		assertEquals( 0, parent.getDeleteOrphanChildren().size() );
+		session.delete( parent );
+		txn.commit();
+		session.close();
+	}
+
+	/**
+	 * Saves the parent object with a child when the one-to-many association
+	 * uses cascade="all-delete-orphan" and the many-to-one association uses
+	 * cascade="all"
+	 */
+	public void testSaveParentWithOrphanDeleteChild() {
+		Session session = openSession();
+		Transaction txn = session.beginTransaction();
+		Parent parent = new Parent();
+		DeleteOrphanChild child = new DeleteOrphanChild();
+		child.setParent( parent );
+		parent.setDeleteOrphanChildren( Collections.singleton( child ) );
+		session.save( parent );
+		txn.commit();
+		session.close();
+
+		session = openSession();
+		txn = session.beginTransaction();
+		parent = ( Parent ) session.get( Parent.class, parent.getId() );
+		assertEquals( 0, parent.getChildren().size() );
+		assertEquals( 1, parent.getDeleteOrphanChildren().size() );
+		session.delete( parent );
+		txn.commit();
+		session.close();
+	}
+
+	/**
+	 * Saves the child object with the parent when the one-to-many association
+	 * uses cascade="all-delete-orphan" and the many-to-one association uses
+	 * cascade="all"
+	 * <p/>
+	 * This test is known to fail. See HHH-2269.
+	 */
+	public void testSaveOrphanDeleteChildWithParentFailureExpected() {
+		Session session = openSession();
+		Transaction txn = session.beginTransaction();
+		Parent parent = new Parent();
+		DeleteOrphanChild child = new DeleteOrphanChild();
+		child.setParent( parent );
+		parent.setDeleteOrphanChildren( Collections.singleton( child ) );
+		session.save( child );
+		txn.commit();
+		session.close();
+
+		session = openSession();
+		txn = session.beginTransaction();
+		parent = ( Parent ) session.get( Parent.class, parent.getId() );
+		assertEquals( 0, parent.getChildren().size() );
+		assertEquals( 1, parent.getDeleteOrphanChildren().size() );
+		session.delete( parent );
+		txn.commit();
+		session.close();
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/BidirectionalOneToManyCascadeTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/Child.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/Child.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/Child.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.cascade">
+    <class name="Child" table="Child">
+        <id name="id" column="id" type="java.lang.Long">
+            <generator class="native"/>
+        </id>
+        <many-to-one name="parent" class="Parent" not-null="false" cascade="all"/>
+    </class>
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/Child.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/Child.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/Child.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/Child.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,29 @@
+package org.hibernate.test.cascade;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: Gail
+ * Date: Jan 2, 2007
+ * Time: 4:51:29 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public class Child {
+	private Long id;
+	private Parent parent;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Parent getParent() {
+		return parent;
+	}
+
+	public void setParent(Parent parent) {
+		this.parent = parent;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/Child.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/DeleteOrphanChild.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/DeleteOrphanChild.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/DeleteOrphanChild.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.cascade">
+    <class name="DeleteOrphanChild" table="DeleteOrphanChild">
+        <id name="id" column="id" type="java.lang.Long">
+            <generator class="native"/>
+        </id>
+        <many-to-one name="parent" class="Parent" not-null="false" cascade="all"/>
+    </class>
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/DeleteOrphanChild.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/DeleteOrphanChild.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/DeleteOrphanChild.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/DeleteOrphanChild.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,29 @@
+package org.hibernate.test.cascade;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: Gail
+ * Date: Jan 2, 2007
+ * Time: 4:52:10 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public class DeleteOrphanChild {
+	private Long id;
+	private Parent parent;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Parent getParent() {
+		return parent;
+	}
+
+	public void setParent(Parent parent) {
+		this.parent = parent;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/DeleteOrphanChild.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/G.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/G.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/G.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,121 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+
+package org.hibernate.test.cascade;
+
+import java.util.Set;
+import java.util.HashSet;
+
+/**
+ * @author <a href="mailto:ovidiu at feodorov.com">Ovidiu Feodorov</a>
+ *
+ * Copyright 2008 Ovidiu Feodorov
+ *
+ * @version <tt>$Revision$</tt>
+ *
+ * $Id$
+ */
+public class G
+{
+    // Constants -----------------------------------------------------------------------------------
+
+    // Static --------------------------------------------------------------------------------------
+
+    // Attributes ----------------------------------------------------------------------------------
+
+    private long id;
+
+    private String data;
+
+    // A 1 <-> 1 G
+    private A a;
+
+    // G * <-> * H
+    private Set hs;
+
+    // Constructors --------------------------------------------------------------------------------
+
+    public G()
+    {
+        this(null);
+    }
+
+    public G(String data)
+    {
+        this.data = data;
+        hs = new HashSet();
+    }
+
+    // Public --------------------------------------------------------------------------------------
+
+    public String getData()
+    {
+        return data;
+    }
+
+    public void setData(String data)
+    {
+        this.data = data;
+    }
+
+    public A getA()
+    {
+        return a;
+    }
+
+    public void setA(A a)
+    {
+        this.a = a;
+    }
+
+    public Set getHs()
+    {
+        return hs;
+    }
+
+    public void setHs(Set s)
+    {
+        hs = s;
+    }
+
+    // Package protected ---------------------------------------------------------------------------
+
+    long getId()
+    {
+        return id;
+    }
+
+    // Protected -----------------------------------------------------------------------------------
+
+    // Private -------------------------------------------------------------------------------------
+
+    private void setId(long id)
+    {
+        this.id = id;
+    }
+
+    // Inner classes -------------------------------------------------------------------------------
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/G.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/H.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/H.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/H.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,117 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+
+package org.hibernate.test.cascade;
+
+import java.util.Set;
+import java.util.HashSet;
+
+/**
+ * @author <a href="mailto:ovidiu at feodorov.com">Ovidiu Feodorov</a>
+ *
+ * Copyright 2008 Ovidiu Feodorov
+ *
+ */
+public class H
+{
+    // Constants -----------------------------------------------------------------------------------
+
+    // Static --------------------------------------------------------------------------------------
+
+    // Attributes ----------------------------------------------------------------------------------
+
+    private long id;
+
+    private String data;
+
+    private A a;
+
+    // G * <-> * H
+    private Set gs;
+
+    // Constructors --------------------------------------------------------------------------------
+
+    public H()
+    {
+        this(null);
+    }
+
+    public H(String data)
+    {
+        this.data = data;
+        gs = new HashSet();
+    }
+
+    // Public --------------------------------------------------------------------------------------
+
+    public long getId()
+    {
+        return id;
+    }
+
+    public String getData()
+    {
+        return data;
+    }
+
+    public void setData(String data)
+    {
+        this.data = data;
+    }
+
+    public A getA()
+    {
+        return a;
+    }
+
+    public void setA(A a)
+    {
+        this.a = a;
+    }
+
+    public Set getGs()
+    {
+        return gs;
+    }
+
+    public void setGs(Set gs)
+    {
+        this.gs = gs;
+    }
+
+    // Package protected ---------------------------------------------------------------------------
+
+    // Protected -----------------------------------------------------------------------------------
+
+    // Private -------------------------------------------------------------------------------------
+
+    private void setId(long id)
+    {
+        this.id = id;
+    }
+
+    // Inner classes -------------------------------------------------------------------------------
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/H.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/Job.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/Job.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/Job.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<hibernate-mapping package="org.hibernate.test.cascade">
+
+	<class name="Job" table="T_JOB">
+		<id name="id" column="JOB_ID">
+			<generator class="native"/>
+		</id>
+
+		<many-to-one name="batch" class="JobBatch" cascade="none" column="BATCH_ID"/>
+
+		<property name="status" type="int" column="JOB_STATUS" not-null="true"/>
+		<property name="processingInstructions" type="string" column="PI" not-null="true"/>
+
+	</class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/Job.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/Job.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/Job.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/Job.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,53 @@
+// $Id: Job.java 6663 2005-05-03 20:55:31Z steveebersole $
+package org.hibernate.test.cascade;
+
+/**
+ * Implementation of Job.
+ *
+ * @author Steve Ebersole
+ */
+public class Job {
+	private Long id;
+	private JobBatch batch;
+	private String processingInstructions;
+	private int status;
+
+	/** GCLIB constructor */
+	Job() {}
+
+	protected Job(JobBatch batch) {
+		this.batch = batch;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	/*package*/ void setId(Long id) {
+		this.id = id;
+	}
+
+	public JobBatch getBatch() {
+		return batch;
+	}
+
+	/*package*/ void setBatch(JobBatch batch) {
+		this.batch = batch;
+	}
+
+	public String getProcessingInstructions() {
+		return processingInstructions;
+	}
+
+	public void setProcessingInstructions(String processingInstructions) {
+		this.processingInstructions = processingInstructions;
+	}
+
+	public int getStatus() {
+		return status;
+	}
+
+	public void setStatus(int status) {
+		this.status = status;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/Job.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/JobBatch.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/JobBatch.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/JobBatch.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<hibernate-mapping package="org.hibernate.test.cascade">
+
+	<class name="JobBatch" table="T_JOB_BATCH">
+		<id name="id" column="BATCH_ID">
+			<generator class="native"/>
+		</id>
+
+		<property name="batchDate" type="timestamp" column="BATCH_DATE" not-null="true"/>
+
+		<set name="jobs" inverse="true" fetch="select" lazy="true" cascade="all, refresh">
+			<key column="BATCH_ID"/>
+			<one-to-many class="Job"/>
+		</set>
+
+	</class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/JobBatch.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/JobBatch.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/JobBatch.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/JobBatch.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,54 @@
+// $Id: JobBatch.java 6663 2005-05-03 20:55:31Z steveebersole $
+package org.hibernate.test.cascade;
+
+import java.util.Date;
+import java.util.Set;
+import java.util.HashSet;
+
+/**
+ * Implementation of JobBatch.
+ *
+ * @author Steve Ebersole
+ */
+public class JobBatch {
+	private Long id;
+	private Date batchDate;
+	private Set jobs = new HashSet();
+
+	/** CGLIB constructor */
+	JobBatch() {}
+
+	public JobBatch(Date batchDate) {
+		this.batchDate = batchDate;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Date getBatchDate() {
+		return batchDate;
+	}
+
+	public void setBatchDate(Date batchDate) {
+		this.batchDate = batchDate;
+	}
+
+	public Set getJobs() {
+		return jobs;
+	}
+
+	public void setJobs(Set jobs) {
+		this.jobs = jobs;
+	}
+
+	public Job createJob() {
+		Job job = new Job( this );
+		jobs.add( job );
+		return job;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/JobBatch.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/MultiPathCascade.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/MultiPathCascade.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/MultiPathCascade.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,67 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<hibernate-mapping package="org.hibernate.test.cascade">
+
+    <class name="A" table="HB_A">
+
+        <id name="id" type="long"><generator class="native"/></id>
+
+        <property name="data" type="string" not-null="true"/>
+
+        <!--
+             Associations
+        -->
+
+        <set name="hs" inverse="true" cascade="all">
+            <key column="a_fk"/>
+            <one-to-many class="H"/>
+        </set>
+        <one-to-one name="g" class="G" property-ref="a" cascade="all"/>
+
+    </class>
+
+    <class name="G" table="HB_G">
+
+        <id name="id" type="long"><generator class="native"/></id>
+
+        <property name="data" type="string" not-null="true"/>
+
+        <!--
+             Associations
+        -->
+
+        <set name="hs" inverse="true" table="HB_G_H" cascade="all">
+            <key column="g_fk"/>
+            <many-to-many class="H" column="h_fk"/>
+        </set>
+
+        <many-to-one name="a"
+            column="aId"
+            unique="true"
+            not-null="false"/>
+
+    </class>
+
+    <class name="H" table="HB_H">
+
+        <id name="id" type="long"><generator class="native"/></id>
+
+        <property name="data" type="string" not-null="true"/>
+
+        <!--
+            Associations
+        -->
+
+        <!-- *NOT* cascaded -->
+        <set name="gs" table="HB_G_H">
+            <key column="h_fk"/>
+            <many-to-many class="G" column="g_fk"/>
+        </set>
+
+        <many-to-one name="a" column="a_fk" class="A"/>
+
+    </class>
+
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/MultiPathCascade.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/MultiPathCascadeTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/MultiPathCascadeTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/MultiPathCascadeTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,361 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+
+package org.hibernate.test.cascade;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.TransientObjectException;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.proxy.HibernateProxy;
+
+/**
+ * @author <a href="mailto:ovidiu at feodorov.com">Ovidiu Feodorov</a>
+ * @author Gail Badner
+ *
+ */
+
+public class MultiPathCascadeTest extends FunctionalTestCase {
+
+	public MultiPathCascadeTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] {
+				"cascade/MultiPathCascade.hbm.xml"
+		};
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( MultiPathCascadeTest.class );
+	}
+
+	protected void cleanupTest() {
+		Session s = openSession();
+		s.beginTransaction();
+		s.createQuery( "delete from A" );
+		s.createQuery( "delete from G" );
+		s.createQuery( "delete from H" );
+	}
+
+	public void testMultiPathMergeModifiedDetached() throws Exception
+	{
+		// persist a simple A in the database
+
+		Session s = openSession();
+		s.beginTransaction();
+		A a = new A();
+		a.setData( "Anna" );
+		s.save( a );
+		s.getTransaction().commit();
+		s.close();
+
+		// modify detached entity
+		modifyEntity( a );
+
+		s = openSession();
+		s.beginTransaction();
+		a = ( A ) s.merge( a );
+		s.getTransaction().commit();
+		s.close();
+
+		verifyModifications( a.getId() );
+	}
+
+	public void testMultiPathMergeModifiedDetachedIntoProxy() throws Exception
+	{
+		// persist a simple A in the database
+
+		Session s = openSession();
+		s.beginTransaction();
+		A a = new A();
+		a.setData( "Anna" );
+		s.save( a );
+		s.getTransaction().commit();
+		s.close();
+
+		// modify detached entity
+		modifyEntity( a );
+
+		s = openSession();
+		s.beginTransaction();
+		A aLoaded = ( A ) s.load( A.class, new Long( a.getId() ) );
+		assertTrue( aLoaded instanceof HibernateProxy );
+		assertSame( aLoaded, s.merge( a ) );
+		s.getTransaction().commit();
+		s.close();
+
+		verifyModifications( a.getId() );
+	}
+
+	public void testMultiPathUpdateModifiedDetached() throws Exception
+	{
+		// persist a simple A in the database
+
+		Session s = openSession();
+		s.beginTransaction();
+		A a = new A();
+		a.setData( "Anna" );
+		s.save( a );
+		s.getTransaction().commit();
+		s.close();
+
+		// modify detached entity
+		modifyEntity( a );
+
+		s = openSession();
+		s.beginTransaction();
+		s.update( a );
+		s.getTransaction().commit();
+		s.close();
+
+		verifyModifications( a.getId() );
+	}
+
+	public void testMultiPathGetAndModify() throws Exception
+	{
+		// persist a simple A in the database
+
+		Session s = openSession();
+		s.beginTransaction();
+		A a = new A();
+		a.setData( "Anna" );
+		s.save( a );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		// retrieve the previously saved instance from the database, and update it
+		a = ( A ) s.get( A.class, new Long( a.getId() ) );
+		modifyEntity( a );
+		s.getTransaction().commit();
+		s.close();
+
+		verifyModifications( a.getId() );
+	}
+
+	public void testMultiPathMergeNonCascadedTransientEntityInCollection() throws Exception
+	{
+		// persist a simple A in the database
+
+		Session s = openSession();
+		s.beginTransaction();
+		A a = new A();
+		a.setData( "Anna" );
+		s.save( a );
+		s.getTransaction().commit();
+		s.close();
+
+		// modify detached entity
+		modifyEntity( a );
+
+		s = openSession();
+		s.beginTransaction();
+		a = ( A ) s.merge( a );
+		s.getTransaction().commit();
+		s.close();
+
+		verifyModifications( a.getId() );
+
+		// add a new (transient) G to collection in h
+		// there is no cascade from H to the collection, so this should fail when merged
+		assertEquals( 1, a.getHs().size() );
+		H h = ( H ) a.getHs().iterator().next();
+		G gNew = new G();
+		gNew.setData( "Gail" );
+		gNew.getHs().add( h );
+		h.getGs().add( gNew );
+
+		s = openSession();
+		s.beginTransaction();
+		try {
+			s.merge( a );
+			s.merge( h );
+			fail( "should have thrown TransientObjectException" );
+		}
+		catch ( TransientObjectException ex ) {
+			// expected
+		}
+		finally {
+			s.getTransaction().rollback();
+		}
+		s.close();
+	}
+
+	public void testMultiPathMergeNonCascadedTransientEntityInOneToOne() throws Exception
+	{
+		// persist a simple A in the database
+
+		Session s = openSession();
+		s.beginTransaction();
+		A a = new A();
+		a.setData( "Anna" );
+		s.save( a );
+		s.getTransaction().commit();
+		s.close();
+
+		// modify detached entity
+		modifyEntity( a );
+
+		s = openSession();
+		s.beginTransaction();
+		a = ( A ) s.merge( a );
+		s.getTransaction().commit();
+		s.close();
+
+		verifyModifications( a.getId() );
+
+		// change the one-to-one association from g to be a new (transient) A
+		// there is no cascade from G to A, so this should fail when merged
+		G g = a.getG();
+		a.setG( null );
+		A aNew = new A();
+		aNew.setData( "Alice" );
+		g.setA( aNew );
+		aNew.setG( g );
+
+		s = openSession();
+		s.beginTransaction();
+		try {
+			s.merge( a );
+			s.merge( g );
+			fail( "should have thrown TransientObjectException" );
+		}
+		catch ( TransientObjectException ex ) {
+			// expected
+		}
+		finally {
+			s.getTransaction().rollback();
+		}
+		s.close();
+	}
+
+	public void testMultiPathMergeNonCascadedTransientEntityInManyToOne() throws Exception
+	{
+		// persist a simple A in the database
+
+		Session s = openSession();
+		s.beginTransaction();
+		A a = new A();
+		a.setData( "Anna" );
+		s.save( a );
+		s.getTransaction().commit();
+		s.close();
+
+		// modify detached entity
+		modifyEntity( a );
+
+		s = openSession();
+		s.beginTransaction();
+		a = ( A ) s.merge( a );
+		s.getTransaction().commit();
+		s.close();
+
+		verifyModifications( a.getId() );
+
+		// change the many-to-one association from h to be a new (transient) A
+		// there is no cascade from H to A, so this should fail when merged
+		assertEquals( 1, a.getHs().size() );
+		H h = ( H ) a.getHs().iterator().next();
+		a.getHs().remove( h );
+		A aNew = new A();
+		aNew.setData( "Alice" );
+		aNew.addH( h );
+
+		s = openSession();
+		s.beginTransaction();
+		try {
+			s.merge( a );
+			s.merge( h );
+			fail( "should have thrown TransientObjectException" );
+		}
+		catch ( TransientObjectException ex ) {
+			// expected
+		}
+		finally {
+			s.getTransaction().rollback();
+		}
+		s.close();
+	}
+
+	private void modifyEntity(A a) {
+		// create a *circular* graph in detached entity
+		a.setData("Anthony");
+
+		G g = new G();
+		g.setData( "Giovanni" );
+
+		H h = new H();
+		h.setData( "Hellen" );
+
+		a.setG( g );
+		g.setA( a );
+
+		a.getHs().add( h );
+		h.setA( a );
+
+		g.getHs().add( h );
+		h.getGs().add( g );
+	}
+
+	private void verifyModifications(long aId) {
+		Session s = openSession();
+		s.beginTransaction();
+
+		// retrieve the A object and check it
+		A a = ( A ) s.get( A.class, new Long( aId ) );
+		assertEquals( aId, a.getId() );
+		assertEquals( "Anthony", a.getData() );
+		assertNotNull( a.getG() );
+		assertNotNull( a.getHs() );
+		assertEquals( 1, a.getHs().size() );
+
+		G gFromA = a.getG();
+		H hFromA = ( H ) a.getHs().iterator().next();
+
+		// check the G object
+		assertEquals( "Giovanni", gFromA.getData() );
+		assertSame( a, gFromA.getA() );
+		assertNotNull( gFromA.getHs() );
+		assertEquals( a.getHs(), gFromA.getHs() );
+		assertSame( hFromA, gFromA.getHs().iterator().next() );
+
+		// check the H object
+		assertEquals( "Hellen", hFromA.getData() );
+		assertSame( a, hFromA.getA() );
+		assertNotNull( hFromA.getGs() );
+		assertEquals( 1, hFromA.getGs().size() );
+		assertSame( gFromA, hFromA.getGs().iterator().next() );
+
+		s.getTransaction().commit();
+		s.close();
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/MultiPathCascadeTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/Parent.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/Parent.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/Parent.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.cascade">
+    <class name="Parent" table="Parent">
+        <id name="id" column="id" type="java.lang.Long">
+            <generator class="native"/>
+        </id>
+        <set name="children" cascade="all" inverse="true">
+            <key column="parent"/>
+            <one-to-many class="Child"/>
+        </set>
+        <set name="deleteOrphanChildren" cascade="all-delete-orphan" inverse="true">
+            <key column="parent"/>
+            <one-to-many class="DeleteOrphanChild"/>
+        </set>
+    </class>
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/Parent.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/Parent.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/Parent.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/Parent.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,40 @@
+package org.hibernate.test.cascade;
+
+import java.util.Set;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: Gail
+ * Date: Jan 2, 2007
+ * Time: 4:50:24 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public class Parent {
+	private Long id;
+	private Set deleteOrphanChildren;
+	private Set children;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Set getDeleteOrphanChildren() {
+		return deleteOrphanChildren;
+	}
+
+	public void setDeleteOrphanChildren(Set deleteOrphanChildren) {
+		this.deleteOrphanChildren = deleteOrphanChildren;
+	}
+
+	public Set getChildren() {
+		return children;
+	}
+
+	public void setChildren(Set children) {
+		this.children = children;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/Parent.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/RefreshTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/RefreshTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/RefreshTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,79 @@
+// $Id: RefreshTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.cascade;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.util.Date;
+import java.util.Iterator;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Implementation of RefreshTest.
+ *
+ * @author Steve Ebersole
+ */
+public class RefreshTest extends FunctionalTestCase {
+
+	public RefreshTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "cascade/Job.hbm.xml", "cascade/JobBatch.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( RefreshTest.class );
+	}
+
+	public void testRefreshCascade() throws Throwable {
+		Session session = openSession();
+		Transaction txn = session.beginTransaction();
+
+		JobBatch batch = new JobBatch( new Date() );
+		batch.createJob().setProcessingInstructions( "Just do it!" );
+		batch.createJob().setProcessingInstructions( "I know you can do it!" );
+
+		// write the stuff to the database; at this stage all job.status values are zero
+		session.persist( batch );
+		session.flush();
+
+		// behind the session's back, let's modify the statuses
+		updateStatuses( session.connection() );
+
+		// Now lets refresh the persistent batch, and see if the refresh cascaded to the jobs collection elements
+		session.refresh( batch );
+
+		Iterator itr = batch.getJobs().iterator();
+		while( itr.hasNext() ) {
+			Job job = ( Job ) itr.next();
+			assertEquals( "Jobs not refreshed!", 1, job.getStatus() );
+		}
+
+		txn.rollback();
+		session.close();
+	}
+
+	private void updateStatuses(Connection connection) throws Throwable {
+		PreparedStatement stmnt = null;
+		try {
+			stmnt = connection.prepareStatement( "UPDATE T_JOB SET JOB_STATUS = 1" );
+			stmnt.executeUpdate();
+		}
+		finally {
+			if ( stmnt != null ) {
+				try {
+					stmnt.close();
+				}
+				catch( Throwable ignore ) {
+				}
+			}
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/RefreshTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/CascadeMergeToChildBeforeParent.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/CascadeMergeToChildBeforeParent.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/CascadeMergeToChildBeforeParent.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,115 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<hibernate-mapping package="org.hibernate.test.cascade.circle">
+
+    <class name="Route" table="HB_Route">
+
+        <id name="routeID" type="long"><generator class="native"/></id>
+        <version name="version" column="VERS" type="long" />
+
+        <property name="name" type="string" not-null="true"/>
+
+        <set name="nodes" inverse="true" cascade="persist,merge,refresh">
+            <key column="routeID"/>
+            <one-to-many class="Node"/>
+        </set>
+        <set name="vehicles" inverse="true" cascade="persist,merge,refresh">
+            <key column="routeID"/>
+            <one-to-many class="Vehicle"/>
+        </set>
+    </class>
+
+   <class name="Tour" table="HB_Tour">
+
+        <id name="tourID" type="long"><generator class="native"/></id>
+        <version name="version" column="VERS" type="long" />
+
+        <property name="name" type="string" not-null="true"/>
+
+        <set name="nodes" inverse="true" lazy="true" cascade="merge,refresh">
+            <key column="tourID"/>
+            <one-to-many class="Node"/>
+        </set>
+    </class>
+    
+    <class name="Transport" table="HB_Transport">
+
+        <id name="transportID" type="long"><generator class="native"/></id>
+        <version name="version" column="VERS" type="long" />
+
+        <property name="name" type="string" not-null="true"/>
+
+        <many-to-one name="pickupNode"
+            column="pickupNodeID"
+            unique="true"
+            not-null="true"
+            cascade="merge,refresh"
+            lazy="false"/> 
+
+        <many-to-one name="deliveryNode"
+            column="deliveryNodeID"
+            unique="true"
+            not-null="true"
+            cascade="merge,refresh"
+            lazy="false"/> 
+
+        <many-to-one name="vehicle"
+            column="vehicleID"
+            unique="false"
+            not-null="true"
+            cascade="none"
+            lazy="false"/>
+    </class>
+
+    <class name="Vehicle" table="HB_Vehicle">
+        <id name="vehicleID" type="long"><generator class="native"/></id>
+        <version name="version" column="VERS" type="long" />
+
+        <property name="name"/>
+        <set name="transports" inverse="false" lazy="true" cascade="merge,refresh">
+           <key column="vehicleID"/>
+           <one-to-many class="Transport" not-found="exception"/>
+       </set>
+        <many-to-one name="route"
+            column="routeID"
+            unique="false"
+            not-null="true"
+            cascade="none"
+            lazy="false"/>
+    </class>
+
+
+    <class name="Node" table="HB_Node">
+
+        <id name="nodeID" type="long"><generator class="native"/></id>
+        <version name="version" column="VERS" type="long" />
+
+        <property name="name" type="string" not-null="true"/>
+
+         <set name="deliveryTransports" inverse="true" lazy="true" cascade="merge,refresh">
+            <key column="deliveryNodeID"/>
+            <one-to-many class="Transport"/>
+        </set>
+
+        <set name="pickupTransports" inverse="true" lazy="true" cascade="merge,refresh">
+            <key column="pickupNodeID"/>
+            <one-to-many class="Transport"/>
+        </set>
+
+        <many-to-one name="route"
+            column="routeID"
+            unique="false"
+            not-null="true"
+            cascade="none"
+            lazy="false"/> 
+
+        <many-to-one name="tour"
+            column="tourID"
+            unique="false"
+            not-null="false"
+            cascade="merge,refresh"
+            lazy="false"/>                 
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/CascadeMergeToChildBeforeParent.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/CascadeMergeToChildBeforeParentTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/CascadeMergeToChildBeforeParentTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/CascadeMergeToChildBeforeParentTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,288 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+
+package org.hibernate.test.cascade.circle;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * The test case uses the following model:
+ *
+ *                         <-    ->
+ *                      -- (N : 0,1) -- Tour
+ *                      |    <-   ->
+ *                      | -- (1 : N) -- (pickup) ----
+ *               ->     | |                         |
+ * Route -- (1 : N) - Node                      Transport
+ *   |                    |  <-   ->                |  |
+ *   |                    -- (1 : N) -- (delivery) --  |
+ *   |                                                 |
+ *   |             ->                    ->            |
+ *   -------- (1 : N) ---- Vehicle--(1 : N)------------
+ *
+ * Arrows indicate the direction of cascade-merge.
+ * 
+ * I believe it reproduces the following issue:
+ *    http://opensource.atlassian.com/projects/hibernate/browse/HHH-3544
+ *
+ * @author Gail Badner (based on original model provided by Pavol Zibrita)
+ */
+public class CascadeMergeToChildBeforeParentTest extends FunctionalTestCase {
+
+	public CascadeMergeToChildBeforeParentTest(String string) {
+		super(string);
+	}
+
+	public String[] getMappings() {
+		return new String[] {
+				"cascade/circle/CascadeMergeToChildBeforeParent.hbm.xml"
+		};
+	}
+	
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( CascadeMergeToChildBeforeParentTest.class );
+	}
+	
+	protected void cleanupTest() {
+		Session s = openSession();
+		s.beginTransaction();
+		s.createQuery( "delete from Transport" );
+		s.createQuery( "delete from Tour" );
+		s.createQuery( "delete from Node" );
+		s.createQuery( "delete from Route" );
+		s.createQuery( "delete from Vehicle" );
+	}
+
+	public void testMerge()
+	{
+		Session s = openSession();
+		s.beginTransaction();
+
+		Route route = new Route();
+		route.setName("routeA");
+
+		s.save( route );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+
+		route = (Route) s.get(Route.class, new Long(1));
+
+		route.setTransientField(new String("sfnaouisrbn"));
+
+		Tour tour = new Tour();
+		tour.setName("tourB");
+
+		Node pickupNode = new Node();
+		pickupNode.setName("pickupNodeB");
+
+		Node deliveryNode = new Node();
+		deliveryNode.setName("deliveryNodeB");
+
+		pickupNode.setRoute(route);
+		pickupNode.setTour(tour);
+		pickupNode.setTransientField("pickup node aaaaaaaaaaa");
+
+		deliveryNode.setRoute(route);
+		deliveryNode.setTour(tour);
+		deliveryNode.setTransientField("delivery node aaaaaaaaa");
+
+		tour.getNodes().add(pickupNode);
+		tour.getNodes().add(deliveryNode);
+
+		route.getNodes().add(pickupNode);
+		route.getNodes().add(deliveryNode);
+
+		Route mergedRoute = (Route) s.merge(route);
+
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	// This test fails because the merge algorithm tries to save a
+	// transient child (transport) before cascade-merge gets its
+	// transient parent (vehicle); merge does not cascade from the
+	// child to the parent.
+	public void testMergeTransientChildBeforeTransientParent()
+	{
+		Session s = openSession();
+		s.beginTransaction();
+
+		Route route = new Route();
+		route.setName("routeA");
+
+		s.save( route );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+
+		route = (Route) s.get(Route.class, new Long(1));
+
+		route.setTransientField(new String("sfnaouisrbn"));
+
+		Tour tour = new Tour();
+		tour.setName("tourB");
+
+		Transport transport = new Transport();
+		transport.setName("transportB");
+
+		Node pickupNode = new Node();
+		pickupNode.setName("pickupNodeB");
+
+		Node deliveryNode = new Node();
+		deliveryNode.setName("deliveryNodeB");
+
+		Vehicle vehicle = new Vehicle();
+		vehicle.setName("vehicleB");
+
+		pickupNode.setRoute(route);
+		pickupNode.setTour(tour);
+		pickupNode.getPickupTransports().add(transport);
+		pickupNode.setTransientField("pickup node aaaaaaaaaaa");
+
+		deliveryNode.setRoute(route);
+		deliveryNode.setTour(tour);
+		deliveryNode.getDeliveryTransports().add(transport);
+		deliveryNode.setTransientField("delivery node aaaaaaaaa");
+
+		tour.getNodes().add(pickupNode);
+		tour.getNodes().add(deliveryNode);
+
+		route.getNodes().add(pickupNode);
+		route.getNodes().add(deliveryNode);
+		route.getVehicles().add(vehicle);
+
+		transport.setPickupNode(pickupNode);
+		transport.setDeliveryNode(deliveryNode);
+		transport.setVehicle( vehicle );
+		transport.setTransientField("aaaaaaaaaaaaaa");
+
+		vehicle.getTransports().add(transport);
+		vehicle.setTransientField( "anewvalue" );
+		vehicle.setRoute( route );
+
+		Route mergedRoute = (Route) s.merge(route);
+
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testMergeData3Nodes()
+	{
+
+		Session s = openSession();
+		s.beginTransaction();
+
+		Route route = new Route();
+		route.setName("routeA");
+
+		s.save( route );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+
+		route = (Route) s.get(Route.class, new Long(1));
+
+		route.setTransientField(new String("sfnaouisrbn"));
+
+		Tour tour = new Tour();
+		tour.setName("tourB");
+
+		Transport transport1 = new Transport();
+		transport1.setName("TRANSPORT1");
+
+		Transport transport2 = new Transport();
+		transport2.setName("TRANSPORT2");
+
+		Node node1 = new Node();
+		node1.setName("NODE1");
+
+		Node node2 = new Node();
+		node2.setName("NODE2");
+
+		Node node3 = new Node();
+		node3.setName("NODE3");
+
+		Vehicle vehicle = new Vehicle();
+		vehicle.setName("vehicleB");
+
+		node1.setRoute(route);
+		node1.setTour(tour);
+		node1.getPickupTransports().add(transport1);
+		node1.setTransientField("node 1");
+
+		node2.setRoute(route);
+		node2.setTour(tour);
+		node2.getDeliveryTransports().add(transport1);
+		node2.getPickupTransports().add(transport2);
+		node2.setTransientField("node 2");
+
+		node3.setRoute(route);
+		node3.setTour(tour);
+		node3.getDeliveryTransports().add(transport2);
+		node3.setTransientField("node 3");
+
+		tour.getNodes().add(node1);
+		tour.getNodes().add(node2);
+		tour.getNodes().add(node3);
+
+		route.getNodes().add(node1);
+		route.getNodes().add(node2);
+		route.getNodes().add(node3);
+		route.getVehicles().add(vehicle);
+
+		transport1.setPickupNode(node1);
+		transport1.setDeliveryNode(node2);
+		transport1.setVehicle( vehicle );
+		transport1.setTransientField("aaaaaaaaaaaaaa");
+
+		transport2.setPickupNode(node2);
+		transport2.setDeliveryNode(node3);
+		transport2.setVehicle( vehicle );
+		transport2.setTransientField("bbbbbbbbbbbbb");
+
+		vehicle.getTransports().add(transport1);
+		vehicle.getTransports().add(transport2);
+		vehicle.setTransientField( "anewvalue" );
+		vehicle.setRoute( route );
+
+		Route mergedRoute = (Route) s.merge(route);
+
+		s.getTransaction().commit();
+		s.close();
+	}
+	
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/CascadeMergeToChildBeforeParentTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/MultiPathCircleCascade.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/MultiPathCircleCascade.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/MultiPathCircleCascade.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,82 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<hibernate-mapping package="org.hibernate.test.cascade.circle">
+
+    <class name="Route" table="HB_Route">
+
+        <id name="routeID" type="long"><generator class="native"/></id>
+
+        <property name="name" type="string" not-null="true"/>
+
+        <set name="nodes" inverse="true" cascade="persist,merge,refresh">
+            <key column="routeID"/>
+            <one-to-many class="Node"/>
+        </set>
+    </class>
+
+   <class name="Tour" table="HB_Tour">
+
+        <id name="tourID" type="long"><generator class="native"/></id>
+
+        <property name="name" type="string" not-null="true"/>
+
+        <set name="nodes" inverse="true" lazy="true" cascade="merge,refresh">
+            <key column="tourID"/>
+            <one-to-many class="Node"/>
+        </set>
+    </class>
+    
+    <class name="Transport" table="HB_Transport">
+
+        <id name="transportID" type="long"><generator class="native"/></id>
+
+        <property name="name" type="string" not-null="true"/>
+
+        <many-to-one name="pickupNode"
+            column="pickupNodeID"
+            unique="true"
+            not-null="true"
+            cascade="merge,refresh"
+            lazy="false"/> 
+
+        <many-to-one name="deliveryNode"
+            column="deliveryNodeID"
+            unique="true"
+            not-null="true"
+            cascade="merge,refresh"
+            lazy="false"/> 
+    </class>
+
+    <class name="Node" table="HB_Node">
+
+        <id name="nodeID" type="long"><generator class="native"/></id>
+
+        <property name="name" type="string" not-null="true"/>
+
+         <set name="deliveryTransports" inverse="true" lazy="true" cascade="merge,refresh">
+            <key column="deliveryNodeID"/>
+            <one-to-many class="Transport"/>
+        </set>
+
+        <set name="pickupTransports" inverse="true" lazy="true" cascade="merge,refresh">
+            <key column="pickupNodeID"/>
+            <one-to-many class="Transport"/>
+        </set>
+
+        <many-to-one name="route"
+            column="routeID"
+            unique="false"
+            not-null="true"
+            cascade="none"
+            lazy="false"/> 
+
+        <many-to-one name="tour"
+            column="tourID"
+            unique="false"
+            not-null="false"
+            cascade="merge,refresh"
+            lazy="false"/>                 
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/MultiPathCircleCascade.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/MultiPathCircleCascadeTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/MultiPathCircleCascadeTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/MultiPathCircleCascadeTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,459 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+
+package org.hibernate.test.cascade.circle;
+
+import java.util.Iterator;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * The test case uses the following model:
+ *
+ *                          <-    ->
+ *                      -- (N : 0,1) -- Tour
+ *                      |    <-   ->
+ *                      | -- (1 : N) -- (pickup) ----
+ *               ->     | |                          |
+ * Route -- (1 : N) -- Node                      Transport
+ *                      |  <-   ->                |
+ *                      -- (1 : N) -- (delivery) --
+ *
+ *  Arrows indicate the direction of cascade-merge.
+ *
+ * It reproduced the following issues:
+ *    http://opensource.atlassian.com/projects/hibernate/browse/HHH-3046
+ *    http://opensource.atlassian.com/projects/hibernate/browse/HHH-3810
+ *
+ * This tests that merge is cascaded properly from each entity.
+ * 
+ * @author Pavol Zibrita, Gail Badner
+ */
+public class MultiPathCircleCascadeTest extends FunctionalTestCase {
+
+	public MultiPathCircleCascadeTest(String string) {
+		super(string);
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setProperty( Environment.GENERATE_STATISTICS, "true");
+		cfg.setProperty( Environment.STATEMENT_BATCH_SIZE, "0" );
+	}
+
+	public String[] getMappings() {
+		return new String[] {
+				"cascade/circle/MultiPathCircleCascade.hbm.xml"
+		};
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( MultiPathCircleCascadeTest.class );
+	}
+	
+	protected void cleanupTest() {
+		Session s = openSession();
+		s.beginTransaction();
+		s.createQuery( "delete from Transport" );
+		s.createQuery( "delete from Tour" );
+		s.createQuery( "delete from Node" );
+		s.createQuery( "delete from Route" );
+	}
+	
+	public void testMergeRoute()
+	{
+
+		Route route = getUpdatedDetachedEntity();
+
+		clearCounts();
+
+		Session s = openSession();
+		s.beginTransaction();
+
+		s.merge(route);
+
+		s.getTransaction().commit();
+		s.close();
+
+		assertInsertCount( 4 );
+		assertUpdateCount( 1 );
+
+		s = openSession();
+		s.beginTransaction();
+		route = ( Route ) s.get( Route.class, route.getRouteID() );
+		checkResults( route, true );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testMergePickupNode()
+	{
+
+		Route route = getUpdatedDetachedEntity();
+
+		clearCounts();
+
+		Session s = openSession();
+		s.beginTransaction();
+
+		Iterator it=route.getNodes().iterator();
+		Node node = ( Node ) it.next();
+		Node pickupNode;
+		if ( node.getName().equals( "pickupNodeB") ) {
+			pickupNode = node;
+		}
+		else {
+			node = ( Node ) it.next();
+			assertEquals( "pickupNodeB", node.getName() );
+			pickupNode = node;
+		}
+
+		pickupNode = ( Node ) s.merge( pickupNode );
+
+		s.getTransaction().commit();
+		s.close();
+
+		assertInsertCount( 4 );
+		assertUpdateCount( 0 );
+
+		s = openSession();
+		s.beginTransaction();
+		route = ( Route ) s.get( Route.class, route.getRouteID() );
+		checkResults( route, false );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testMergeDeliveryNode()
+	{
+
+		Route route = getUpdatedDetachedEntity();
+
+		clearCounts();
+
+		Session s = openSession();
+		s.beginTransaction();
+
+		Iterator it=route.getNodes().iterator();
+		Node node = ( Node ) it.next();
+		Node deliveryNode;
+		if ( node.getName().equals( "deliveryNodeB") ) {
+			deliveryNode = node;
+		}
+		else {
+			node = ( Node ) it.next();
+			assertEquals( "deliveryNodeB", node.getName() );
+			deliveryNode = node;
+		}
+
+		deliveryNode = ( Node ) s.merge( deliveryNode );
+
+		s.getTransaction().commit();
+		s.close();
+
+		assertInsertCount( 4 );
+		assertUpdateCount( 0 );
+
+		s = openSession();
+		s.beginTransaction();
+		route = ( Route ) s.get( Route.class, route.getRouteID() );
+		checkResults( route, false );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testMergeTour()
+	{
+
+		Route route = getUpdatedDetachedEntity();
+
+		clearCounts();
+
+		Session s = openSession();
+		s.beginTransaction();
+
+		Tour tour = ( Tour ) s.merge( ( ( Node ) route.getNodes().toArray()[0]).getTour() );
+
+		s.getTransaction().commit();
+		s.close();
+
+		assertInsertCount( 4 );
+		assertUpdateCount( 0 );
+
+		s = openSession();
+		s.beginTransaction();
+		route = ( Route ) s.get( Route.class, route.getRouteID() );
+		checkResults( route, false );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testMergeTransport()
+	{
+
+		Route route = getUpdatedDetachedEntity();
+
+		clearCounts();
+
+		Session s = openSession();
+		s.beginTransaction();
+
+		Node node = ( ( Node ) route.getNodes().toArray()[0]);
+		Transport transport;
+		if ( node.getPickupTransports().size() == 1 ) {
+			transport = ( Transport ) node.getPickupTransports().toArray()[0];
+		}
+		else {
+			transport = ( Transport ) node.getDeliveryTransports().toArray()[0];
+		}
+
+		transport = ( Transport ) s.merge( transport  );
+
+		s.getTransaction().commit();
+		s.close();
+
+		assertInsertCount( 4 );
+		assertUpdateCount( 0 );
+
+		s = openSession();
+		s.beginTransaction();
+		route = ( Route ) s.get( Route.class, route.getRouteID() );
+		checkResults( route, false );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	private Route getUpdatedDetachedEntity() {
+
+		Session s = openSession();
+		s.beginTransaction();
+
+		Route route = new Route();
+		route.setName("routeA");
+
+		s.save( route );
+		s.getTransaction().commit();
+		s.close();
+
+		route.setName( "new routeA" );
+		route.setTransientField(new String("sfnaouisrbn"));
+
+		Tour tour = new Tour();
+		tour.setName("tourB");
+
+		Transport transport = new Transport();
+		transport.setName("transportB");
+
+		Node pickupNode = new Node();
+		pickupNode.setName("pickupNodeB");
+
+		Node deliveryNode = new Node();
+		deliveryNode.setName("deliveryNodeB");
+
+		pickupNode.setRoute(route);
+		pickupNode.setTour(tour);
+		pickupNode.getPickupTransports().add(transport);
+		pickupNode.setTransientField("pickup node aaaaaaaaaaa");
+
+		deliveryNode.setRoute(route);
+		deliveryNode.setTour(tour);
+		deliveryNode.getDeliveryTransports().add(transport);
+		deliveryNode.setTransientField("delivery node aaaaaaaaa");
+
+		tour.getNodes().add(pickupNode);
+		tour.getNodes().add(deliveryNode);
+
+		route.getNodes().add(pickupNode);
+		route.getNodes().add(deliveryNode);
+
+		transport.setPickupNode(pickupNode);
+		transport.setDeliveryNode(deliveryNode);
+		transport.setTransientField("aaaaaaaaaaaaaa");
+
+		return route;
+	}
+
+	private void checkResults(Route route, boolean isRouteUpdated) {
+		// since merge is not cascaded to route, this method needs to
+		// know whether route is expected to be updated
+		if ( isRouteUpdated ) {
+			assertEquals( "new routeA", route.getName() );
+		}
+		assertEquals( 2, route.getNodes().size() );
+		Node deliveryNode = null;
+		Node pickupNode = null;
+		for( Iterator it=route.getNodes().iterator(); it.hasNext(); ) {
+			Node node = ( Node ) it.next();
+			if( "deliveryNodeB".equals( node.getName(  )  ) ) {
+				deliveryNode = node;
+			}
+			else if( "pickupNodeB".equals( node.getName() ) ) {
+				pickupNode = node;
+			}
+			else {
+				fail( "unknown node");
+			}
+		}
+		assertNotNull( deliveryNode );
+		assertSame( route, deliveryNode.getRoute() );
+		assertEquals( 1, deliveryNode.getDeliveryTransports().size() );
+		assertEquals( 0, deliveryNode.getPickupTransports().size() );
+		assertNotNull( deliveryNode.getTour() );
+		assertEquals( "node original value", deliveryNode.getTransientField() );
+
+		assertNotNull( pickupNode );
+		assertSame( route, pickupNode.getRoute() );
+		assertEquals( 0, pickupNode.getDeliveryTransports().size() );
+		assertEquals( 1, pickupNode.getPickupTransports().size() );
+		assertNotNull( pickupNode.getTour() );
+		assertEquals( "node original value", pickupNode.getTransientField() );
+
+		assertTrue( ! deliveryNode.getNodeID().equals( pickupNode.getNodeID() ) );
+		assertSame( deliveryNode.getTour(), pickupNode.getTour() );
+		assertSame( deliveryNode.getDeliveryTransports().iterator().next(),
+				pickupNode.getPickupTransports().iterator().next() );
+
+		Tour tour = deliveryNode.getTour();
+		Transport transport = ( Transport ) deliveryNode.getDeliveryTransports().iterator().next();
+
+		assertEquals( "tourB", tour.getName() );
+		assertEquals( 2, tour.getNodes().size() );
+		assertTrue( tour.getNodes().contains( deliveryNode ) );
+		assertTrue( tour.getNodes().contains( pickupNode ) );
+
+		assertEquals( "transportB", transport.getName() );
+		assertSame( deliveryNode, transport.getDeliveryNode() );
+		assertSame( pickupNode, transport.getPickupNode() );
+		assertEquals( "transport original value", transport.getTransientField() );
+	}
+
+	public void testMergeData3Nodes()
+	{
+
+		Session s = openSession();
+		s.beginTransaction();
+
+		Route route = new Route();
+		route.setName("routeA");
+
+		s.save( route );
+		s.getTransaction().commit();
+		s.close();
+
+		clearCounts();
+
+		s = openSession();
+		s.beginTransaction();
+
+		route = (Route) s.get(Route.class, new Long(1));
+		//System.out.println(route);
+		route.setName( "new routA" );
+
+		route.setTransientField(new String("sfnaouisrbn"));
+
+		Tour tour = new Tour();
+		tour.setName("tourB");
+
+		Transport transport1 = new Transport();
+		transport1.setName("TRANSPORT1");
+
+		Transport transport2 = new Transport();
+		transport2.setName("TRANSPORT2");
+
+		Node node1 = new Node();
+		node1.setName("NODE1");
+
+		Node node2 = new Node();
+		node2.setName("NODE2");
+
+		Node node3 = new Node();
+		node3.setName("NODE3");
+
+		node1.setRoute(route);
+		node1.setTour(tour);
+		node1.getPickupTransports().add(transport1);
+		node1.setTransientField("node 1");
+
+		node2.setRoute(route);
+		node2.setTour(tour);
+		node2.getDeliveryTransports().add(transport1);
+		node2.getPickupTransports().add(transport2);
+		node2.setTransientField("node 2");
+
+		node3.setRoute(route);
+		node3.setTour(tour);
+		node3.getDeliveryTransports().add(transport2);
+		node3.setTransientField("node 3");
+
+		tour.getNodes().add(node1);
+		tour.getNodes().add(node2);
+		tour.getNodes().add(node3);
+
+		route.getNodes().add(node1);
+		route.getNodes().add(node2);
+		route.getNodes().add(node3);
+
+		transport1.setPickupNode(node1);
+		transport1.setDeliveryNode(node2);
+		transport1.setTransientField("aaaaaaaaaaaaaa");
+
+		transport2.setPickupNode(node2);
+		transport2.setDeliveryNode(node3);
+		transport2.setTransientField("bbbbbbbbbbbbb");
+
+		Route mergedRoute = (Route) s.merge(route);
+
+		s.getTransaction().commit();
+		s.close();
+
+		assertInsertCount( 6 );
+		assertUpdateCount( 1 );
+	}
+
+	protected void clearCounts() {
+		getSessions().getStatistics().clear();
+	}
+
+	protected void assertInsertCount(int expected) {
+		int inserts = ( int ) getSessions().getStatistics().getEntityInsertCount();
+		assertEquals( "unexpected insert count", expected, inserts );
+	}
+
+	protected void assertUpdateCount(int expected) {
+		int updates = ( int ) getSessions().getStatistics().getEntityUpdateCount();
+		assertEquals( "unexpected update counts", expected, updates );
+	}
+
+	protected void assertDeleteCount(int expected) {
+		int deletes = ( int ) getSessions().getStatistics().getEntityDeleteCount();
+		assertEquals( "unexpected delete counts", expected, deletes );
+	}	
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/MultiPathCircleCascadeTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/Node.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/Node.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/Node.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,154 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+
+package org.hibernate.test.cascade.circle;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.HashSet;
+
+public class Node {
+
+//	@Id
+//	@SequenceGenerator(name="NODE_SEQ", sequenceName="NODE_SEQ", initialValue=1, allocationSize=1)
+//	@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="NODE_SEQ")
+	private Long nodeID;
+
+	private long version;
+	
+	private String name;
+	
+	/** the list of orders that are delivered at this node */
+//	@OneToMany(fetch=FetchType.LAZY, cascade={CascadeType.MERGE, CascadeType.REFRESH}, mappedBy="deliveryNode")
+	private Set deliveryTransports = new HashSet();
+	
+	/** the list of orders that are picked up at this node */
+//	@OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL, mappedBy="pickupNode")
+	private Set pickupTransports = new HashSet();
+	
+	/** the route to which this node belongs */
+//	@ManyToOne(targetEntity=Route.class, optional=false, fetch=FetchType.EAGER)
+//	@JoinColumn(name="ROUTEID", nullable=false, insertable=true, updatable=true)
+	private Route route = null;
+	
+	/** the tour this node belongs to, null if this node does not belong to a tour (e.g first node of a route) */
+//	@ManyToOne(targetEntity=Tour.class, cascade={CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}, optional=true, fetch=FetchType.LAZY)
+//	@JoinColumn(name="TOURID", nullable=true, insertable=true, updatable=true)
+	private Tour tour;
+	
+//	@Transient
+	private String transientField = "node original value";
+
+	public Set getDeliveryTransports() {
+		return deliveryTransports;
+	}
+
+	public void setDeliveryTransports(Set deliveryTransports) {
+		this.deliveryTransports = deliveryTransports;
+	}
+
+	public Set getPickupTransports() {
+		return pickupTransports;
+	}
+
+	public void setPickupTransports(Set pickupTransports) {
+		this.pickupTransports = pickupTransports;
+	}
+
+	public Long getNodeID() {
+		return nodeID;
+	}
+
+	public long getVersion() {
+		return version;
+	}
+
+	protected void setVersion(long version) {
+		this.version = version;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Route getRoute() {
+		return route;
+	}
+
+	public void setRoute(Route route) {
+		this.route = route;
+	}
+
+	public Tour getTour() {
+		return tour;
+	}
+	
+	public void setTour(Tour tour) {
+		this.tour = tour;
+	}
+
+	public String toString()
+	{
+		StringBuffer buffer = new StringBuffer();
+		
+		buffer.append( name + " id: " + nodeID );
+		if ( route != null ) {
+			buffer.append( " route name: " ).append( route.getName() ).append( " tour name: " ).append( tour.getName() );
+		}
+		if ( pickupTransports != null ) {
+			for (Iterator it = pickupTransports.iterator(); it.hasNext();) {
+				buffer.append("Pickup transports: " + it.next());
+			}
+		}
+		
+		if ( deliveryTransports != null ) {
+			for (Iterator it = deliveryTransports.iterator(); it.hasNext();) {
+				buffer.append("Delviery transports: " + it.next());
+			}
+		}
+		
+		return buffer.toString();
+	}
+
+	public String getTransientField() {
+		return transientField;
+	}
+
+	public void setTransientField(String transientField) {
+		this.transientField = transientField;
+	}
+
+	protected void setNodeID(Long nodeID) {
+		this.nodeID = nodeID;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/Node.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/Route.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/Route.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/Route.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,119 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+
+package org.hibernate.test.cascade.circle;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.HashSet;
+
+
+public class Route {
+	
+//	@Id
+//	@SequenceGenerator(name="ROUTE_SEQ", sequenceName="ROUTE_SEQ", initialValue=1, allocationSize=1)
+//	@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="ROUTE_SEQ")
+	private Long routeID;
+
+	private long version;
+
+	/** A List of nodes contained in this route. */
+//	@OneToMany(targetEntity=Node.class, fetch=FetchType.EAGER, cascade=CascadeType.ALL, mappedBy="route")
+	private Set nodes = new HashSet();
+
+	private Set vehicles = new HashSet();
+
+	private String name;
+	
+//	@Transient
+	private String transientField = null;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	protected Set getNodes() {
+		return nodes;
+	}
+
+	protected void setNodes(Set nodes) {
+		this.nodes = nodes;
+	}
+
+	protected Set getVehicles() {
+		return vehicles;
+	}
+
+	protected void setVehicles(Set vehicles) {
+		this.vehicles = vehicles;
+	}
+
+	protected void setRouteID(Long routeID) {
+		this.routeID = routeID;
+	}
+
+	public Long getRouteID() {
+		return routeID;
+	}
+	
+	public long getVersion() {
+		return version;
+	}
+
+	protected void setVersion(long version) {
+		this.version = version;
+	}
+
+	public String toString()
+	{
+		StringBuffer buffer = new StringBuffer();
+		
+		buffer.append("Route name: " + name + " id: " + routeID + " transientField: " + transientField + "\n");
+		for (Iterator it = nodes.iterator(); it.hasNext();) {
+			buffer.append("Node: " + (Node)it.next());
+		}
+		
+		for (Iterator it = vehicles.iterator(); it.hasNext();) {
+			buffer.append("Vehicle: " + (Vehicle)it.next());
+		}
+
+		return buffer.toString();
+	}
+
+	public String getTransientField() {
+		return transientField;
+	}
+
+	public void setTransientField(String transientField) {
+		this.transientField = transientField;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/Route.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/Tour.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/Tour.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/Tour.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,80 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.cascade.circle;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.HashSet;
+
+
+public class Tour {
+	
+//	@Id
+//	@SequenceGenerator(name="TOUR_SEQ", sequenceName="TOUR_SEQ", initialValue=1, allocationSize=1)
+//	@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="TOUR_SEQ")
+	private Long tourID;
+
+	private long version;
+
+	private String name;
+
+	/** A List of nodes contained in this tour. */
+//	@OneToMany(targetEntity=Node.class, fetch=FetchType.LAZY, cascade={CascadeType.MERGE, CascadeType.REFRESH}, mappedBy="tour")
+	private Set nodes = new HashSet(0);
+
+	public String getName() {
+		return name;
+	}
+
+	protected void setTourID(Long tourID) {
+		this.tourID = tourID;
+	}
+
+	public long getVersion() {
+		return version;
+	}
+
+	protected void setVersion(long version) {
+		this.version = version;
+	}	
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Set getNodes() {
+		return nodes;
+	}
+
+	public void setNodes(Set nodes) {
+		this.nodes = nodes;
+	}
+
+	public Long getTourID() {
+		return tourID;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/Tour.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/Transport.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/Transport.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/Transport.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,120 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+
+package org.hibernate.test.cascade.circle;
+
+
+public class Transport {
+	
+//	@Id
+//	@SequenceGenerator(name="TRANSPORT_SEQ", sequenceName="TRANSPORT_SEQ", initialValue=1, allocationSize=1)
+//	@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="TRANSPORT_SEQ")
+	private Long transportID;
+
+	private long version;
+
+	private String name;
+	
+	/** node value object at which the order is picked up */
+//	@ManyToOne(optional=false, cascade={CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}, fetch=FetchType.EAGER)
+//	@JoinColumn(name="PICKUPNODEID", /*nullable=false,*/insertable=true, updatable=true)
+	private Node pickupNode = null;
+
+	/** node value object at which the order is delivered */
+//	@ManyToOne(optional=false, cascade={CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}, fetch=FetchType.EAGER)
+//	@JoinColumn(name="DELIVERYNODEID", /*nullable=false,*/ insertable=true, updatable=true)
+	private Node deliveryNode = null;
+
+	private Vehicle vehicle;
+	
+//	@Transient
+	private String transientField = "transport original value";
+
+	public Node getDeliveryNode() {
+		return deliveryNode;
+	}
+
+	public void setDeliveryNode(Node deliveryNode) {
+		this.deliveryNode = deliveryNode;
+	}
+
+	public Node getPickupNode() {
+		return pickupNode;
+	}
+
+	protected void setTransportID(Long transportID) {
+		this.transportID = transportID;
+	}
+
+	public void setPickupNode(Node pickupNode) {
+		this.pickupNode = pickupNode;
+	}
+
+	public Vehicle getVehicle() {
+		return vehicle;
+	}
+
+	public void setVehicle(Vehicle vehicle) {
+		this.vehicle = vehicle;
+	}
+
+	public Long getTransportID() {
+		return transportID;
+	}
+
+	public long getVersion() {
+		return version;
+	}
+
+	protected void setVersion(long version) {
+		this.version = version;
+	}
+	
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	public String toString()
+	{
+		StringBuffer buffer = new StringBuffer();
+		
+		buffer.append(name + " id: " + transportID + "\n");
+		
+		return buffer.toString();
+	}
+
+	public String getTransientField() {
+		return transientField;
+	}
+
+	public void setTransientField(String transientField) {
+		this.transientField = transientField;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/Transport.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/Vehicle.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/Vehicle.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/Vehicle.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,106 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+
+package org.hibernate.test.cascade.circle;
+
+import java.util.Set;
+import java.util.HashSet;
+
+
+public class Vehicle {
+
+//	@Id
+//	@SequenceGenerator(name="TRANSPORT_SEQ", sequenceName="TRANSPORT_SEQ", initialValue=1, allocationSize=1)
+//	@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="TRANSPORT_SEQ")
+	private Long vehicleID;
+
+	private long version;
+
+	private String name;
+
+	private Set transports = new HashSet();
+
+	private Route route;
+
+	private String transientField = "vehicle original value";
+
+	protected void setVehicleID(Long vehicleID) {
+		this.vehicleID = vehicleID;
+	}
+
+	public Long getVehicleID() {
+		return vehicleID;
+	}
+
+	public long getVersion() {
+		return version;
+	}
+
+	protected void setVersion(long version) {
+		this.version = version;
+	}
+
+	public Set getTransports() {
+		return transports;
+	}
+
+	public void setTransports(Set transports) {
+		this.transports = transports;
+	}
+
+	public Route getRoute() {
+		return route;
+	}
+
+	public void setRoute(Route route) {
+		this.route = route;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String toString()
+	{
+		StringBuffer buffer = new StringBuffer();
+
+		buffer.append(name + " id: " + vehicleID + "\n");
+
+		return buffer.toString();
+	}
+
+	public String getTransientField() {
+		return transientField;
+	}
+
+	public void setTransientField(String transientField) {
+		this.transientField = transientField;
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cascade/circle/Vehicle.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cfg/Cacheable.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cfg/Cacheable.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cfg/Cacheable.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping>
+
+    <class entity-name="Entity">
+        <id name="id" type="long" column="ID">
+            <generator class="increment"/>
+        </id>
+        <property name="name" type="string" column="NAME"/>
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cfg/Cacheable.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cfg/CacheableFileTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cfg/CacheableFileTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cfg/CacheableFileTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,78 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.cfg;
+
+import java.io.File;
+
+import org.hibernate.cfg.Configuration;
+import org.hibernate.testing.junit.UnitTestCase;
+import org.hibernate.util.SerializationHelper;
+
+/**
+ * Tests using of cacheable configuration files.
+ *
+ * @author Steve Ebersole
+ */
+public class CacheableFileTest extends UnitTestCase {
+	public static final String MAPPING = "org/hibernate/test/cfg/Cacheable.hbm.xml";
+
+	private File mappingFile;
+	private File mappingBinFile;
+
+	public CacheableFileTest(String string) {
+		super( string );
+	}
+
+	protected void setUp() throws Exception {
+		super.setUp();
+		mappingFile = new File( getClass().getClassLoader().getResource( MAPPING ).toURI() );
+		assertTrue( mappingFile.exists() );
+		mappingBinFile = new File( mappingFile.getParentFile(), mappingFile.getName() + ".bin" );
+		if ( mappingBinFile.exists() ) {
+			//noinspection ResultOfMethodCallIgnored
+			mappingBinFile.delete();
+		}
+	}
+
+	protected void tearDown() throws Exception {
+		if ( mappingBinFile != null && mappingBinFile.exists() ) {
+			// be nice
+			//noinspection ResultOfMethodCallIgnored
+			mappingBinFile.delete();
+		}
+		mappingBinFile = null;
+		mappingFile = null;
+		super.tearDown();
+	}
+
+	public void testCachedFiles() throws Exception {
+		assertFalse( mappingBinFile.exists() );
+		// This call should create the cached file
+		new Configuration().addCacheableFile( mappingFile );
+		assertTrue( mappingBinFile.exists() );
+
+		Configuration cfg = new Configuration().addCacheableFileStrictly( mappingFile );
+		SerializationHelper.clone( cfg );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cfg/CacheableFileTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cfg/ConfigurationSerializationTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cfg/ConfigurationSerializationTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cfg/ConfigurationSerializationTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
+ * third-party contributors as indicated by either @author tags or express
+ * copyright attribution statements applied by the authors.  All
+ * third-party contributions are distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA\
+ */
+package org.hibernate.test.cfg;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.hibernate.testing.junit.UnitTestCase;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.util.SerializationHelper;
+import org.hibernate.SessionFactory;
+
+/**
+ * Copied over mostly from ConfigurationPerformanceTest
+ *
+ * @author Steve Ebersole
+ * @author Max Andersen
+ */
+public class ConfigurationSerializationTest extends UnitTestCase {
+	public ConfigurationSerializationTest(String string) {
+		super( string );
+	}
+
+	public static Test suite() {
+		return new TestSuite( ConfigurationSerializationTest.class );
+	}
+
+	private static final String[] FILES = new String[] {
+			"legacy/ABC.hbm.xml",
+			"legacy/ABCExtends.hbm.xml",
+			"legacy/Baz.hbm.xml",
+			"legacy/Blobber.hbm.xml",
+			"legacy/Broken.hbm.xml",
+			"legacy/Category.hbm.xml",
+			"legacy/Circular.hbm.xml",
+			"legacy/Commento.hbm.xml",
+			"legacy/ComponentNotNullMaster.hbm.xml",
+			"legacy/Componentizable.hbm.xml",
+			"legacy/Container.hbm.xml",
+			"legacy/Custom.hbm.xml",
+			"legacy/CustomSQL.hbm.xml",
+			"legacy/Eye.hbm.xml",
+			"legacy/Fee.hbm.xml",
+			"legacy/Fo.hbm.xml",
+			"legacy/FooBar.hbm.xml",
+			"legacy/Fum.hbm.xml",
+			"legacy/Fumm.hbm.xml",
+			"legacy/Glarch.hbm.xml",
+			"legacy/Holder.hbm.xml",
+			"legacy/IJ2.hbm.xml",
+			"legacy/Immutable.hbm.xml",
+			"legacy/Location.hbm.xml",
+			"legacy/Many.hbm.xml",
+			"legacy/Map.hbm.xml",
+			"legacy/Marelo.hbm.xml",
+			"legacy/MasterDetail.hbm.xml",
+			"legacy/Middle.hbm.xml",
+			"legacy/Multi.hbm.xml",
+			"legacy/MultiExtends.hbm.xml",
+			"legacy/Nameable.hbm.xml",
+			"legacy/One.hbm.xml",
+			"legacy/ParentChild.hbm.xml",
+			"legacy/Qux.hbm.xml",
+			"legacy/Simple.hbm.xml",
+			"legacy/SingleSeveral.hbm.xml",
+			"legacy/Stuff.hbm.xml",
+			"legacy/UpDown.hbm.xml",
+			"legacy/Vetoer.hbm.xml",
+			"legacy/WZ.hbm.xml",
+	};
+
+	public void testConfiguraionSerializability() {
+		Configuration cfg = new Configuration();
+		for ( String file : FILES ) {
+			cfg.addResource( "org/hibernate/test/" + file );
+		}
+
+		byte[] bytes = SerializationHelper.serialize( cfg );
+		cfg = ( Configuration ) SerializationHelper.deserialize( bytes );
+
+		// try to build SF
+		SessionFactory factory = cfg.buildSessionFactory();
+		factory.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cfg/ConfigurationSerializationTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cfg/ListenerTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cfg/ListenerTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cfg/ListenerTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,329 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.cfg;
+
+import java.util.Set;
+
+import org.hibernate.HibernateException;
+import org.hibernate.MappingException;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.event.DeleteEvent;
+import org.hibernate.event.DeleteEventListener;
+import org.hibernate.event.def.DefaultDeleteEventListener;
+import org.hibernate.testing.junit.UnitTestCase;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Gail Badner
+ */
+public class ListenerTest extends UnitTestCase {
+
+	public static class InvalidListenerForTest {
+	}
+
+	public static class DeleteListenerForTest implements DeleteEventListener {
+		public void onDelete(DeleteEvent event) throws HibernateException {
+		}
+
+		public void onDelete(DeleteEvent event, Set transientEntities) throws HibernateException {
+		}
+	}
+
+	public static class AnotherDeleteListenerForTest implements DeleteEventListener {
+		public void onDelete(DeleteEvent event) throws HibernateException {
+		}
+
+		public void onDelete(DeleteEvent event, Set transientEntities) throws HibernateException {
+		}
+	}
+
+	public ListenerTest(String string) {
+		super( string );
+	}
+
+	public void testSetListenerNullClass() {
+		Configuration cfg = new Configuration();
+		assertNotNull( cfg.getEventListeners().getDeleteEventListeners() );
+		cfg.setListener( "delete", null );
+		assertEquals( 0, cfg.getEventListeners().getDeleteEventListeners().length );
+	}
+
+	public void testSetListenersNullClass() {
+		Configuration cfg = new Configuration();
+		assertNotNull( cfg.getEventListeners().getDeleteEventListeners() );
+		cfg.setListeners( "delete", null );
+		assertEquals( 0, cfg.getEventListeners().getDeleteEventListeners().length );
+	}
+
+	public void testSetListenerEmptyClassNameArray() {
+		Configuration cfg = new Configuration();
+		assertNotNull( cfg.getEventListeners().getDeleteEventListeners() );
+		try {
+			cfg.setListener( "delete", new String[] { } );
+			fail( "should have thrown java.lang.ArrayStoreException" );
+		}
+		catch ( ArrayStoreException ex ) {
+			// expected
+		}
+	}
+
+	public void testSetListenersEmptyClassNsmeArray() {
+		Configuration cfg = new Configuration();
+		assertNotNull( cfg.getEventListeners().getDeleteEventListeners() );
+		cfg.setListeners( "delete", new String[] { } );
+		assertEquals( 0, cfg.getEventListeners().getDeleteEventListeners().length );
+	}
+
+	public void testSetListenerEmptyClassObjectArray() {
+		Configuration cfg = new Configuration();
+		assertNotNull( cfg.getEventListeners().getDeleteEventListeners() );
+		try {
+			cfg.setListener( "delete", new Object[] { } );
+			fail( "should have thrown java.lang.ArrayStoreException" );
+		}
+		catch ( ArrayStoreException ex ) {
+			// expected
+		}
+	}
+
+	public void testSetListenersEmptyClassObjectArray() {
+		Configuration cfg = new Configuration();
+		assertNotNull( cfg.getEventListeners().getDeleteEventListeners() );
+		try {
+			cfg.setListeners( "delete", new Object[] { } );
+			fail( "should have thrown ClassCastException" );
+		}
+		catch ( ClassCastException ex ) {
+			// expected
+		}
+	}
+
+	public void testSetListenerEmptyClassArray() {
+		Configuration cfg = new Configuration();
+		assertNotNull( cfg.getEventListeners().getDeleteEventListeners() );
+		try {
+			cfg.setListener( "delete", new DefaultDeleteEventListener[] { } );
+			fail( "should have thrown java.lang.ArrayStoreException" );
+		}
+		catch ( ArrayStoreException ex ) {
+			// expected
+		}
+	}
+
+	public void testSetListenersEmptyClassArray() {
+		Configuration cfg = new Configuration();
+		assertNotNull( cfg.getEventListeners().getDeleteEventListeners() );
+		cfg.setListeners( "delete", new DefaultDeleteEventListener[] { } );
+		assertEquals( 0, cfg.getEventListeners().getDeleteEventListeners().length );
+	}
+
+	public void testSetListenerUnknownClassName() {
+		Configuration cfg = new Configuration();
+		assertNotNull( cfg.getEventListeners().getDeleteEventListeners() );
+		try {
+			cfg.setListener( "delete", "UnknownClassName" );
+			fail( "should have thrown MappingException" );
+		}
+		catch ( MappingException ex ) {
+			// expected
+		}
+	}
+
+	public void testSetListenersUnknownClassName() {
+		Configuration cfg = new Configuration();
+		assertNotNull( cfg.getEventListeners().getDeleteEventListeners() );
+		try {
+			cfg.setListeners( "delete", new String[] { "UnknownClassName" } );
+			fail( "should have thrown MappingException" );
+		}
+		catch ( MappingException ex ) {
+			// expected
+		}
+	}
+
+	public void testSetListenerInvalidClassName() {
+		Configuration cfg = new Configuration();
+		assertNotNull( cfg.getEventListeners().getDeleteEventListeners() );
+		try {
+			cfg.setListener( "delete", InvalidListenerForTest.class.getName() );
+			fail( "should have thrown MappingException" );
+		}
+		catch ( MappingException ex ) {
+			// expected
+		}
+	}
+
+	public void testSetListenersInvalidClassName() {
+		Configuration cfg = new Configuration();
+		assertNotNull( cfg.getEventListeners().getDeleteEventListeners() );
+		try {
+			cfg.setListeners( "delete", new String[] { InvalidListenerForTest.class.getName() } );
+			fail( "should have thrown MappingException" );
+		}
+		catch ( MappingException ex ) {
+			// expected
+		}
+	}
+
+	public void testSetListenerClassName() {
+		Configuration cfg = new Configuration();
+		assertNotNull( cfg.getEventListeners().getDeleteEventListeners() );
+		cfg.setListener( "delete", DeleteListenerForTest.class.getName() );
+		assertEquals( 1, cfg.getEventListeners().getDeleteEventListeners().length );
+		assertTrue( cfg.getEventListeners().getDeleteEventListeners()[0] instanceof DeleteListenerForTest );
+	}
+
+	public void testSetListenersClassName() {
+		Configuration cfg = new Configuration();
+		assertNotNull( cfg.getEventListeners().getDeleteEventListeners() );
+		cfg.setListeners( "delete", new String[] { DeleteListenerForTest.class.getName() } );
+		assertEquals( 1, cfg.getEventListeners().getDeleteEventListeners().length );
+		assertTrue( cfg.getEventListeners().getDeleteEventListeners()[0] instanceof DeleteListenerForTest );
+	}
+
+	public void testSetListenerClassNames() {
+		Configuration cfg = new Configuration();
+		assertNotNull( cfg.getEventListeners().getDeleteEventListeners() );
+		try {
+			cfg.setListener(
+					"delete", new String[] {
+					DeleteListenerForTest.class.getName(),
+					AnotherDeleteListenerForTest.class.getName()
+			}
+			);
+			fail( "should have thrown java.lang.ArrayStoreException" );
+		}
+		catch ( ArrayStoreException ex ) {
+			// expected
+		}
+	}
+
+	public void testSetListenersClassNames() {
+		Configuration cfg = new Configuration();
+		assertNotNull( cfg.getEventListeners().getDeleteEventListeners() );
+		cfg.setListeners(
+				"delete", new String[] {
+				DeleteListenerForTest.class.getName(),
+				AnotherDeleteListenerForTest.class.getName()
+		}
+		);
+		assertEquals( 2, cfg.getEventListeners().getDeleteEventListeners().length );
+		assertTrue( cfg.getEventListeners().getDeleteEventListeners()[0] instanceof DeleteListenerForTest );
+		assertTrue( cfg.getEventListeners().getDeleteEventListeners()[1] instanceof AnotherDeleteListenerForTest );
+	}
+
+	public void testSetListenerClassInstance() {
+		Configuration cfg = new Configuration();
+		assertNotNull( cfg.getEventListeners().getDeleteEventListeners() );
+		cfg.setListener( "delete", new DeleteListenerForTest() );
+		assertEquals( 1, cfg.getEventListeners().getDeleteEventListeners().length );
+	}
+
+	public void testSetListenersClassInstances() {
+		Configuration cfg = new Configuration();
+		assertNotNull( cfg.getEventListeners().getDeleteEventListeners() );
+		cfg.setListeners(
+				"delete", new DeleteEventListener[] {
+				new DeleteListenerForTest(),
+				new AnotherDeleteListenerForTest()
+		}
+		);
+		assertEquals( 2, cfg.getEventListeners().getDeleteEventListeners().length );
+		assertTrue( cfg.getEventListeners().getDeleteEventListeners()[0] instanceof DeleteListenerForTest );
+		assertTrue( cfg.getEventListeners().getDeleteEventListeners()[1] instanceof AnotherDeleteListenerForTest );
+	}
+
+	public void testSetListenerInvalidClassInstance() {
+		Configuration cfg = new Configuration();
+		assertNotNull( cfg.getEventListeners().getDeleteEventListeners() );
+		try {
+			cfg.setListener( "delete", new InvalidListenerForTest() );
+			fail( "should have thrown java.lang.ArrayStoreException" );
+		}
+		catch ( ArrayStoreException ex ) {
+			// expected
+		}
+	}
+
+	public void testSetListenersInvalidClassInstances() {
+		Configuration cfg = new Configuration();
+		assertNotNull( cfg.getEventListeners().getDeleteEventListeners() );
+		try {
+			cfg.setListeners( "delete", new InvalidListenerForTest[] { new InvalidListenerForTest() } );
+			fail( "should have thrown java.lang.ClassCastException" );
+		}
+		catch ( ClassCastException ex ) {
+			// expected
+		}
+	}
+
+	public void testSetListenerNullType() {
+		Configuration cfg = new Configuration();
+		assertNotNull( cfg.getEventListeners().getDeleteEventListeners() );
+		try {
+			cfg.setListener( null, new DeleteListenerForTest() );
+			fail( "should have thrown MappingException" );
+		}
+		catch ( MappingException ex ) {
+			// expected
+		}
+	}
+
+	public void testSetListenersNullType() {
+		Configuration cfg = new Configuration();
+		assertNotNull( cfg.getEventListeners().getDeleteEventListeners() );
+		try {
+			cfg.setListeners( null, new DeleteEventListener[] { new DeleteListenerForTest() } );
+			fail( "should have thrown MappingException" );
+		}
+		catch ( MappingException ex ) {
+			// expected
+		}
+	}
+
+	public void testSetListenerUnknownType() {
+		Configuration cfg = new Configuration();
+		assertNotNull( cfg.getEventListeners().getDeleteEventListeners() );
+		try {
+			cfg.setListener( "unknown-type", new DeleteListenerForTest() );
+			fail( "should have thrown MappingException" );
+		}
+		catch ( MappingException ex ) {
+			// expected
+		}
+	}
+
+	public void testSetListenersUnknownType() {
+		Configuration cfg = new Configuration();
+		assertNotNull( cfg.getEventListeners().getDeleteEventListeners() );
+		try {
+			cfg.setListeners( "unknown-type", new DeleteEventListener[] { new DeleteListenerForTest() } );
+			fail( "should have thrown MappingException" );
+		}
+		catch ( MappingException ex ) {
+			// expected
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cfg/ListenerTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/CompositeIdTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/CompositeIdTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/CompositeIdTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,269 @@
+//$Id: CompositeIdTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.cid;
+
+import java.math.BigDecimal;
+import java.util.Calendar;
+import java.util.Iterator;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class CompositeIdTest extends FunctionalTestCase {
+	
+	public CompositeIdTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "cid/Customer.hbm.xml", "cid/Order.hbm.xml", "cid/LineItem.hbm.xml", "cid/Product.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite(CompositeIdTest.class);
+	}
+	
+	public void testQuery() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.createQuery("from LineItem ol where ol.order.id.customerId = 'C111'").list();
+		t.commit();
+		s.close();
+	}
+	
+	public void testCompositeIds() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		
+		Product p = new Product();
+		p.setProductId("A123");
+		p.setDescription("nipple ring");
+		p.setPrice( new BigDecimal(1.0) );
+		p.setNumberAvailable(1004);
+		s.persist(p);
+		
+		Product p2 = new Product();
+		p2.setProductId("X525");
+		p2.setDescription("nose stud");
+		p2.setPrice( new BigDecimal(3.0) );
+		p2.setNumberAvailable(105);
+		s.persist(p2);
+		
+		Customer c = new Customer();
+		c.setAddress("St Kilda Rd, MEL, 3000");
+		c.setName("Virginia");
+		c.setCustomerId("C111");
+		s.persist(c);
+		
+		Order o = new Order(c);
+		o.setOrderDate( Calendar.getInstance() );
+		LineItem li = new LineItem(o, p);
+		li.setQuantity(2);
+
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		o = (Order) s.get( Order.class, new Order.Id("C111", 0) );
+		assertEquals( o.getTotal().intValue(), 2 );
+		o.getCustomer().getName();
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery("from Customer c left join fetch c.orders o left join fetch o.lineItems li left join fetch li.product p").list();
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery("from Order o left join fetch o.lineItems li left join fetch li.product p").list();
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		Iterator iter = s.createQuery("select o.id, li.id from Order o join o.lineItems li").list().iterator();
+		while ( iter.hasNext() ) {
+			Object[] stuff = (Object[]) iter.next();
+			assertTrue(stuff.length==2);
+		}
+		iter = s.createQuery("from Order o join o.lineItems li").iterate();
+		while ( iter.hasNext() ) {
+			Object[] stuff = (Object[]) iter.next();
+			assertTrue(stuff.length==2);
+		}
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Customer) s.get( Customer.class, "C111" );
+		Order o2 = new Order(c);
+		o2.setOrderDate( Calendar.getInstance() );
+		s.flush();
+		LineItem li2 = new LineItem(o2, p2);
+		li2.setQuantity(5);
+		List bigOrders = s.createQuery("from Order o where o.total>10.0").list();
+		assertEquals( bigOrders.size(), 1 );
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery("delete from LineItem").executeUpdate();
+		s.createQuery("delete from Order").executeUpdate();
+		s.createQuery("delete from Customer").executeUpdate();
+		s.createQuery("delete from Product").executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	
+	public void testNonLazyFetch() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		
+		Product p = new Product();
+		p.setProductId("A123");
+		p.setDescription("nipple ring");
+		p.setPrice( new BigDecimal(1.0) );
+		p.setNumberAvailable(1004);
+		s.persist(p);
+		
+		Product p2 = new Product();
+		p2.setProductId("X525");
+		p2.setDescription("nose stud");
+		p2.setPrice( new BigDecimal(3.0) );
+		p2.setNumberAvailable(105);
+		s.persist(p2);
+		
+		Customer c = new Customer();
+		c.setAddress("St Kilda Rd, MEL, 3000");
+		c.setName("Virginia");
+		c.setCustomerId("C111");
+		s.persist(c);
+		
+		Order o = new Order(c);
+		o.setOrderDate( Calendar.getInstance() );
+		LineItem li = new LineItem(o, p);
+		li.setQuantity(2);
+
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		o = (Order) s.get( Order.class, new Order.Id("C111", 0) );
+		assertEquals( o.getTotal().intValue(), 2 );
+		o.getCustomer().getName();
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		o = (Order) s.createQuery("from Order o left join fetch o.lineItems li left join fetch li.product p").uniqueResult();
+		assertTrue( Hibernate.isInitialized( o.getLineItems() ) );
+		li = (LineItem) o.getLineItems().iterator().next();
+		assertTrue( Hibernate.isInitialized( li ) );
+		assertTrue( Hibernate.isInitialized( li.getProduct() ) );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		o = (Order) s.createQuery("from Order o").uniqueResult();
+		assertTrue( Hibernate.isInitialized( o.getLineItems() ) );
+		li = (LineItem) o.getLineItems().iterator().next();
+		assertTrue( Hibernate.isInitialized( li ) );
+		assertFalse( Hibernate.isInitialized( li.getProduct() ) );
+		t.commit();
+		s.close();
+		
+		
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery("delete from LineItem").executeUpdate();
+		s.createQuery("delete from Order").executeUpdate();
+		s.createQuery("delete from Customer").executeUpdate();
+		s.createQuery("delete from Product").executeUpdate();
+		t.commit();
+		s.close();
+		
+	}
+
+	public void testMultipleCollectionFetch() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		
+		Product p = new Product();
+		p.setProductId("A123");
+		p.setDescription("nipple ring");
+		p.setPrice( new BigDecimal(1.0) );
+		p.setNumberAvailable(1004);
+		s.persist(p);
+		
+		Product p2 = new Product();
+		p2.setProductId("X525");
+		p2.setDescription("nose stud");
+		p2.setPrice( new BigDecimal(3.0) );
+		p2.setNumberAvailable(105);
+		s.persist(p2);
+		
+		Customer c = new Customer();
+		c.setAddress("St Kilda Rd, MEL, 3000");
+		c.setName("Virginia");
+		c.setCustomerId("C111");
+		s.persist(c);
+		
+		Order o = new Order(c);
+		o.setOrderDate( Calendar.getInstance() );
+		LineItem li = new LineItem(o, p);
+		li.setQuantity(2);
+		LineItem li2 = new LineItem(o, p2);
+		li2.setQuantity(3);
+
+		Order o2 = new Order(c);
+		o2.setOrderDate( Calendar.getInstance() );
+		LineItem li3 = new LineItem(o2, p);
+		li3.setQuantity(1);
+		LineItem li4 = new LineItem(o2, p2);
+		li4.setQuantity(1);
+
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Customer) s.createQuery("from Customer c left join fetch c.orders o left join fetch o.lineItems li left join fetch li.product p").uniqueResult();
+		assertTrue( Hibernate.isInitialized( c.getOrders() ) );
+		assertEquals( c.getOrders().size(), 2 );
+		assertTrue( Hibernate.isInitialized( ( (Order) c.getOrders().get(0) ).getLineItems() ) );
+		assertTrue( Hibernate.isInitialized( ( (Order) c.getOrders().get(1) ).getLineItems() ) );
+		assertEquals( ( (Order) c.getOrders().get(0) ).getLineItems().size(), 2 );
+		assertEquals( ( (Order) c.getOrders().get(1) ).getLineItems().size(), 2 );
+		t.commit();
+		s.close();
+				
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery("delete from LineItem").executeUpdate();
+		s.createQuery("delete from Order").executeUpdate();
+		s.createQuery("delete from Customer").executeUpdate();
+		s.createQuery("delete from Product").executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/CompositeIdTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/CompositeIdWithGeneratorTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/CompositeIdWithGeneratorTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/CompositeIdWithGeneratorTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,510 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.cid;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Set;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Tests the use of composite-id with a generator.  
+ * Test this behavior in all the various entity states (transient, managed, detached) 
+ * and the different state transitions.
+ * 
+ * For HHH-2060.
+ * 
+ * @author Jacob Robertson
+ */
+public class CompositeIdWithGeneratorTest extends FunctionalTestCase {
+	
+	private DateFormat df;
+	
+	public CompositeIdWithGeneratorTest(String str) {
+		super(str);
+		df = SimpleDateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "cid/PurchaseRecord.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite(CompositeIdWithGeneratorTest.class);
+	}
+	
+	/**
+	 * Basic test that id can be generated for composite-id.
+	 */
+	public void testCompositeIdSimple() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		// persist the record to get the id generated
+		PurchaseRecord record = new PurchaseRecord();
+		s.persist(record);
+
+		t.commit();
+		s.close();
+
+		// test that the id was generated
+		PurchaseRecord.Id generatedId = record.getId();
+		Date timestamp = record.getTimestamp();
+		assertNotNull(generatedId);
+		assertNotNull( generatedId.getPurchaseSequence() );
+		assertTrue(generatedId.getPurchaseNumber() > 0);
+		
+		s = openSession();
+		t = s.beginTransaction();
+		
+		// find the record, and see that the ids match
+		PurchaseRecord find = (PurchaseRecord) s.get(PurchaseRecord.class, generatedId);
+		assertNotNull(find);
+		assertEquals( generatedId, find.getId() );
+		assertEquals( df.format(timestamp), df.format(find.getTimestamp()) );
+
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		
+		// generate another new record
+		PurchaseRecord record2 = new PurchaseRecord();
+		s.persist(record2);
+		
+		t.commit();
+		s.close();
+
+		PurchaseRecord.Id generatedId2 = record2.getId();
+		Date timestamp2 = record2.getTimestamp();
+
+		s = openSession();
+		t = s.beginTransaction();
+		
+		PurchaseRecord find2 = (PurchaseRecord) s.get(PurchaseRecord.class, generatedId2);
+		
+		t.commit();
+		s.close();
+		
+		// test that the ids are different
+		PurchaseRecord.Id id1 = find.getId();
+		PurchaseRecord.Id id2 = find2.getId();
+		String seq1 = id1.getPurchaseSequence();
+		String seq2 = id2.getPurchaseSequence();
+		int num1 = id1.getPurchaseNumber();
+		int num2 = id2.getPurchaseNumber();
+		
+		assertEquals( df.format(timestamp2), df.format(find2.getTimestamp()) );
+		assertFalse( id1.equals(id2) );
+		assertFalse( seq1.equals(seq2) );
+		assertFalse(num1 == num2);
+	}
+
+	/**
+	 * Tests the behavior of properties in detached objects.
+	 */
+	public void testDetachedProperty() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		// persist the record
+		PurchaseRecord record = new PurchaseRecord();
+		s.persist(record);
+		
+		// close session so we know the record is detached
+		t.commit();
+		s.close();
+
+		PurchaseRecord.Id generatedId = record.getId();
+
+		// change a non-id property, but do not persist
+		Date persistedTimestamp = record.getTimestamp();
+		Date newTimestamp = new Date(persistedTimestamp.getTime() + 1);
+		record.setTimestamp(newTimestamp);
+		
+		s = openSession();
+		t = s.beginTransaction();
+
+		PurchaseRecord find = (PurchaseRecord) s.get(PurchaseRecord.class, generatedId);
+		
+		t.commit();
+		s.close();
+
+		// see that we get the original id, and the original timestamp
+		assertEquals( generatedId, find.getId() );
+		assertEquals( df.format(persistedTimestamp), df.format(find.getTimestamp()) );
+		
+		s = openSession();
+		t = s.beginTransaction();
+
+		// update with the new timestamp
+		s.update(record);
+		
+		t.commit();
+		s.close();
+		
+		// find the newly updated record
+		s = openSession();
+		t = s.beginTransaction();
+		
+		PurchaseRecord find2 = (PurchaseRecord) s.get(PurchaseRecord.class, generatedId);
+		
+		t.commit();
+		s.close();
+
+		// see that we get the original id, and the new timestamp
+		assertEquals( generatedId, find2.getId() );
+		assertEquals( df.format(newTimestamp), df.format(find2.getTimestamp()) );
+	}
+
+	/**
+	 * Tests the behavior of the id in detached objects.
+	 */
+	public void testDetachedId() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Date timestamp1 = new Date();
+		Date timestamp2 = new Date(timestamp1.getTime() + 1);
+
+		// persist two records
+		PurchaseRecord record1 = new PurchaseRecord();
+		record1.setTimestamp(timestamp1);
+		PurchaseRecord record2 = new PurchaseRecord();
+		record2.setTimestamp(timestamp2);
+		s.persist(record1);
+		s.persist(record2);
+		
+		// close session so we know the records are detached
+		t.commit();
+		s.close();
+
+		PurchaseRecord.Id generatedId1 = record1.getId();
+		PurchaseRecord.Id generatedId2 = record2.getId();
+		
+		// change the ids around - effectively making record1 have the same id as record2
+		// do not persist yet
+		PurchaseRecord.Id toChangeId1 = new PurchaseRecord.Id();
+		toChangeId1.setPurchaseNumber( record2.getId().getPurchaseNumber() );
+		toChangeId1.setPurchaseSequence( record2.getId().getPurchaseSequence() );
+		record1.setId(toChangeId1);
+		
+		s = openSession();
+		t = s.beginTransaction();
+
+		PurchaseRecord find1 = (PurchaseRecord) s.get(PurchaseRecord.class, generatedId1);
+		PurchaseRecord find2 = (PurchaseRecord) s.get(PurchaseRecord.class, generatedId2);
+		
+		t.commit();
+		s.close();
+
+		// see that we get the original ids (and timestamps)
+		// i.e. weren't changed by changing the detached object
+		assertEquals( generatedId1, find1.getId() );
+		assertEquals( df.format(timestamp1), df.format(find1.getTimestamp()) );
+		assertEquals( generatedId2, find2.getId() );
+		assertEquals( df.format(timestamp2), df.format(find2.getTimestamp()) );
+		
+		s = openSession();
+		t = s.beginTransaction();
+
+		// update with the new changed record id
+		s.update(record1);
+		
+		t.commit();
+		s.close();
+
+		// test that record1 did not get a new generated id, and kept record2's id
+		PurchaseRecord.Id foundId1 = record1.getId();
+		assertSame(toChangeId1, foundId1);
+		assertEquals( toChangeId1.getPurchaseNumber(), foundId1.getPurchaseNumber() );
+		assertEquals( toChangeId1.getPurchaseSequence(), foundId1.getPurchaseSequence() );
+		
+		// find record 2 and see that it has the timestamp originally found in record 1
+		s = openSession();
+		t = s.beginTransaction();
+		
+		find2 = (PurchaseRecord) s.get(PurchaseRecord.class, generatedId2);
+		
+		t.commit();
+		s.close();
+
+		// see that we get the original id (2), and the new timestamp (1)
+		assertEquals( df.format(timestamp1), df.format(find2.getTimestamp()) );
+		assertEquals( generatedId2, find2.getId() );
+	}
+
+	/**
+	 * Tests the behavior of saveOrUpdate (as opposed to calling "persist").
+	 */
+	public void testSaveOrUpdate() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Date timestamp1 = new Date();
+		Date timestamp2 = new Date(timestamp1.getTime() + 1);
+
+		// persist the record
+		PurchaseRecord record = new PurchaseRecord();
+		record.setTimestamp(timestamp1);
+		s.saveOrUpdate(record);
+		
+		t.commit();
+		s.close();
+
+		// test that the id was generated
+		PurchaseRecord.Id generatedId = record.getId();
+		assertNotNull(generatedId);
+		assertNotNull( generatedId.getPurchaseSequence() );
+		
+		// change the timestamp
+		record.setTimestamp(timestamp2);
+		
+		s = openSession();
+		t = s.beginTransaction();
+
+		s.saveOrUpdate(record);
+		
+		t.commit();
+		s.close();
+
+		// see that we get the *same* id, and the new timestamp
+		assertSame( generatedId, record.getId() );
+		assertEquals( df.format(timestamp2), df.format(record.getTimestamp()) );
+	}
+
+	/**
+	 * Tests the behavior of load.
+	 */
+	public void testLoad() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		// persist the record, then get the id and timestamp back
+		PurchaseRecord record = new PurchaseRecord();
+		s.persist(record);
+		
+		t.commit();
+		s.close();
+
+		PurchaseRecord.Id id = record.getId();
+		Date timestamp = record.getTimestamp();
+		
+		// using the given id, load a transient record
+		PurchaseRecord toLoad = new PurchaseRecord();
+		
+		s = openSession();
+		t = s.beginTransaction();
+
+		s.load(toLoad, id);
+		
+		t.commit();
+		s.close();
+		
+		// show that the correct timestamp and ids were loaded
+		assertEquals( id, toLoad.getId() );
+		assertEquals( df.format(timestamp), df.format(toLoad.getTimestamp()) );
+	}
+	
+	/**
+	 * Tests the behavior of evict.
+	 */
+	public void testEvict() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Date timestamp1 = new Date();
+		Date timestamp2 = new Date(timestamp1.getTime() + 1);
+		
+		// persist the record, then evict it, then make changes to it ("within" the session)
+		PurchaseRecord record = new PurchaseRecord();
+		record.setTimestamp(timestamp1);
+		s.persist(record);
+		s.flush();
+		s.evict(record);
+		
+		record.setTimestamp(timestamp2);
+		
+		t.commit();
+		s.close();
+
+		PurchaseRecord.Id generatedId = record.getId();
+		
+		// now, re-fetch the record and show that the timestamp change wasn't persisted
+		s = openSession();
+		t = s.beginTransaction();
+
+		PurchaseRecord persistent = (PurchaseRecord) s.get(PurchaseRecord.class, generatedId);
+		
+		t.commit();
+		s.close();
+		
+		assertEquals( generatedId, persistent.getId() );
+		assertEquals( df.format(timestamp1), df.format(persistent.getTimestamp()) );
+	}
+	
+	/**
+	 * Tests the behavior of merge.
+	 */
+	public void testMerge() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Date timestamp1 = new Date();
+		Date timestamp2 = new Date(timestamp1.getTime() + 1);
+
+		// persist the record
+		PurchaseRecord record = new PurchaseRecord();
+		s.persist(record);
+		
+		t.commit();
+		s.close();
+
+		// test that the id was generated
+		PurchaseRecord.Id generatedId = record.getId();
+		assertNotNull(generatedId);
+		assertNotNull( generatedId.getPurchaseSequence() );
+		
+		s = openSession();
+		t = s.beginTransaction();
+
+		// update detached object, retrieve persistent object, then merge
+		PurchaseRecord detached = record;
+		detached.setTimestamp(timestamp2);
+		PurchaseRecord persistent = (PurchaseRecord) s.get(PurchaseRecord.class, generatedId);
+		
+		// show that the timestamp hasn't changed
+		assertEquals( df.format(timestamp1), df.format(persistent.getTimestamp()) );
+		
+		s.merge(detached);
+		
+		t.commit();
+		s.close();
+
+		// show that the persistent object was changed only after the session flush
+		assertEquals( timestamp2, persistent.getTimestamp() );
+		
+		// show that the persistent store was updated - not just the in-memory object
+		s = openSession();
+		t = s.beginTransaction();
+
+		persistent = (PurchaseRecord) s.get(PurchaseRecord.class, generatedId);
+
+		t.commit();
+		s.close();
+		
+		assertEquals( df.format(timestamp2), df.format(persistent.getTimestamp()) );
+	}
+	
+	/**
+	 * Tests the behavior of delete.
+	 */
+	public void testDelete() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		// persist the record
+		PurchaseRecord record = new PurchaseRecord();
+		s.saveOrUpdate(record);
+		
+		t.commit();
+		s.close();
+
+		PurchaseRecord.Id generatedId = record.getId();
+		
+		// re-fetch, then delete the record
+		s = openSession();
+		t = s.beginTransaction();
+
+		PurchaseRecord find = (PurchaseRecord) s.get(PurchaseRecord.class, generatedId);
+		s.delete(find);
+		assertFalse( s.contains(find) );
+		
+		t.commit();
+		s.close();
+
+		// attempt to re-fetch - show it was deleted
+		s = openSession();
+		t = s.beginTransaction();
+
+		find = (PurchaseRecord) s.get(PurchaseRecord.class, generatedId);
+
+		t.commit();
+		s.close();
+		
+		assertNull(find);
+	}
+	
+	/**
+	 * Simple test to demonstrate the ids can be generated even when using children.
+	 */
+	public void testGeneratedIdsWithChildren() {
+		
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		// set up the record and details
+		PurchaseRecord record = new PurchaseRecord();
+		Set details = record.getDetails();
+		details.add( new PurchaseDetail(record, "p at 1", 1) );
+		details.add( new PurchaseDetail(record, "p at 2", 2) );
+
+		s.persist(record);
+		
+		t.commit();
+		s.close();
+		
+		// show that the ids were generated (non-zero) and come out the same
+		int foundPurchaseNumber = record.getId().getPurchaseNumber();
+		String foundPurchaseSequence = record.getId().getPurchaseSequence();
+		assertNotNull( record.getId() );
+		assertTrue(foundPurchaseNumber > 0);
+		assertNotNull(foundPurchaseSequence);
+		
+		// search on detail1 by itself and show it got the parent's id
+		s = openSession();
+		t = s.beginTransaction();
+
+		// doAfterTransactionCompletion a find to show that it will wire together fine
+		PurchaseRecord foundRecord = (PurchaseRecord) s.get(PurchaseRecord.class,
+				new PurchaseRecord.Id(foundPurchaseNumber, foundPurchaseSequence)
+				);
+		
+		t.commit();
+		s.close();
+
+		// some simple test to see it fetched
+		assertEquals( 2, foundRecord.getDetails().size() );
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/CompositeIdWithGeneratorTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/Customer.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/Customer.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/Customer.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+  This mapping demonstrates how to map a collection
+  <key> to one of the primary key columns of an
+  associated child class with a composite key. This
+  is very useful for legacy data!
+     
+-->
+
+<hibernate-mapping package="org.hibernate.test.cid">
+
+    <class name="Customer">
+    
+    	<id name="customerId"
+    		length="10">
+    		<generator class="assigned"/>
+    	</id>
+
+    	<property name="name" not-null="true" length="100"/>
+    	<property name="address" not-null="true" length="200"/>
+
+    	<list name="orders"
+    		inverse="true"
+    		cascade="save-update">
+    		<key column="customerId"/>
+    		<index column="orderNumber"/>
+    		<one-to-many class="Order"/>
+    	</list>
+
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/Customer.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/Customer.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/Customer.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/Customer.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,73 @@
+//$Id: Customer.java 4806 2004-11-25 14:37:00Z steveebersole $
+package org.hibernate.test.cid;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.GregorianCalendar;
+import java.math.BigDecimal;
+
+/**
+ * @author Gavin King
+ */
+public class Customer {
+	private String customerId;
+	private String name;
+	private String address;
+	private List orders = new ArrayList();
+	/**
+	 * @return Returns the address.
+	 */
+	public String getAddress() {
+		return address;
+	}
+	/**
+	 * @param address The address to set.
+	 */
+	public void setAddress(String address) {
+		this.address = address;
+	}
+	/**
+	 * @return Returns the customerId.
+	 */
+	public String getCustomerId() {
+		return customerId;
+	}
+	/**
+	 * @param customerId The customerId to set.
+	 */
+	public void setCustomerId(String customerId) {
+		this.customerId = customerId;
+	}
+	/**
+	 * @return Returns the name.
+	 */
+	public String getName() {
+		return name;
+	}
+	/**
+	 * @param name The name to set.
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+	/**
+	 * @return Returns the orders.
+	 */
+	public List getOrders() {
+		return orders;
+	}
+	/**
+	 * @param orders The orders to set.
+	 */
+	public void setOrders(List orders) {
+		this.orders = orders;
+	}
+
+	public Order generateNewOrder(BigDecimal total) {
+		Order order = new Order(this);
+		order.setOrderDate( new GregorianCalendar() );
+		order.setTotal( total );
+
+		return order;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/Customer.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/LineItem.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/LineItem.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/LineItem.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,49 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+  This mapping demonstrates 
+  
+     (1) composite keys and many-to-one associations on 
+         composite keys
+      
+     (2) use of insert="false" update="false" on an
+         association mapping, when the foreign key is
+         also part of the primary key
+     
+-->
+
+<hibernate-mapping package="org.hibernate.test.cid">
+
+    <class name="LineItem">
+    	
+    	<composite-id name="id" 
+    		class="LineItem$Id">
+    		<key-property name="customerId" length="10"/>
+    		<key-property name="orderNumber"/>
+    		<key-property name="productId" length="10"/>
+    	</composite-id>
+    	
+    	<property name="quantity"/>
+    	
+    	<many-to-one name="order"
+    		insert="false"
+			update="false" 
+			not-null="true">
+			<column name="customerId"/>
+			<column name="orderNumber"/>
+		</many-to-one>
+    	
+    	<many-to-one name="product"
+    		insert="false"
+			update="false" 
+			not-null="true"
+			column="productId"/>
+			
+    </class>
+ 	
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/LineItem.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/LineItem.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/LineItem.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/LineItem.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,137 @@
+//$Id: LineItem.java 4806 2004-11-25 14:37:00Z steveebersole $
+package org.hibernate.test.cid;
+
+import java.io.Serializable;
+
+/**
+ * @author Gavin King
+ */
+public class LineItem {
+	public static class Id implements Serializable {
+		private String customerId;
+		private int orderNumber;
+		private String productId;
+
+		public Id(String customerId, int orderNumber, String productId) {
+			this.customerId = customerId;
+			this.orderNumber = orderNumber;
+			this.productId = productId;
+		}
+		public Id() {}
+
+		/**
+		 * @return Returns the customerId.
+		 */
+		public String getCustomerId() {
+			return customerId;
+		}
+		/**
+		 * @param customerId The customerId to set.
+		 */
+		public void setCustomerId(String customerId) {
+			this.customerId = customerId;
+		}
+		/**
+		 * @return Returns the productId.
+		 */
+		public String getProductId() {
+			return productId;
+		}
+		/**
+		 * @param productId The productId to set.
+		 */
+		public void setProductId(String productId) {
+			this.productId = productId;
+		}
+		/**
+		 * @return Returns the orderNumber.
+		 */
+		public int getOrderNumber() {
+			return orderNumber;
+		}
+		/**
+		 * @param orderNumber The orderNumber to set.
+		 */
+		public void setOrderNumber(int orderNumber) {
+			this.orderNumber = orderNumber;
+		}
+		public int hashCode() {
+			return customerId.hashCode() + orderNumber + productId.hashCode();
+		}
+		public boolean equals(Object other) {
+			if (other instanceof Id) {
+				Id that = (Id) other;
+				return that.customerId.equals(this.customerId) &&
+					that.productId.equals(this.productId) &&
+					that.orderNumber == this.orderNumber;
+			}
+			else {
+				return false;
+			}
+		}
+	}
+
+	private Id id = new Id();
+	private int quantity;
+	private Order order;
+	private Product product;
+
+	public LineItem(Order o, Product p) {
+		this.order = o;
+		this.id.orderNumber = o.getId().getOrderNumber();
+		this.id.customerId = o.getId().getCustomerId();
+		this.id.productId = p.getProductId();
+		o.getLineItems().add(this);
+	}
+
+	public LineItem() {}
+
+	/**
+	 * @return Returns the order.
+	 */
+	public Order getOrder() {
+		return order;
+	}
+	/**
+	 * @param order The order to set.
+	 */
+	public void setOrder(Order order) {
+		this.order = order;
+	}
+	/**
+	 * @return Returns the product.
+	 */
+	public Product getProduct() {
+		return product;
+	}
+	/**
+	 * @param product The product to set.
+	 */
+	public void setProduct(Product product) {
+		this.product = product;
+	}
+	/**
+	 * @return Returns the quantity.
+	 */
+	public int getQuantity() {
+		return quantity;
+	}
+	/**
+	 * @param quantity The quantity to set.
+	 */
+	public void setQuantity(int quantity) {
+		this.quantity = quantity;
+	}
+	/**
+	 * @return Returns the id.
+	 */
+	public Id getId() {
+		return id;
+	}
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(Id id) {
+		this.id = id;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/LineItem.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/Order.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/Order.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/Order.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,66 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.cid">
+
+<!-- 
+
+  This mapping demonstrates 
+  
+     (1) composite keys and one-to-many associations on 
+         composite keys
+      
+     (2) use of insert="false" update="false" on an
+         association mapping, when the foreign key is
+         also part of the primary key
+         
+     (3) use of a derived property which performs a
+         subselect against associated tables
+         
+     (4) use of <synchronize/> to ensure that auto-flush
+         works correctly for an entity with a property
+         derived from other tables
+         
+     
+-->
+
+    <class name="Order" table="CustomerOrder">
+    	<synchronize table="LineItem"/>
+    	<synchronize table="Product"/>
+    	
+    	<composite-id name="id" 
+    		class="Order$Id">
+    		<key-property name="customerId" length="10"/>
+    		<key-property name="orderNumber"/>
+    	</composite-id>
+    	
+    	<property name="orderDate" 
+    		type="calendar_date"
+    		not-null="true"/>
+    	
+    	<property name="total" 
+    		formula="( select sum(li.quantity*p.cost) from LineItem li, Product p where li.productId = p.productId and li.customerId = customerId and li.orderNumber = orderNumber )"/>
+    	
+    	<many-to-one name="customer"
+    		column="customerId"
+    		insert="false"
+			update="false" 
+			not-null="true"/>
+			
+    	<bag name="lineItems"
+    		fetch="join" 
+    		lazy="false"
+    		inverse="true"
+    		cascade="save-update">
+    		<key>
+    			<column name="customerId"/>
+    			<column name="orderNumber"/>
+    		</key>
+    		<one-to-many class="LineItem"/>
+    	</bag>
+    	
+    </class>
+ 	
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/Order.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/Order.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/Order.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/Order.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,145 @@
+//$Id: Order.java 4806 2004-11-25 14:37:00Z steveebersole $
+package org.hibernate.test.cid;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Collection;
+
+/**
+ * @author Gavin King
+ */
+public class Order {
+	public static class Id implements Serializable {
+		private String customerId;
+		private int orderNumber;
+
+		public Id(String customerId, int orderNumber) {
+			this.customerId = customerId;
+			this.orderNumber = orderNumber;
+		}
+		public Id() {}
+
+		/**
+		 * @return Returns the customerId.
+		 */
+		public String getCustomerId() {
+			return customerId;
+		}
+		/**
+		 * @param customerId The customerId to set.
+		 */
+		public void setCustomerId(String customerId) {
+			this.customerId = customerId;
+		}
+		/**
+		 * @return Returns the orderNumber.
+		 */
+		public int getOrderNumber() {
+			return orderNumber;
+		}
+		/**
+		 * @param orderNumber The orderNumber to set.
+		 */
+		public void setOrderNumber(int orderNumber) {
+			this.orderNumber = orderNumber;
+		}
+		public int hashCode() {
+			return customerId.hashCode() + orderNumber;
+		}
+		public boolean equals(Object other) {
+			if (other instanceof Id) {
+				Id that = (Id) other;
+				return that.customerId.equals(this.customerId) &&
+					that.orderNumber == this.orderNumber;
+			}
+			else {
+				return false;
+			}
+		}
+	}
+
+	private Id id = new Id();
+	private Calendar orderDate;
+	private Customer customer;
+	private Collection lineItems = new ArrayList();
+	private BigDecimal total;
+
+	public Order(Customer customer) {
+		this.customer = customer;
+		this.id.customerId = customer.getCustomerId();
+		this.id.orderNumber = customer.getOrders().size();
+		customer.getOrders().add(this);
+	}
+
+	public Order() {}
+
+	/**
+	 * @return Returns the customer.
+	 */
+	public Customer getCustomer() {
+		return customer;
+	}
+	/**
+	 * @param customer The customer to set.
+	 */
+	public void setCustomer(Customer customer) {
+		this.customer = customer;
+	}
+	/**
+	 * @return Returns the lineItems.
+	 */
+	public Collection getLineItems() {
+		return lineItems;
+	}
+	/**
+	 * @param lineItems The lineItems to set.
+	 */
+	public void setLineItems(Collection lineItems) {
+		this.lineItems = lineItems;
+	}
+	/**
+	 * @return Returns the orderDate.
+	 */
+	public Calendar getOrderDate() {
+		return orderDate;
+	}
+	/**
+	 * @param orderDate The orderDate to set.
+	 */
+	public void setOrderDate(Calendar orderDate) {
+		this.orderDate = orderDate;
+	}
+	/**
+	 * @return Returns the total.
+	 */
+	public BigDecimal getTotal() {
+		return total;
+	}
+	/**
+	 * @param total The total to set.
+	 */
+	public void setTotal(BigDecimal total) {
+		this.total = total;
+	}
+	/**
+	 * @return Returns the id.
+	 */
+	public Id getId() {
+		return id;
+	}
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(Id id) {
+		this.id = id;
+	}
+
+	public LineItem generateLineItem( Product product, int quantity ) {
+		LineItem li = new LineItem( this, product );
+		li.setQuantity( quantity );
+		lineItems.add( li );
+		return li;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/Order.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/Product.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/Product.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/Product.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,40 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.cid">
+
+<!-- 
+
+  This mapping demonstrates 
+
+     (1) use of a derived property which performs a
+         subselect against an associated table
+         
+     (2) use of <synchronize/> to ensure that auto-flush
+         works correctly for an entity with a property
+         derived from another table
+         
+     
+-->
+
+    <class name="Product">
+    	<synchronize table="LineItem"/>
+    
+    	<id name="productId"
+    		length="10">
+    		<generator class="assigned"/>
+    	</id>
+    	
+    	<property name="description" 
+    		not-null="true" 
+    		length="200"/>
+    	<property name="price" length="3" column="cost"/>
+    	<property name="numberAvailable"/>
+    	
+    	<property name="numberOrdered"
+    		formula="( select sum(li.quantity) from LineItem li where li.productId = productId )"/>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/Product.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/Product.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/Product.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/Product.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,75 @@
+//$Id: Product.java 4806 2004-11-25 14:37:00Z steveebersole $
+package org.hibernate.test.cid;
+
+import java.math.BigDecimal;
+
+/**
+ * @author Gavin King
+ */
+public class Product {
+	private String productId;
+	private String description;
+	private BigDecimal price;
+	private int numberAvailable;
+	private int numberOrdered;
+	/**
+	 * @return Returns the description.
+	 */
+	public String getDescription() {
+		return description;
+	}
+	/**
+	 * @param description The description to set.
+	 */
+	public void setDescription(String description) {
+		this.description = description;
+	}
+	/**
+	 * @return Returns the numberAvailable.
+	 */
+	public int getNumberAvailable() {
+		return numberAvailable;
+	}
+	/**
+	 * @param numberAvailable The numberAvailable to set.
+	 */
+	public void setNumberAvailable(int numberAvailable) {
+		this.numberAvailable = numberAvailable;
+	}
+	/**
+	 * @return Returns the numberOrdered.
+	 */
+	public int getNumberOrdered() {
+		return numberOrdered;
+	}
+	/**
+	 * @param numberOrdered The numberOrdered to set.
+	 */
+	public void setNumberOrdered(int numberOrdered) {
+		this.numberOrdered = numberOrdered;
+	}
+	/**
+	 * @return Returns the productId.
+	 */
+	public String getProductId() {
+		return productId;
+	}
+	/**
+	 * @param productId The productId to set.
+	 */
+	public void setProductId(String productId) {
+		this.productId = productId;
+	}
+	/**
+	 * @return Returns the price.
+	 */
+	public BigDecimal getPrice() {
+		return price;
+	}
+	/**
+	 * @param price The price to set.
+	 */
+	public void setPrice(BigDecimal price) {
+		this.price = price;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/Product.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/PurchaseDetail.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/PurchaseDetail.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/PurchaseDetail.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,81 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.cid;
+
+
+/**
+ * @author Jacob Robertson
+ */
+public class PurchaseDetail {
+	
+	private PurchaseRecord purchaseRecord;
+	
+	private String productId;
+	private int quantity;
+	
+	public PurchaseDetail(PurchaseRecord record, String productId, int quantity) {
+		this.productId = productId;
+		this.quantity = quantity;
+		this.purchaseRecord = record;
+	}
+	public PurchaseDetail() {}
+	
+	
+	/**
+	 * @return the purchaseRecord
+	 */
+	public PurchaseRecord getPurchaseRecord() {
+		return purchaseRecord;
+	}
+	/**
+	 * @param purchaseRecord the purchaseRecord to set
+	 */
+	public void setPurchaseRecord(PurchaseRecord purchaseRecord) {
+		this.purchaseRecord = purchaseRecord;
+	}
+	/**
+	 * @return the quantity
+	 */
+	public int getQuantity() {
+		return quantity;
+	}
+	/**
+	 * @param quantity the quantity to set
+	 */
+	public void setQuantity(int quantity) {
+		this.quantity = quantity;
+	}
+	/**
+	 * @return the productId
+	 */
+	public String getProductId() {
+		return productId;
+	}
+	/**
+	 * @param productId the productId to set
+	 */
+	public void setProductId(String productId) {
+		this.productId = productId;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/PurchaseDetail.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/PurchaseRecord.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/PurchaseRecord.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/PurchaseRecord.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,81 @@
+<?xml version="1.0"?>
+<!--
+  ~ Hibernate, Relational Persistence for Idiomatic Java
+  ~
+  ~ Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+  ~ indicated by the @author tags or express copyright attribution
+  ~ statements applied by the authors.  All third-party contributions are
+  ~ distributed under license by Red Hat Middleware LLC.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, as published by the Free Software Foundation.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  ~ or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+  ~ for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public License
+  ~ along with this distribution; if not, write to:
+  ~ Free Software Foundation, Inc.
+  ~ 51 Franklin Street, Fifth Floor
+  ~ Boston, MA  02110-1301  USA
+  -->
+
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+  This mapping demonstrates composite-id using a generator.
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.cid">
+
+    <class name="PurchaseRecord">
+    	
+    	<composite-id name="id" 
+    		class="PurchaseRecord$Id">
+    		<key-property name="purchaseNumber"/>
+    		<key-property name="purchaseSequence"/>
+    		<generator class="org.hibernate.test.cid.PurchaseRecordIdGenerator"/>
+    	</composite-id>
+    	
+		<set name="details" 
+			lazy="false" 
+			inverse="true" 
+			cascade="all">
+		    <key>
+			    <column name="purchaseNumber"/>
+			    <column name="purchaseSequence"/>
+		    </key>
+		    <one-to-many class="PurchaseDetail"/>
+		</set>		
+		
+		<property name="timestamp" column="`timestamp`"/>
+    	
+    </class>
+
+    <class name="PurchaseDetail">
+    	
+    	<id name="productId" 
+    		type="string" 
+    		column="productId">
+    		<generator class="assigned"/>
+    	</id>
+    	
+    	<property name="quantity"/>
+    	
+ 		<many-to-one name="purchaseRecord" 
+	        class="PurchaseRecord"
+	        not-null="true">
+	     	<column name="purchaseNumber"/>
+	     	<column name="purchaseSequence"/>
+	     </many-to-one>
+    	
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/PurchaseRecord.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/PurchaseRecord.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/PurchaseRecord.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/PurchaseRecord.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,130 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.cid;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author Jacob Robertson
+ */
+public class PurchaseRecord {
+	public static class Id implements Serializable {
+		private int purchaseNumber;
+		private String purchaseSequence;
+
+		public Id(int purchaseNumber, String purchaseSequence) {
+			this.purchaseNumber = purchaseNumber;
+			this.purchaseSequence = purchaseSequence;
+		}
+		public Id() {}
+
+		/**
+		 * @return Returns the purchaseNumber.
+		 */
+		public int getPurchaseNumber() {
+			return purchaseNumber;
+		}
+		/**
+		 * @param purchaseNumber The purchaseNumber to set.
+		 */
+		public void setPurchaseNumber(int purchaseNumber) {
+			this.purchaseNumber = purchaseNumber;
+		}
+		/**
+		 * @return the purchaseSequence
+		 */
+		public String getPurchaseSequence() {
+			return purchaseSequence;
+		}
+		/**
+		 * @param purchaseSequence the purchaseSequence to set
+		 */
+		public void setPurchaseSequence(String purchaseSequence) {
+			this.purchaseSequence = purchaseSequence;
+		}
+		public int hashCode() {
+			return purchaseNumber + purchaseSequence.hashCode();
+		}
+		public boolean equals(Object other) {
+			if (other instanceof Id) {
+				Id that = (Id) other;
+				return purchaseSequence.equals(this.purchaseSequence) &&
+					that.purchaseNumber == this.purchaseNumber;
+			}
+			else {
+				return false;
+			}
+		}
+	}
+
+	private Id id;
+	private Date timestamp = new Date();
+	private Set details = new HashSet();
+
+	public PurchaseRecord() {}
+
+	/**
+	 * @return Returns the id.
+	 */
+	public Id getId() {
+		return id;
+	}
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(Id id) {
+		this.id = id;
+	}
+
+	/**
+	 * @return the details
+	 */
+	public Set getDetails() {
+		return details;
+	}
+
+	/**
+	 * @param details the details to set
+	 */
+	public void setDetails(Set details) {
+		this.details = details;
+	}
+
+	/**
+	 * @return the timestamp
+	 */
+	public Date getTimestamp() {
+		return timestamp;
+	}
+
+	/**
+	 * @param timestamp the timestamp to set
+	 */
+	public void setTimestamp(Date timestamp) {
+		this.timestamp = timestamp;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/PurchaseRecord.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/PurchaseRecordIdGenerator.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/PurchaseRecordIdGenerator.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/PurchaseRecordIdGenerator.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,47 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.cid;
+
+import java.io.Serializable;
+
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.id.IdentityGenerator;
+
+/**
+ * Simple {@link IdentityGenerator} implementation for testing composite-id.
+ * 
+ * @author Jacob Robertson
+ */
+public class PurchaseRecordIdGenerator extends IdentityGenerator {
+
+	private static int nextPurchaseNumber = 2;
+	private static int nextPurchaseSequence = 3;
+	
+	public Serializable generate(SessionImplementor s, Object obj) {
+		return new PurchaseRecord.Id(
+				nextPurchaseNumber++, 
+				String.valueOf(nextPurchaseSequence++));
+	}
+	
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cid/PurchaseRecordIdGenerator.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/backref/map/compkey/BackrefCompositeMapKeyTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/backref/map/compkey/BackrefCompositeMapKeyTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/backref/map/compkey/BackrefCompositeMapKeyTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,284 @@
+/*
+ * Copyright (c) 2007, Red Hat Middleware, LLC. All rights reserved.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, v. 2.1. This program is distributed in the
+ * hope that it will be useful, but WITHOUT A WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details. You should have received a
+ * copy of the GNU Lesser General Public License, v.2.1 along with this
+ * distribution; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Red Hat Author(s): Steve Ebersole
+ */
+package org.hibernate.test.collection.backref.map.compkey;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.LockMode;
+import org.hibernate.Hibernate;
+import org.hibernate.util.SerializationHelper;
+
+/**
+ * BackrefCompositeMapKeyTest implementation.  Test access to a composite map-key
+ * backref via a number of different access methods.
+ *
+ * @author Steve Ebersole
+ */
+public class BackrefCompositeMapKeyTest extends FunctionalTestCase {
+	public BackrefCompositeMapKeyTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "collection/backref/map/compkey/Mappings.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( BackrefCompositeMapKeyTest.class );
+	}
+
+	public void testOrphanDeleteOnDelete() {
+		Session session = openSession();
+		Transaction t = session.beginTransaction();
+		Product prod = new Product( "Widget" );
+		Part part = new Part( "Widge", "part if a Widget" );
+		MapKey mapKey = new MapKey( "Top" );
+		prod.getParts().put( mapKey, part );
+		Part part2 = new Part( "Get", "another part if a Widget" );
+		prod.getParts().put( new MapKey( "Bottom" ), part2 );
+		session.persist( prod );
+		session.flush();
+
+		prod.getParts().remove( mapKey );
+
+		session.delete( prod );
+
+		t.commit();
+		session.close();
+
+		session = openSession();
+		t = session.beginTransaction();
+		assertNull( "Orphan 'Widge' was not deleted", session.get(Part.class, "Widge") );
+		assertNull( "Orphan 'Get' was not deleted", session.get(Part.class, "Get") );
+		assertNull( "Orphan 'Widget' was not deleted", session.get(Product.class, "Widget") );
+		t.commit();
+		session.close();
+	}
+
+	public void testOrphanDeleteAfterPersist() {
+		Session session = openSession();
+		Transaction t = session.beginTransaction();
+		Product prod = new Product( "Widget" );
+		Part part = new Part( "Widge", "part if a Widget" );
+		MapKey mapKey = new MapKey( "Top" );
+		prod.getParts().put( mapKey, part );
+		Part part2 = new Part( "Get", "another part if a Widget" );
+		prod.getParts().put( new MapKey( "Bottom" ), part2 );
+		session.persist( prod );
+
+		prod.getParts().remove( mapKey );
+
+		t.commit();
+		session.close();
+
+		session = openSession();
+		t = session.beginTransaction();
+		session.delete( session.get(Product.class, "Widget") );
+		t.commit();
+		session.close();
+	}
+
+	public void testOrphanDeleteAfterPersistAndFlush() {
+		Session session = openSession();
+		Transaction t = session.beginTransaction();
+		Product prod = new Product( "Widget" );
+		Part part = new Part( "Widge", "part if a Widget" );
+		MapKey mapKey = new MapKey( "Top" );
+		prod.getParts().put( mapKey, part );
+		Part part2 = new Part( "Get", "another part if a Widget" );
+		prod.getParts().put( new MapKey( "Bottom" ), part2 );
+		session.persist( prod );
+		session.flush();
+
+		prod.getParts().remove( mapKey );
+
+		t.commit();
+		session.close();
+
+		session = openSession();
+		t = session.beginTransaction();
+		assertNull( session.get(Part.class, "Widge") );
+		assertNotNull( session.get(Part.class, "Get") );
+		session.delete( session.get(Product.class, "Widget") );
+		t.commit();
+		session.close();
+	}
+
+	public void testOrphanDeleteAfterLock() {
+		Session session = openSession();
+		Transaction t = session.beginTransaction();
+		Product prod = new Product( "Widget" );
+		Part part = new Part( "Widge", "part if a Widget" );
+		MapKey mapKey = new MapKey( "Top" );
+		prod.getParts().put( mapKey, part );
+		Part part2 = new Part( "Get", "another part if a Widget" );
+		prod.getParts().put( new MapKey( "Bottom" ),part2 );
+		session.persist( prod );
+		t.commit();
+		session.close();
+
+
+		session = openSession();
+		t = session.beginTransaction();
+		session.lock(prod, LockMode.READ);
+		prod.getParts().remove(mapKey);
+		t.commit();
+		session.close();
+
+		session = openSession();
+		t = session.beginTransaction();
+		assertNull( session.get(Part.class, "Widge") );
+		assertNotNull( session.get(Part.class, "Get") );
+		session.delete( session.get(Product.class, "Widget") );
+		t.commit();
+		session.close();
+	}
+
+	public void testOrphanDeleteOnSaveOrUpdate() {
+		Session session = openSession();
+		Transaction t = session.beginTransaction();
+		Product prod = new Product( "Widget" );
+		Part part = new Part( "Widge", "part if a Widget" );
+		MapKey mapKey = new MapKey( "Top" );
+		prod.getParts().put( mapKey, part );
+		Part part2 = new Part( "Get", "another part if a Widget" );
+		prod.getParts().put( new MapKey( "Bottom" ), part2 );
+		session.persist( prod );
+		t.commit();
+		session.close();
+
+		prod.getParts().remove( mapKey );
+
+		session = openSession();
+		t = session.beginTransaction();
+		session.saveOrUpdate(prod);
+		t.commit();
+		session.close();
+
+		session = openSession();
+		t = session.beginTransaction();
+		assertNull( session.get(Part.class, "Widge") );
+		assertNotNull( session.get(Part.class, "Get") );
+		session.delete( session.get(Product.class, "Widget") );
+		t.commit();
+		session.close();
+	}
+
+	public void testOrphanDeleteOnSaveOrUpdateAfterSerialization() {
+		Session session = openSession();
+		Transaction t = session.beginTransaction();
+		Product prod = new Product( "Widget" );
+		Part part = new Part( "Widge", "part if a Widget" );
+		MapKey mapKey = new MapKey( "Top" );
+		prod.getParts().put( mapKey, part );
+		Part part2 = new Part( "Get", "another part if a Widget" );
+		prod.getParts().put( new MapKey( "Bottom" ), part2 );
+		session.persist( prod );
+		t.commit();
+		session.close();
+
+		prod.getParts().remove( mapKey );
+
+		prod = (Product) SerializationHelper.clone( prod );
+
+		session = openSession();
+		t = session.beginTransaction();
+		session.saveOrUpdate(prod);
+		t.commit();
+		session.close();
+
+		session = openSession();
+		t = session.beginTransaction();
+		assertNull( session.get(Part.class, "Widge") );
+		assertNotNull( session.get(Part.class, "Get") );
+		session.delete( session.get(Product.class, "Widget") );
+		t.commit();
+		session.close();
+	}
+
+	public void testOrphanDelete() {
+		Session session = openSession();
+		Transaction t = session.beginTransaction();
+		Product prod = new Product( "Widget" );
+		Part part = new Part( "Widge", "part if a Widget" );
+		MapKey mapKey = new MapKey( "Top" );
+		prod.getParts().put( mapKey, part );
+		Part part2 = new Part( "Get", "another part if a Widget" );
+		prod.getParts().put( new MapKey( "Bottom" ), part2 );
+		session.persist( prod );
+		t.commit();
+		session.close();
+
+		getSessions().evict(Product.class);
+		getSessions().evict(Part.class);
+
+		session = openSession();
+		t = session.beginTransaction();
+		prod = (Product) session.get(Product.class, "Widget");
+		assertTrue( Hibernate.isInitialized( prod.getParts() ) );
+		part = (Part) session.get(Part.class, "Widge");
+		prod.getParts().remove(mapKey);
+		t.commit();
+		session.close();
+
+		getSessions().evict(Product.class);
+		getSessions().evict(Part.class);
+
+		session = openSession();
+		t = session.beginTransaction();
+		prod = (Product) session.get(Product.class, "Widget");
+		assertTrue( Hibernate.isInitialized( prod.getParts() ) );
+		assertNull( prod.getParts().get(new MapKey("Top")));
+		assertNotNull( session.get(Part.class, "Get") );
+		session.delete( session.get(Product.class, "Widget") );
+		t.commit();
+		session.close();
+	}
+
+	public void testOrphanDeleteOnMerge() {
+		Session session = openSession();
+		Transaction t = session.beginTransaction();
+		Product prod = new Product( "Widget" );
+		Part part = new Part( "Widge", "part if a Widget" );
+		MapKey mapKey = new MapKey( "Top" );
+		prod.getParts().put( mapKey, part );
+		Part part2 = new Part( "Get", "another part if a Widget" );
+		prod.getParts().put( new MapKey("Bottom"), part2 );
+		session.persist( prod );
+		t.commit();
+		session.close();
+
+		prod.getParts().remove( mapKey );
+
+		session = openSession();
+		t = session.beginTransaction();
+		session.merge(prod);
+		t.commit();
+		session.close();
+
+		session = openSession();
+		t = session.beginTransaction();
+		assertNull( session.get(Part.class, "Widge") );
+		assertNotNull( session.get(Part.class, "Get") );
+		session.delete( session.get(Product.class, "Widget") );
+		t.commit();
+		session.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/backref/map/compkey/BackrefCompositeMapKeyTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/backref/map/compkey/MapKey.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/backref/map/compkey/MapKey.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/backref/map/compkey/MapKey.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2007, Red Hat Middleware, LLC. All rights reserved.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, v. 2.1. This program is distributed in the
+ * hope that it will be useful, but WITHOUT A WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details. You should have received a
+ * copy of the GNU Lesser General Public License, v.2.1 along with this
+ * distribution; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Red Hat Author(s): Steve Ebersole
+ */
+package org.hibernate.test.collection.backref.map.compkey;
+
+import java.io.Serializable;
+
+/**
+ * A composite map key.
+ *
+ * @author Steve Ebersole
+ */
+public class MapKey implements Serializable {
+	private String role;
+
+	public MapKey() {
+	}
+
+	public MapKey(String role) {
+		this.role = role;
+	}
+
+	public String getRole() {
+		return role;
+	}
+
+	public boolean equals(Object o) {
+		if ( this == o ) {
+			return true;
+		}
+		if ( o == null || getClass() != o.getClass() ) {
+			return false;
+		}
+
+		MapKey mapKey = ( MapKey ) o;
+
+		if ( !role.equals( mapKey.role ) ) {
+			return false;
+		}
+
+		return true;
+	}
+
+	public int hashCode() {
+		return role.hashCode();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/backref/map/compkey/MapKey.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/backref/map/compkey/Mappings.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/backref/map/compkey/Mappings.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/backref/map/compkey/Mappings.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,45 @@
+<?xml version="1.0"?>
+<!--
+  ~ Copyright (c) 2007, Red Hat Middleware, LLC. All rights reserved.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, v. 2.1. This program is distributed in the
+  ~ hope that it will be useful, but WITHOUT A WARRANTY; without even the implied
+  ~ warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  ~ Lesser General Public License for more details. You should have received a
+  ~ copy of the GNU Lesser General Public License, v.2.1 along with this
+  ~ distribution; if not, write to the Free Software Foundation, Inc.,
+  ~ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+  ~
+  ~ Red Hat Author(s): Steve Ebersole
+  -->
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+    Demonstrates a unidirectional map mapping where the map key is a
+    composite.  The unidirectional collection forces Hibernate to use
+    a backref.  We want to make sure the backref works properly with
+    the component.
+-->
+<hibernate-mapping package="org.hibernate.test.collection.backref.map.compkey" default-access="field">
+
+    <class name="Product" table="t_product">
+        <id name="name"/>
+        <map name="parts" table="Parts" cascade="all,delete-orphan" fetch="join">
+            <key column="productName" not-null="true"/>
+            <composite-map-key class="MapKey">
+                <key-property name="role" column="role_"/>
+            </composite-map-key>
+            <one-to-many class="Part"/>
+        </map>
+    </class>
+
+    <class name="Part" table="t_part">
+        <id name="name"/>
+        <property name="description" not-null="true"/>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/backref/map/compkey/Mappings.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/backref/map/compkey/Part.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/backref/map/compkey/Part.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/backref/map/compkey/Part.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2007, Red Hat Middleware, LLC. All rights reserved.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, v. 2.1. This program is distributed in the
+ * hope that it will be useful, but WITHOUT A WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details. You should have received a
+ * copy of the GNU Lesser General Public License, v.2.1 along with this
+ * distribution; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Red Hat Author(s): Steve Ebersole
+ */
+package org.hibernate.test.collection.backref.map.compkey;
+
+import java.io.Serializable;
+
+/**
+ * Part implementation
+ *
+ * @author Steve Ebersole
+ */
+public class Part implements Serializable {
+	private String name;
+	private String description;
+
+	public Part() {
+	}
+
+	public Part(String name) {
+		this.name = name;
+	}
+
+	public Part(String name, String description) {
+		this.name = name;
+		this.description = description;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public String getDescription() {
+		return description;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/backref/map/compkey/Part.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/backref/map/compkey/Product.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/backref/map/compkey/Product.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/backref/map/compkey/Product.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2007, Red Hat Middleware, LLC. All rights reserved.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, v. 2.1. This program is distributed in the
+ * hope that it will be useful, but WITHOUT A WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details. You should have received a
+ * copy of the GNU Lesser General Public License, v.2.1 along with this
+ * distribution; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Red Hat Author(s): Steve Ebersole
+ */
+package org.hibernate.test.collection.backref.map.compkey;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Product implementation
+ *
+ * @author Steve Ebersole
+ */
+public class Product implements Serializable {
+	private String name;
+	private Map parts = new HashMap();
+
+	public Product() {
+	}
+
+	public Product(String name) {
+		this.name = name;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public Map getParts() {
+		return parts;
+	}
+
+	public void setParts(Map parts) {
+		this.parts = parts;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/backref/map/compkey/Product.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/bag/BagOwner.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/bag/BagOwner.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/bag/BagOwner.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,46 @@
+package org.hibernate.test.collection.bag;
+
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class BagOwner {
+	private String name;
+	private BagOwner parent;
+	private List children = new ArrayList();
+
+	public BagOwner() {
+	}
+
+	public BagOwner(String name) {
+		this.name = name;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public BagOwner getParent() {
+		return parent;
+	}
+
+	public void setParent(BagOwner parent) {
+		this.parent = parent;
+	}
+
+	public List getChildren() {
+		return children;
+	}
+
+	public void setChildren(List children) {
+		this.children = children;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/bag/BagOwner.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/bag/Mappings.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/bag/Mappings.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/bag/Mappings.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+
+<hibernate-mapping package="org.hibernate.test.collection.bag">
+
+    <class name="BagOwner">
+		<id name="name" column="NAME" type="string" />
+
+        <many-to-one name="parent" class="BagOwner" cascade="none" />
+
+        <bag name="children" inverse="true" cascade="all">
+            <key column="PARENT" />
+            <one-to-many class="BagOwner" />
+        </bag>
+	</class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/bag/Mappings.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/bag/PersistentBagTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/bag/PersistentBagTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/bag/PersistentBagTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,70 @@
+package org.hibernate.test.collection.bag;
+
+import java.util.ArrayList;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.collection.PersistentBag;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Tests related to operations on a PersistentBag.
+ *
+ * @author Steve Ebersole
+ */
+public class PersistentBagTest extends FunctionalTestCase {
+	public PersistentBagTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "collection/bag/Mappings.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( PersistentBagTest.class );
+	}
+
+	public void testWriteMethodDirtying() {
+		BagOwner parent = new BagOwner( "root" );
+		BagOwner child = new BagOwner( "c1" );
+		parent.getChildren().add( child );
+		child.setParent( parent );
+		BagOwner otherChild = new BagOwner( "c2" );
+
+		Session session = openSession();
+		session.beginTransaction();
+		session.save( parent );
+		session.flush();
+		// at this point, the list on parent has now been replaced with a PersistentBag...
+		PersistentBag children = ( PersistentBag ) parent.getChildren();
+
+		assertFalse( children.remove( otherChild ) );
+		assertFalse( children.isDirty() );
+
+		ArrayList otherCollection = new ArrayList();
+		otherCollection.add( child );
+		assertFalse( children.retainAll( otherCollection ) );
+		assertFalse( children.isDirty() );
+
+		otherCollection = new ArrayList();
+		otherCollection.add( otherChild );
+		assertFalse( children.removeAll( otherCollection ) );
+		assertFalse( children.isDirty() );
+
+		children.clear();
+		session.delete( child );
+		assertTrue( children.isDirty() );
+
+		session.flush();
+
+		children.clear();
+		assertFalse( children.isDirty() );
+
+		session.delete( parent );
+		session.getTransaction().commit();
+		session.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/bag/PersistentBagTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/idbag/IdbagOwner.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/idbag/IdbagOwner.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/idbag/IdbagOwner.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,37 @@
+package org.hibernate.test.collection.idbag;
+
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class IdbagOwner {
+	private String name;
+	private List children = new ArrayList();
+
+	public IdbagOwner() {
+	}
+
+	public IdbagOwner(String name) {
+		this.name = name;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public List getChildren() {
+		return children;
+	}
+
+	public void setChildren(List children) {
+		this.children = children;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/idbag/IdbagOwner.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/idbag/Mappings.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/idbag/Mappings.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/idbag/Mappings.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+
+<hibernate-mapping package="org.hibernate.test.collection.idbag">
+
+    <class name="IdbagOwner">
+		<id name="name" column="NAME" type="string" />
+
+        <idbag name="children" cascade="all" table="idbag_owner_children">
+            <collection-id column="CHILD" type="long">
+                <generator class="increment"/>
+            </collection-id>
+            <key column="PARENT_FK" />
+            <many-to-many column="CHILD_FK" class="IdbagOwner" />
+        </idbag>
+	</class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/idbag/Mappings.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/idbag/PersistentIdBagTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/idbag/PersistentIdBagTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/idbag/PersistentIdBagTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,69 @@
+package org.hibernate.test.collection.idbag;
+
+import java.util.ArrayList;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.collection.PersistentIdentifierBag;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Tests related to operations on a PersistentIdentifierBag
+ *
+ * @author Steve Ebersole
+ */
+public class PersistentIdBagTest extends FunctionalTestCase {
+	public PersistentIdBagTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "collection/idbag/Mappings.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( PersistentIdBagTest.class );
+	}
+
+	public void testWriteMethodDirtying() {
+		IdbagOwner parent = new IdbagOwner( "root" );
+		IdbagOwner child = new IdbagOwner( "c1" );
+		parent.getChildren().add( child );
+		IdbagOwner otherChild = new IdbagOwner( "c2" );
+
+		Session session = openSession();
+		session.beginTransaction();
+		session.save( parent );
+		session.flush();
+		// at this point, the list on parent has now been replaced with a PersistentBag...
+		PersistentIdentifierBag children = ( PersistentIdentifierBag ) parent.getChildren();
+
+		assertFalse( children.remove( otherChild ) );
+		assertFalse( children.isDirty() );
+
+		ArrayList otherCollection = new ArrayList();
+		otherCollection.add( child );
+		assertFalse( children.retainAll( otherCollection ) );
+		assertFalse( children.isDirty() );
+
+		otherCollection = new ArrayList();
+		otherCollection.add( otherChild );
+		assertFalse( children.removeAll( otherCollection ) );
+		assertFalse( children.isDirty() );
+
+		children.clear();
+		session.delete( child );
+		assertTrue( children.isDirty() );
+
+		session.flush();
+
+		children.clear();
+		assertFalse( children.isDirty() );
+
+		session.delete( parent );
+		session.getTransaction().commit();
+		session.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/idbag/PersistentIdBagTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/list/ListOwner.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/list/ListOwner.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/list/ListOwner.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,46 @@
+package org.hibernate.test.collection.list;
+
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class ListOwner {
+	private String name;
+	private ListOwner parent;
+	private List children = new ArrayList();
+
+	public ListOwner() {
+	}
+
+	public ListOwner(String name) {
+		this.name = name;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public ListOwner getParent() {
+		return parent;
+	}
+
+	public void setParent(ListOwner parent) {
+		this.parent = parent;
+	}
+
+	public List getChildren() {
+		return children;
+	}
+
+	public void setChildren(List children) {
+		this.children = children;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/list/ListOwner.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/list/Mappings.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/list/Mappings.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/list/Mappings.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+
+<hibernate-mapping package="org.hibernate.test.collection.list">
+
+    <class name="ListOwner">
+		<id name="name" column="NAME" type="string" />
+
+        <many-to-one name="parent" class="ListOwner" cascade="none" />
+
+        <list name="children" inverse="true" cascade="all">
+            <key column="PARENT" />
+            <list-index column="LIST_INDEX"/>
+            <one-to-many class="ListOwner" />
+        </list>
+	</class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/list/Mappings.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/list/PersistentListTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/list/PersistentListTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/list/PersistentListTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,70 @@
+package org.hibernate.test.collection.list;
+
+import java.util.ArrayList;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.collection.PersistentList;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Tests related to operations on a PersistentList
+ *
+ * @author Steve Ebersole
+ */
+public class PersistentListTest extends FunctionalTestCase {
+	public PersistentListTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "collection/list/Mappings.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( PersistentListTest.class );
+	}
+
+	public void testWriteMethodDirtying() {
+		ListOwner parent = new ListOwner( "root" );
+		ListOwner child = new ListOwner( "c1" );
+		parent.getChildren().add( child );
+		child.setParent( parent );
+		ListOwner otherChild = new ListOwner( "c2" );
+
+		Session session = openSession();
+		session.beginTransaction();
+		session.save( parent );
+		session.flush();
+		// at this point, the list on parent has now been replaced with a PersistentList...
+		PersistentList children = ( PersistentList ) parent.getChildren();
+
+		assertFalse( children.remove( otherChild ) );
+		assertFalse( children.isDirty() );
+
+		ArrayList otherCollection = new ArrayList();
+		otherCollection.add( child );
+		assertFalse( children.retainAll( otherCollection ) );
+		assertFalse( children.isDirty() );
+
+		otherCollection = new ArrayList();
+		otherCollection.add( otherChild );
+		assertFalse( children.removeAll( otherCollection ) );
+		assertFalse( children.isDirty() );
+
+		children.clear();
+		session.delete( child );
+		assertTrue( children.isDirty() );
+
+		session.flush();
+
+		children.clear();
+		assertFalse( children.isDirty() );
+
+		session.delete( parent );
+		session.getTransaction().commit();
+		session.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/list/PersistentListTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/map/Child.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/map/Child.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/map/Child.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,34 @@
+package org.hibernate.test.collection.map;
+
+/**
+ * todo: describe Child
+ *
+ * @author Steve Ebersole
+ */
+public class Child {
+	private String name;
+	private Parent parent;
+
+	public Child() {
+	}
+
+	public Child(String name) {
+		this.name = name;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Parent getParent() {
+		return parent;
+	}
+
+	public void setParent(Parent parent) {
+		this.parent = parent;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/map/Child.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/map/Mappings.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/map/Mappings.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/map/Mappings.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+
+<hibernate-mapping package="org.hibernate.test.collection.map">
+
+    <class name="Parent">
+		<id name="name" column="NAME" type="string" />
+
+        <map name="children" inverse="true" cascade="all">
+            <key column="PARENT" />
+            <map-key type="string" formula="NAME"/>
+            <one-to-many class="Child" />
+        </map>
+	</class>
+
+    <class name="Child">
+        <id name="name" column="NAME" type="string"/>
+        <many-to-one name="parent" class="Parent" cascade="none" />
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/map/Mappings.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/map/Parent.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/map/Parent.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/map/Parent.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,48 @@
+package org.hibernate.test.collection.map;
+
+import java.util.Map;
+import java.util.HashMap;
+
+/**
+ * todo: describe Parent
+ *
+ * @author Steve Ebersole
+ */
+public class Parent {
+	private String name;
+	private Map children = new HashMap();
+
+	public Parent() {
+	}
+
+	public Parent(String name) {
+		this.name = name;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Map getChildren() {
+		return children;
+	}
+
+	public void setChildren(Map children) {
+		this.children = children;
+	}
+
+	public Child addChild(String name) {
+		Child child = new Child( name );
+		addChild( child );
+		return child;
+	}
+
+	public void addChild(Child child) {
+		child.setParent( this );
+		getChildren().put( child.getName(), child );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/map/Parent.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/map/PersistentMapTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/map/PersistentMapTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/map/PersistentMapTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,137 @@
+package org.hibernate.test.collection.map;
+
+import java.util.HashMap;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.collection.PersistentMap;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Test various situations using a {@link PersistentMap}.
+ *
+ * @author Steve Ebersole
+ */
+public class PersistentMapTest extends FunctionalTestCase {
+	public PersistentMapTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "collection/map/Mappings.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( PersistentMapTest.class );
+	}
+
+	@SuppressWarnings({ "unchecked" })
+	public void testWriteMethodDirtying() {
+		Parent parent = new Parent( "p1" );
+		Child child = new Child( "c1" );
+		parent.getChildren().put( child.getName(), child );
+		child.setParent( parent );
+		Child otherChild = new Child( "c2" );
+
+		Session session = openSession();
+		session.beginTransaction();
+		session.save( parent );
+		session.flush();
+		// at this point, the map on parent has now been replaced with a PersistentMap...
+		PersistentMap children = ( PersistentMap ) parent.getChildren();
+
+		Object old = children.put( child.getName(), child );
+		assertTrue( old == child );
+		assertFalse( children.isDirty() );
+
+		old = children.remove( otherChild.getName() );
+		assertNull( old );
+		assertFalse( children.isDirty() );
+
+		HashMap otherMap = new HashMap();
+		otherMap.put( child.getName(), child );
+		children.putAll( otherMap );
+		assertFalse( children.isDirty() );
+
+		otherMap = new HashMap();
+		otherMap.put( otherChild.getName(), otherChild );
+		children.putAll( otherMap );
+		assertTrue( children.isDirty() );
+
+		children.clearDirty();
+		session.delete( child );
+		children.clear();
+		assertTrue( children.isDirty() );
+		session.flush();
+
+		children.clear();
+		assertFalse( children.isDirty() );
+
+		session.delete( parent );
+		session.getTransaction().commit();
+		session.close();
+	}
+
+	public void testPutAgainstUninitializedMap() {
+		// prepare map owner...
+		Session session = openSession();
+		session.beginTransaction();
+		Parent parent = new Parent( "p1" );
+		session.save( parent );
+		session.getTransaction().commit();
+		session.close();
+
+		// Now, reload the parent and test adding children
+		session = openSession();
+		session.beginTransaction();
+		parent = ( Parent ) session.get( Parent.class, parent.getName() );
+		parent.addChild( "c1" );
+		parent.addChild( "c2" );
+		session.getTransaction().commit();
+		session.close();
+
+		assertEquals( 2, parent.getChildren().size() );
+
+		session = openSession();
+		session.beginTransaction();
+		session.delete( parent );
+		session.getTransaction().commit();
+		session.close();
+	}
+
+    public void testRemoveAgainstUninitializedMap() {
+        Parent parent = new Parent( "p1" );
+        Child child = new Child( "c1" );
+        parent.addChild( child );
+
+        Session session = openSession();
+        session.beginTransaction();
+        session.save( parent );
+        session.getTransaction().commit();
+        session.close();
+
+        // Now reload the parent and test removing the child
+        session = openSession();
+        session.beginTransaction();
+        parent = ( Parent ) session.get( Parent.class, parent.getName() );
+        Child child2 = ( Child ) parent.getChildren().remove( child.getName() );
+		child2.setParent( null );
+		assertNotNull( child2 );
+		assertTrue( parent.getChildren().isEmpty() );
+        session.getTransaction().commit();
+        session.close();
+
+		// Load the parent once again and make sure child is still gone
+		//		then cleanup
+        session = openSession();
+        session.beginTransaction();
+		parent = ( Parent ) session.get( Parent.class, parent.getName() );
+		assertTrue( parent.getChildren().isEmpty() );
+		session.delete( child2 );
+		session.delete( parent );
+        session.getTransaction().commit();
+        session.close();
+    }
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/map/PersistentMapTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/Animal.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/Animal.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/Animal.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,33 @@
+package org.hibernate.test.collection.original;
+
+public class Animal {
+    long id;
+    String name;
+    boolean boolvar;
+    Zoo zoo;
+
+    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 boolean isBoolvar() {
+		return boolvar;
+	}
+	public void setBoolvar(boolean boolvar) {
+		this.boolvar = boolvar;
+	}
+	public Zoo getZoo() {
+		return zoo;
+	}
+	public void setZoo(Zoo zoo) {
+		this.zoo = zoo;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/Animal.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/CollectionTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/CollectionTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/CollectionTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,249 @@
+//$Id: CollectionTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.collection.original;
+
+import java.sql.SQLException;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class CollectionTest extends FunctionalTestCase {
+
+	public CollectionTest(String str) {
+		super( str );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "collection/original/UserPermissions.hbm.xml", "collection/original/Zoo.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( CollectionTest.class );
+	}
+
+	public void testExtraLazy() throws HibernateException, SQLException {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		User u = new User( "gavin" );
+		u.getPermissions().add( new Permission( "obnoxiousness" ) );
+		u.getPermissions().add( new Permission( "pigheadedness" ) );
+		u.getSessionData().put( "foo", "foo value" );
+		s.persist( u );
+		t.commit();
+		s.close();
+		s = openSession();
+		t = s.beginTransaction();
+		u = ( User ) s.get( User.class, "gavin" );
+
+		assertFalse( Hibernate.isInitialized( u.getPermissions() ) );
+		assertEquals( u.getPermissions().size(), 2 );
+		assertTrue( u.getPermissions().contains( new Permission( "obnoxiousness" ) ) );
+		assertFalse( u.getPermissions().contains( new Permission( "silliness" ) ) );
+		assertNotNull( u.getPermissions().get( 1 ) );
+		assertNull( u.getPermissions().get( 3 ) );
+		assertFalse( Hibernate.isInitialized( u.getPermissions() ) );
+
+		assertFalse( Hibernate.isInitialized( u.getSessionData() ) );
+		assertEquals( u.getSessionData().size(), 1 );
+		assertTrue( u.getSessionData().containsKey( "foo" ) );
+		assertFalse( u.getSessionData().containsKey( "bar" ) );
+		assertTrue( u.getSessionData().containsValue( "foo value" ) );
+		assertFalse( u.getSessionData().containsValue( "bar" ) );
+		assertEquals( "foo value", u.getSessionData().get( "foo" ) );
+		assertNull( u.getSessionData().get( "bar" ) );
+		assertFalse( Hibernate.isInitialized( u.getSessionData() ) );
+
+		assertFalse( Hibernate.isInitialized( u.getSessionData() ) );
+		u.getSessionData().put( "bar", "bar value" );
+		u.getSessionAttributeNames().add( "bar" );
+		assertFalse( Hibernate.isInitialized( u.getSessionAttributeNames() ) );
+		assertTrue( Hibernate.isInitialized( u.getSessionData() ) );
+
+		s.delete( u );
+		t.commit();
+		s.close();
+	}
+
+	public void testMerge() throws HibernateException, SQLException {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		User u = new User( "gavin" );
+		u.getPermissions().add( new Permission( "obnoxiousness" ) );
+		u.getPermissions().add( new Permission( "pigheadedness" ) );
+		s.persist( u );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		User u2 = ( User ) s.createCriteria( User.class ).uniqueResult();
+		u2.setPermissions( null ); //forces one shot delete
+		s.merge( u );
+		t.commit();
+		s.close();
+
+		u.getPermissions().add( new Permission( "silliness" ) );
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.merge( u );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		u2 = ( User ) s.createCriteria( User.class ).uniqueResult();
+		assertEquals( u2.getPermissions().size(), 3 );
+		assertEquals( ( ( Permission ) u2.getPermissions().get( 0 ) ).getType(), "obnoxiousness" );
+		assertEquals( ( ( Permission ) u2.getPermissions().get( 2 ) ).getType(), "silliness" );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete( u2 );
+		s.flush();
+		t.commit();
+		s.close();
+
+	}
+
+	public void testFetch() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		User u = new User( "gavin" );
+		u.getPermissions().add( new Permission( "obnoxiousness" ) );
+		u.getPermissions().add( new Permission( "pigheadedness" ) );
+		u.getEmailAddresses().add( new Email( "gavin at hibernate.org" ) );
+		u.getEmailAddresses().add( new Email( "gavin.king at jboss.com" ) );
+		s.persist( u );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		User u2 = ( User ) s.createCriteria( User.class ).uniqueResult();
+		assertTrue( Hibernate.isInitialized( u2.getEmailAddresses() ) );
+		assertFalse( Hibernate.isInitialized( u2.getPermissions() ) );
+		assertEquals( u2.getEmailAddresses().size(), 2 );
+		s.delete( u2 );
+		t.commit();
+		s.close();
+	}
+
+	public void testUpdateOrder() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		User u = new User( "gavin" );
+		u.getSessionData().put( "foo", "foo value" );
+		u.getSessionData().put( "bar", "bar value" );
+		u.getEmailAddresses().add( new Email( "gavin.king at jboss.com" ) );
+		u.getEmailAddresses().add( new Email( "gavin at hibernate.org" ) );
+		u.getEmailAddresses().add( new Email( "gavin at illflow.com" ) );
+		u.getEmailAddresses().add( new Email( "gavin at nospam.com" ) );
+		s.persist( u );
+		t.commit();
+		s.close();
+
+		u.getSessionData().clear();
+		u.getSessionData().put( "baz", "baz value" );
+		u.getSessionData().put( "bar", "bar value" );
+		u.getEmailAddresses().remove( 0 );
+		u.getEmailAddresses().remove( 2 );
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.update( u );
+		t.commit();
+		s.close();
+
+		u.getSessionData().clear();
+		u.getEmailAddresses().add( 0, new Email( "gavin at nospam.com" ) );
+		u.getEmailAddresses().add( new Email( "gavin.king at jboss.com" ) );
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.update( u );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete( u );
+		t.commit();
+		s.close();
+
+	}
+
+	public void testValueMap() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		User u = new User( "gavin" );
+		u.getSessionData().put( "foo", "foo value" );
+		u.getSessionData().put( "bar", null );
+		u.getEmailAddresses().add( null );
+		u.getEmailAddresses().add( new Email( "gavin.king at jboss.com" ) );
+		u.getEmailAddresses().add( null );
+		u.getEmailAddresses().add( null );
+		s.persist( u );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		User u2 = ( User ) s.createCriteria( User.class ).uniqueResult();
+		assertFalse( Hibernate.isInitialized( u2.getSessionData() ) );
+		assertEquals( u2.getSessionData().size(), 1 );
+		assertEquals( u2.getEmailAddresses().size(), 2 );
+		u2.getSessionData().put( "foo", "new foo value" );
+		u2.getEmailAddresses().set( 1, new Email( "gavin at hibernate.org" ) );
+		//u2.getEmailAddresses().remove(3);
+		//u2.getEmailAddresses().remove(2);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		u2 = ( User ) s.createCriteria( User.class ).uniqueResult();
+		assertFalse( Hibernate.isInitialized( u2.getSessionData() ) );
+		assertEquals( u2.getSessionData().size(), 1 );
+		assertEquals( u2.getEmailAddresses().size(), 2 );
+		assertEquals( u2.getSessionData().get( "foo" ), "new foo value" );
+		assertEquals( ( ( Email ) u2.getEmailAddresses().get( 1 ) ).getAddress(), "gavin at hibernate.org" );
+		s.delete( u2 );
+		t.commit();
+		s.close();
+	}
+
+	// HHH-3636
+	public void testCollectionInheritance() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Zoo zoo = new Zoo();
+		Mammal m = new Mammal();
+		m.setMammalName( "name1" );
+		m.setMammalName2( "name2" );
+		m.setMammalName3( "name3" );
+		m.setZoo( zoo );
+		zoo.getAnimals().add( m );
+		Long id = ( Long ) s.save( zoo );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Zoo found = ( Zoo ) s.get( Zoo.class, id );
+		found.getAnimals().size();
+		s.delete( found );
+		t.commit();
+		s.close();
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/CollectionTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/Email.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/Email.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/Email.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,27 @@
+//$Id: Email.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.collection.original;
+
+/**
+ * @author Gavin King
+ */
+public class Email {
+	private String address;
+	Email() {}
+	public String getAddress() {
+		return address;
+	}
+	public void setAddress(String type) {
+		this.address = type;
+	}
+	public Email(String type) {
+		this.address = type;
+	}
+	public boolean equals(Object that) {
+		if ( !(that instanceof Email) ) return false;
+		Email p = (Email) that;
+		return this.address.equals(p.address);
+	}
+	public int hashCode() {
+		return address.hashCode();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/Email.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/Mammal.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/Mammal.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/Mammal.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,34 @@
+package org.hibernate.test.collection.original;
+
+public class Mammal extends Animal {
+    private String mammalName;
+    private String mammalName2;
+    private String mammalName3;
+
+	public String getMammalName() {
+		return mammalName;
+	}
+
+	public void setMammalName(String mammalName) {
+		this.mammalName = mammalName;
+	}
+
+	public String getMammalName2() {
+		return mammalName2;
+	}
+
+	public void setMammalName2(String mammalName2) {
+		this.mammalName2 = mammalName2;
+	}
+
+	public String getMammalName3() {
+		return mammalName3;
+	}
+
+	public void setMammalName3(String mammalName3) {
+		this.mammalName3 = mammalName3;
+	}
+	
+	
+
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/Mammal.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/Permission.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/Permission.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/Permission.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,27 @@
+//$Id: Permission.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.collection.original;
+
+/**
+ * @author Gavin King
+ */
+public class Permission {
+	private String type;
+	Permission() {}
+	public String getType() {
+		return type;
+	}
+	public void setType(String type) {
+		this.type = type;
+	}
+	public Permission(String type) {
+		this.type = type;
+	}
+	public boolean equals(Object that) {
+		if ( !(that instanceof Permission) ) return false;
+		Permission p = (Permission) that;
+		return this.type.equals(p.type);
+	}
+	public int hashCode() {
+		return type.hashCode();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/Permission.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/User.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/User.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/User.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,55 @@
+//$Id: User.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.collection.original;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author Gavin King
+ */
+public class User {
+	private String userName;
+	private List permissions = new ArrayList();
+	private List emailAddresses = new ArrayList();
+	private Map sessionData = new HashMap();
+	private Set sessionAttributeNames = new HashSet();
+
+	User() {}
+	public User(String name) {
+		userName = name;
+	}
+	public List getPermissions() {
+		return permissions;
+	}
+	public void setPermissions(List permissions) {
+		this.permissions = permissions;
+	}
+	public String getUserName() {
+		return userName;
+	}
+	public void setUserName(String userName) {
+		this.userName = userName;
+	}
+	public List getEmailAddresses() {
+		return emailAddresses;
+	}
+	public void setEmailAddresses(List emailAddresses) {
+		this.emailAddresses = emailAddresses;
+	}
+	public Map getSessionData() {
+		return sessionData;
+	}
+	public void setSessionData(Map sessionData) {
+		this.sessionData = sessionData;
+	}
+	public Set getSessionAttributeNames() {
+		return sessionAttributeNames;
+	}
+	public void setSessionAttributeNames(Set sessionAttributeNames) {
+		this.sessionAttributeNames = sessionAttributeNames;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/User.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/UserPermissions.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/UserPermissions.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/UserPermissions.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,53 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+  This mapping demonstrates how to use a composite
+  element mapping to model a parent/child association.
+     
+-->
+
+<hibernate-mapping  package="org.hibernate.test.collection.original">
+	
+	<import class="Permission"/>
+
+	<class name="User" table="`Users`">
+		<id name="userName"/>
+		<list name="permissions" lazy="extra">
+			<key column="userName"/>
+			<list-index column="displayOrder" base="1"/>
+			<composite-element class="Permission">
+				<property name="type" column="permissionType"/>
+			</composite-element>
+		</list>
+		<list name="emailAddresses" fetch="join">
+			<key column="userName"/>
+			<list-index column="displayOrder" base="1"/>
+			<composite-element class="Email">
+				<property name="address"/>
+			</composite-element>
+		</list>
+		<map name="sessionData" 
+				order-by="lower(`attributeName`) asc" 
+				lazy="extra">
+			<key column="userName"/>
+			<map-key column="`attributeName`" 
+					type="string"/>
+			<element column="`attributeValue`" 
+					type="serializable" 
+					not-null="true"/>
+		</map>
+		<set name="sessionAttributeNames" 
+				lazy="extra" 
+				inverse="true">
+			<key column="userName"/>
+			<element column="`attributeName`" 
+					type="string"/>
+		</set>
+	</class>
+	
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/UserPermissions.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/Zoo.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/Zoo.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/Zoo.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.collection.original">
+
+	<class name="Zoo">
+		<id name="id" type="long">
+			<generator class="native" />
+		</id>
+		<list name="animals" cascade="save-update,delete">
+			<key column="Zoo_id" not-null="true" />
+			<list-index column="list_index" />
+			<one-to-many class="Animal" not-found="ignore" />
+		</list>
+	</class>
+
+	<class name="Animal" discriminator-value="ANIMAL">
+		<id name="id" column="ID" type="long">
+			<generator class="native" />
+		</id>
+		<discriminator column="discriminator" type="string" />
+		<property name="name"/>
+		<many-to-one name="zoo" class="Zoo" cascade="save-update,delete" />
+	</class>
+
+	<subclass name="Mammal" discriminator-value="MAMMAL" extends="Animal">
+		<join fetch="select" table="AnimalMammal">
+			<key column="Animal_id" />
+			<property name="mammalName" />
+			<property name="mammalName2" />
+			<property name="mammalName3" />
+		</join>
+	</subclass>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/Zoo.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/Zoo.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/Zoo.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/Zoo.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,24 @@
+package org.hibernate.test.collection.original;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Zoo {
+    long id;
+    List animals = new ArrayList();
+
+    public long getId() {
+        return id;
+    }
+    public void setId( long id ) {
+        this.id = id;
+    }
+	public List getAnimals() {
+		return animals;
+	}
+	public void setAnimals(List animals) {
+		this.animals = animals;
+	}
+    
+    
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/original/Zoo.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/set/Child.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/set/Child.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/set/Child.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,69 @@
+package org.hibernate.test.collection.set;
+
+/**
+ * todo: describe Child
+ *
+ * @author Steve Ebersole
+ */
+public class Child {
+	private String name;
+	private Parent parent;
+	private String description;
+
+	public Child() {
+	}
+
+	public Child(String name) {
+		this.name = name;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Parent getParent() {
+		return parent;
+	}
+
+	public void setParent(Parent parent) {
+		this.parent = parent;
+	}
+
+	public String getDescription() {
+		return description;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
+	public boolean equals(Object o) {
+		if ( this == o ) {
+			return true;
+		}
+		if ( o == null || getClass() != o.getClass() ) {
+			return false;
+		}
+
+		Child child = ( Child ) o;
+
+		if ( description != null ? ! description.equals( child.description ) : child.description != null ) {
+			return false;
+		}
+		if ( ! name.equals( child.name ) ) {
+			return false;
+		}
+
+		return true;
+	}
+
+	public int hashCode() {
+		int result = name.hashCode();
+		result = 31 * result + ( description != null ? description.hashCode() : 0 );
+		return result;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/set/Child.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/set/Container.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/set/Container.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/set/Container.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2007, Red Hat Middleware, LLC. All rights reserved.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, v. 2.1. This program is distributed in the
+ * hope that it will be useful, but WITHOUT A WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details. You should have received a
+ * copy of the GNU Lesser General Public License, v.2.1 along with this
+ * distribution; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Red Hat Author(s): Steve Ebersole
+ */
+package org.hibernate.test.collection.set;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Container implementation
+ *
+ * @author Steve Ebersole
+ */
+public class Container {
+	private Long id;
+	private String name;
+	private Set contents = new HashSet();
+
+	public Container() {
+	}
+
+	public Container(String name) {
+		this.name = name;
+	}
+
+	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 Set getContents() {
+		return contents;
+	}
+
+	public void setContents(Set contents) {
+		this.contents = contents;
+	}
+
+	public static class Content {
+		private String name;
+
+		public Content() {
+		}
+
+		public Content(String name) {
+			this.name = name;
+		}
+
+		public String getName() {
+			return name;
+		}
+
+		public void setName(String name) {
+			this.name = name;
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/set/Container.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/set/Mappings.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/set/Mappings.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/set/Mappings.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,51 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+  ~ Copyright (c) 2007, Red Hat Middleware, LLC. All rights reserved.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, v. 2.1. This program is distributed in the
+  ~ hope that it will be useful, but WITHOUT A WARRANTY; without even the implied
+  ~ warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  ~ Lesser General Public License for more details. You should have received a
+  ~ copy of the GNU Lesser General Public License, v.2.1 along with this
+  ~ distribution; if not, write to the Free Software Foundation, Inc.,
+  ~ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+  ~
+  ~ Red Hat Author(s): Steve Ebersole
+  -->
+<hibernate-mapping package="org.hibernate.test.collection.set">
+
+    <class name="Parent">
+		<id name="name" column="NAME" type="string" />
+
+        <set name="children" inverse="true" cascade="all">
+            <key column="PARENT" />
+            <one-to-many class="Child" />
+        </set>
+	</class>
+
+    <class name="Child">
+        <id name="name" column="NAME" type="string"/>
+        <many-to-one name="parent" class="Parent" cascade="none" />
+        <property name="description" type="string"/>
+    </class>
+
+    <class name="Container">
+        <id name="id" type="long">
+            <generator class="increment"/>
+        </id>
+        <property name="name" column="NAME" type="string"/>
+        <set name="contents" table="CONTENTS">
+            <key column="CONTAINER_ID"/>
+            <composite-element class="Container$Content">
+                <property name="name" column="NAME" type="string"/>
+            </composite-element>
+        </set>
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/set/Mappings.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/set/MappingsNonLazy.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/set/MappingsNonLazy.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/set/MappingsNonLazy.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,51 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+  ~ Copyright (c) 2007, Red Hat Middleware, LLC. All rights reserved.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, v. 2.1. This program is distributed in the
+  ~ hope that it will be useful, but WITHOUT A WARRANTY; without even the implied
+  ~ warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  ~ Lesser General Public License for more details. You should have received a
+  ~ copy of the GNU Lesser General Public License, v.2.1 along with this
+  ~ distribution; if not, write to the Free Software Foundation, Inc.,
+  ~ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+  ~
+  ~ Red Hat Author(s): Steve Ebersole
+  -->
+<hibernate-mapping package="org.hibernate.test.collection.set">
+
+    <class name="Parent">
+		<id name="name" column="NAME" type="string" />
+
+        <set name="children" inverse="true" cascade="all" lazy="false">
+            <key column="PARENT" />
+            <one-to-many class="Child" />
+        </set>
+	</class>
+
+    <class name="Child">
+        <id name="name" column="NAME" type="string"/>
+        <many-to-one name="parent" class="Parent" cascade="none" lazy="false" />
+        <property name="description" type="string"/>
+    </class>
+
+    <class name="Container">
+        <id name="id" type="long">
+            <generator class="increment"/>
+        </id>
+        <property name="name" column="NAME" type="string"/>
+        <set name="contents" table="CONTENTS" lazy="false">
+            <key column="CONTAINER_ID"/>
+            <composite-element class="Container$Content">
+                <property name="name" column="NAME" type="string"/>
+            </composite-element>
+        </set>
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/set/MappingsNonLazy.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/set/Parent.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/set/Parent.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/set/Parent.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,37 @@
+package org.hibernate.test.collection.set;
+
+import java.util.Set;
+import java.util.HashSet;
+
+/**
+ * todo: describe Parent
+ *
+ * @author Steve Ebersole
+ */
+public class Parent {
+	private String name;
+	private Set children = new HashSet();
+
+	public Parent() {
+	}
+
+	public Parent(String name) {
+		this.name = name;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Set getChildren() {
+		return children;
+	}
+
+	public void setChildren(Set children) {
+		this.children = children;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/set/Parent.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/set/PersistentSetNonLazyTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/set/PersistentSetNonLazyTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/set/PersistentSetNonLazyTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,57 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.collection.set;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ *
+ * @author Gail Badner
+ */
+public class PersistentSetNonLazyTest extends PersistentSetTest {
+	public PersistentSetNonLazyTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "collection/set/MappingsNonLazy.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( PersistentSetNonLazyTest.class );
+	}
+
+	public void testLoadChildCheckParentContainsChildCache() {
+		reportSkip( "known to fail with non-lazy collection using query cache",
+				"support for non-lazy collections using query cache"
+		);
+	}
+
+	public void testLoadChildCheckParentContainsChildCacheFailureExpected() {
+		 super.testLoadChildCheckParentContainsChildCache();
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/set/PersistentSetNonLazyTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/set/PersistentSetTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/set/PersistentSetTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/set/PersistentSetTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,384 @@
+package org.hibernate.test.collection.set;
+
+import java.util.HashSet;
+
+import junit.framework.Test;
+
+import org.hibernate.CacheMode;
+import org.hibernate.Session;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.collection.PersistentSet;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.stat.CollectionStatistics;
+
+/**
+ * todo: describe PersistentSetTest
+ *
+ * @author Steve Ebersole
+ */
+public class PersistentSetTest extends FunctionalTestCase {
+	public PersistentSetTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "collection/set/Mappings.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( PersistentSetTest.class );
+	}
+
+	public void configure(Configuration cfg) {
+		super.configure( cfg );
+		cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
+	}
+
+	public void testWriteMethodDirtying() {
+		Parent parent = new Parent( "p1" );
+		Child child = new Child( "c1" );
+		parent.getChildren().add( child );
+		child.setParent( parent );
+		Child otherChild = new Child( "c2" );
+
+		Session session = openSession();
+		session.beginTransaction();
+		session.save( parent );
+		session.flush();
+		// at this point, the set on parent has now been replaced with a PersistentSet...
+		PersistentSet children = ( PersistentSet ) parent.getChildren();
+
+		assertFalse( children.add( child ) );
+		assertFalse( children.isDirty() );
+
+		assertFalse( children.remove( otherChild ) );
+		assertFalse( children.isDirty() );
+
+		HashSet otherSet = new HashSet();
+		otherSet.add( child );
+		assertFalse( children.addAll( otherSet ) );
+		assertFalse( children.isDirty() );
+
+		assertFalse( children.retainAll( otherSet ) );
+		assertFalse( children.isDirty() );
+
+		otherSet = new HashSet();
+		otherSet.add( otherChild );
+		assertFalse( children.removeAll( otherSet ) );
+		assertFalse( children.isDirty() );
+
+		assertTrue( children.retainAll( otherSet ));
+		assertTrue( children.isDirty() );
+		assertTrue( children.isEmpty() );
+
+		children.clear();
+		session.delete( child );
+		assertTrue( children.isDirty() );
+
+		session.flush();
+
+		children.clear();
+		assertFalse( children.isDirty() );
+
+		session.delete( parent );
+		session.getTransaction().commit();
+		session.close();
+	}
+
+	public void testCollectionMerging() {
+		Session session = openSession();
+		session.beginTransaction();
+		Parent parent = new Parent( "p1" );
+		Child child = new Child( "c1" );
+		parent.getChildren().add( child );
+		child.setParent( parent );
+		session.save( parent );
+		session.getTransaction().commit();
+		session.close();
+
+		CollectionStatistics stats =  sfi().getStatistics().getCollectionStatistics( Parent.class.getName() + ".children" );
+		long recreateCount = stats.getRecreateCount();
+		long updateCount = stats.getUpdateCount();
+
+		session = openSession();
+		session.beginTransaction();
+		parent = ( Parent ) session.merge( parent );
+		session.getTransaction().commit();
+		session.close();
+
+		assertEquals( 1, parent.getChildren().size() );
+		assertEquals( recreateCount, stats.getRecreateCount() );
+		assertEquals( updateCount, stats.getUpdateCount() );
+
+		session = openSession();
+		session.beginTransaction();
+		parent = ( Parent ) session.get( Parent.class, "p1" );
+		assertEquals( 1, parent.getChildren().size() );
+		session.delete( parent );
+		session.getTransaction().commit();
+		session.close();
+	}
+
+	public void testCollectiondirtyChecking() {
+		Session session = openSession();
+		session.beginTransaction();
+		Parent parent = new Parent( "p1" );
+		Child child = new Child( "c1" );
+		parent.getChildren().add( child );
+		child.setParent( parent );
+		session.save( parent );
+		session.getTransaction().commit();
+		session.close();
+
+		CollectionStatistics stats =  sfi().getStatistics().getCollectionStatistics( Parent.class.getName() + ".children" );
+		long recreateCount = stats.getRecreateCount();
+		long updateCount = stats.getUpdateCount();
+
+		session = openSession();
+		session.beginTransaction();
+		parent = ( Parent ) session.get( Parent.class, "p1" );
+		assertEquals( 1, parent.getChildren().size() );
+		session.getTransaction().commit();
+		session.close();
+
+		assertEquals( 1, parent.getChildren().size() );
+		assertEquals( recreateCount, stats.getRecreateCount() );
+		assertEquals( updateCount, stats.getUpdateCount() );
+
+		session = openSession();
+		session.beginTransaction();
+		assertEquals( 1, parent.getChildren().size() );
+		session.delete( parent );
+		session.getTransaction().commit();
+		session.close();
+	}
+
+	public void testCompositeElementWriteMethodDirtying() {
+		Container container = new Container( "p1" );
+		Container.Content c1 = new Container.Content( "c1" );
+		container.getContents().add( c1 );
+		Container.Content c2 = new Container.Content( "c2" );
+
+		Session session = openSession();
+		session.beginTransaction();
+		session.save( container );
+		session.flush();
+		// at this point, the set on container has now been replaced with a PersistentSet...
+		PersistentSet children = ( PersistentSet ) container.getContents();
+
+		assertFalse( children.add( c1 ) );
+		assertFalse( children.isDirty() );
+
+		assertFalse( children.remove( c2 ) );
+		assertFalse( children.isDirty() );
+
+		HashSet otherSet = new HashSet();
+		otherSet.add( c1 );
+		assertFalse( children.addAll( otherSet ) );
+		assertFalse( children.isDirty() );
+
+		assertFalse( children.retainAll( otherSet ) );
+		assertFalse( children.isDirty() );
+
+		otherSet = new HashSet();
+		otherSet.add( c2 );
+		assertFalse( children.removeAll( otherSet ) );
+		assertFalse( children.isDirty() );
+
+		assertTrue( children.retainAll( otherSet ));
+		assertTrue( children.isDirty() );
+		assertTrue( children.isEmpty() );
+
+		children.clear();
+		assertTrue( children.isDirty() );
+
+		session.flush();
+
+		children.clear();
+		assertFalse( children.isDirty() );
+
+		session.delete( container );
+		session.getTransaction().commit();
+		session.close();
+	}
+
+	public void testCompositeElementMergingFailureExpected() {
+		// HHH-2485
+		Session session = openSession();
+		session.beginTransaction();
+		Container container = new Container( "p1" );
+		Container.Content c1 = new Container.Content( "c1" );
+		container.getContents().add( c1 );
+		session.save( container );
+		session.getTransaction().commit();
+		session.close();
+
+		CollectionStatistics stats =  sfi().getStatistics().getCollectionStatistics( Container.class.getName() + ".contents" );
+		long recreateCount = stats.getRecreateCount();
+		long updateCount = stats.getUpdateCount();
+
+		container.setName( "another name" );
+
+		session = openSession();
+		session.beginTransaction();
+		container = ( Container ) session.merge( container );
+		session.getTransaction().commit();
+		session.close();
+
+		assertEquals( 1, container.getContents().size() );
+		assertEquals( recreateCount, stats.getRecreateCount() );
+		assertEquals( updateCount, stats.getUpdateCount() );
+
+		session = openSession();
+		session.beginTransaction();
+		container = ( Container ) session.get( Container.class, container.getId() );
+		assertEquals( 1, container.getContents().size() );
+		session.delete( container );
+		session.getTransaction().commit();
+		session.close();
+	}
+
+	public void testCompositeElementCollectionDirtyCheckingFailureExpected() {
+		// HHH-2485
+		Session session = openSession();
+		session.beginTransaction();
+		Container container = new Container( "p1" );
+		Container.Content c1 = new Container.Content( "c1" );
+		container.getContents().add( c1 );
+		session.save( container );
+		session.getTransaction().commit();
+		session.close();
+
+		CollectionStatistics stats =  sfi().getStatistics().getCollectionStatistics( Container.class.getName() + ".contents" );
+		long recreateCount = stats.getRecreateCount();
+		long updateCount = stats.getUpdateCount();
+
+		session = openSession();
+		session.beginTransaction();
+		container = ( Container ) session.get( Container.class, container.getId() );
+		assertEquals( 1, container.getContents().size() );
+		session.getTransaction().commit();
+		session.close();
+
+		assertEquals( 1, container.getContents().size() );
+		assertEquals( recreateCount, stats.getRecreateCount() );
+		assertEquals( updateCount, stats.getUpdateCount() );
+
+		session = openSession();
+		session.beginTransaction();
+		container = ( Container ) session.get( Container.class, container.getId() );
+		assertEquals( 1, container.getContents().size() );
+		session.delete( container );
+		session.getTransaction().commit();
+		session.close();
+	}
+
+	public void testLoadChildCheckParentContainsChildCache() {
+		Parent parent = new Parent( "p1" );
+		Child child = new Child( "c1" );
+		child.setDescription( "desc1" );
+		parent.getChildren().add( child );
+		child.setParent( parent );
+		Child otherChild = new Child( "c2" );
+		otherChild.setDescription( "desc2" );
+		parent.getChildren().add( otherChild );
+		otherChild.setParent( parent );
+
+		Session session = openSession();
+		session.beginTransaction();
+		session.save( parent );
+		session.getTransaction().commit();
+
+		session = openSession();
+		session.beginTransaction();
+		parent = ( Parent ) session.get( Parent.class, parent.getName() );
+		assertTrue( parent.getChildren().contains( child ) );
+		assertTrue( parent.getChildren().contains( otherChild ) );
+		session.getTransaction().commit();
+
+		session = openSession();
+		session.beginTransaction();
+
+		child = ( Child ) session.get( Child.class, child.getName() );
+		assertTrue( child.getParent().getChildren().contains( child ) );
+		session.clear();
+
+		child = ( Child ) session.createCriteria( Child.class, child.getName() )
+				.setCacheable( true )
+				.add( Restrictions.idEq( "c1" ) )
+				.uniqueResult();
+		assertTrue( child.getParent().getChildren().contains( child ) );
+		assertTrue( child.getParent().getChildren().contains( otherChild ) );
+		session.clear();
+
+		child = ( Child ) session.createCriteria( Child.class, child.getName() )
+				.setCacheable( true )
+				.add( Restrictions.idEq( "c1" ) )
+				.uniqueResult();
+		assertTrue( child.getParent().getChildren().contains( child ) );
+		assertTrue( child.getParent().getChildren().contains( otherChild ) );
+		session.clear();
+
+		child = ( Child ) session.createQuery( "from Child where name = 'c1'" )
+				.setCacheable( true )
+				.uniqueResult();
+		assertTrue( child.getParent().getChildren().contains( child ) );
+
+		child = ( Child ) session.createQuery( "from Child where name = 'c1'" )
+				.setCacheable( true )
+				.uniqueResult();
+		assertTrue( child.getParent().getChildren().contains( child ) );
+
+		session.delete( child.getParent() );
+		session.getTransaction().commit();
+		session.close();
+	}
+
+	public void testLoadChildCheckParentContainsChildNoCache() {
+		Parent parent = new Parent( "p1" );
+		Child child = new Child( "c1" );
+		parent.getChildren().add( child );
+		child.setParent( parent );
+		Child otherChild = new Child( "c2" );
+		parent.getChildren().add( otherChild );
+		otherChild.setParent( parent );
+
+		Session session = openSession();
+		session.beginTransaction();
+		session.save( parent );
+		session.getTransaction().commit();
+
+		session = openSession();
+		session.beginTransaction();
+		session.setCacheMode( CacheMode.IGNORE );
+		parent = ( Parent ) session.get( Parent.class, parent.getName() );
+		assertTrue( parent.getChildren().contains( child ) );
+		assertTrue( parent.getChildren().contains( otherChild ) );
+		session.getTransaction().commit();
+
+		session = openSession();
+		session.beginTransaction();
+		session.setCacheMode( CacheMode.IGNORE );
+
+		child = ( Child ) session.get( Child.class, child.getName() );
+		assertTrue( child.getParent().getChildren().contains( child ) );
+		session.clear();
+
+		child = ( Child ) session.createCriteria( Child.class, child.getName() )
+				.add( Restrictions.idEq( "c1" ) )
+				.uniqueResult();
+		assertTrue( child.getParent().getChildren().contains( child ) );
+		assertTrue( child.getParent().getChildren().contains( otherChild ) );
+		session.clear();
+
+		child = ( Child ) session.createQuery( "from Child where name = 'c1'" ).uniqueResult();
+		assertTrue( child.getParent().getChildren().contains( child ) );
+
+		session.delete( child.getParent() );
+		session.getTransaction().commit();
+		session.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/collection/set/PersistentSetTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/basic/ComponentTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/basic/ComponentTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/basic/ComponentTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,391 @@
+//$Id: ComponentTest.java 11346 2007-03-26 17:24:58Z steve.ebersole at jboss.com $
+package org.hibernate.test.component.basic;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.cfg.Mappings;
+import org.hibernate.criterion.Property;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.dialect.SybaseASE15Dialect;
+import org.hibernate.dialect.function.SQLFunction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.mapping.Component;
+import org.hibernate.mapping.Formula;
+import org.hibernate.mapping.PersistentClass;
+
+/**
+ * @author Gavin King
+ */
+public class ComponentTest extends FunctionalTestCase {
+	
+	public ComponentTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "component/basic/User.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( ComponentTest.class );
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
+	}
+
+	public void afterConfigurationBuilt(Mappings mappings, Dialect dialect) {
+		super.afterConfigurationBuilt( mappings, dialect );
+		// Oracle and Postgres do not have year() functions, so we need to
+		// redefine the 'User.person.yob' formula
+		//
+		// consider temporary until we add the capability to define
+		// mapping foprmulas which can use dialect-registered functions...
+		PersistentClass user = mappings.getClass( User.class.getName() );
+		org.hibernate.mapping.Property personProperty = user.getProperty( "person" );
+		Component component = ( Component ) personProperty.getValue();
+		Formula f = ( Formula ) component.getProperty( "yob" ).getValue().getColumnIterator().next();
+
+		SQLFunction yearFunction = ( SQLFunction ) dialect.getFunctions().get( "year" );
+		if ( yearFunction == null ) {
+			// the dialect not know to support a year() function, so rely on the
+			// ANSI SQL extract function
+			f.setFormula( "extract( year from dob )");
+		}
+		else {
+			List args = new ArrayList();
+			args.add( "dob" );
+			f.setFormula( yearFunction.render( args, null ) );
+		}
+	}
+	
+	public void testUpdateFalse() {
+		getSessions().getStatistics().clear();
+		
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		User u = new User( "gavin", "secret", new Person("Gavin King", new Date(), "Karbarook Ave") );
+		s.persist(u);
+		s.flush();
+		u.getPerson().setName("XXXXYYYYY");
+		t.commit();
+		s.close();
+		
+		assertEquals( 1, getSessions().getStatistics().getEntityInsertCount() );
+		assertEquals( 0, getSessions().getStatistics().getEntityUpdateCount() );
+
+		s = openSession();
+		t = s.beginTransaction();
+		u = (User) s.get(User.class, "gavin");
+		assertEquals( u.getPerson().getName(), "Gavin King" );
+		s.delete(u);
+		t.commit();
+		s.close();
+		
+		assertEquals( 1, getSessions().getStatistics().getEntityDeleteCount() );
+	}
+	
+	public void testComponent() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		User u = new User( "gavin", "secret", new Person("Gavin King", new Date(), "Karbarook Ave") );
+		s.persist(u);
+		s.flush();
+		u.getPerson().changeAddress("Phipps Place");
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		u = (User) s.get(User.class, "gavin");
+		assertEquals( u.getPerson().getAddress(), "Phipps Place" );
+		assertEquals( u.getPerson().getPreviousAddress(), "Karbarook Ave" );
+		assertEquals( u.getPerson().getYob(), u.getPerson().getDob().getYear()+1900 );
+		u.setPassword("$ecret");
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		u = (User) s.get(User.class, "gavin");
+		assertEquals( u.getPerson().getAddress(), "Phipps Place" );
+		assertEquals( u.getPerson().getPreviousAddress(), "Karbarook Ave" );
+		assertEquals( u.getPassword(), "$ecret" );
+		s.delete(u);
+		t.commit();
+		s.close();
+	}
+
+	public void testComponentStateChangeAndDirtiness() {
+		// test for HHH-2366
+		Session s = openSession();
+		s.beginTransaction();
+		User u = new User( "steve", "hibernater", new Person( "Steve Ebersole", new Date(), "Main St") );
+		s.persist( u );
+		s.flush();
+		long intialUpdateCount = sfi().getStatistics().getEntityUpdateCount();
+		u.getPerson().setAddress( "Austin" );
+		s.flush();
+		assertEquals( intialUpdateCount + 1, sfi().getStatistics().getEntityUpdateCount() );
+		intialUpdateCount = sfi().getStatistics().getEntityUpdateCount();
+		u.getPerson().setAddress( "Cedar Park" );
+		s.flush();
+		assertEquals( intialUpdateCount + 1, sfi().getStatistics().getEntityUpdateCount() );
+		s.delete( u );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testComponentQueries() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Employee emp = new Employee();
+		emp.setHireDate( new Date() );
+		emp.setPerson( new Person() );
+		emp.getPerson().setName( "steve" );
+		emp.getPerson().setDob( new Date() );
+		s.save( emp );
+
+		s.createQuery( "from Employee e where e.person = :p and 1 = 1 and 2=2" ).setParameter( "p", emp.getPerson() ).list();
+		s.createQuery( "from Employee e where :p = e.person" ).setParameter( "p", emp.getPerson() ).list();
+		// The following fails on Sybase due to HHH-3510. When HHH-3510 
+		// is fixed, the check for SybaseASE15Dialect should be removed.
+		if ( ! ( getDialect() instanceof SybaseASE15Dialect ) ) {
+			s.createQuery( "from Employee e where e.person = ('steve', current_timestamp)" ).list();
+		}
+
+		s.delete( emp );
+		t.commit();
+		s.close();
+	}
+
+	// Sybase should translate "current_timestamp" in HQL to "getdate()";
+	// This fails currently due to HHH-3510. The following test should be 
+	// deleted and testComponentQueries() should be updated (as noted
+	// in that test case) when HHH-3510 is fixed.
+	public void testComponentQueryMethodNoParensFailureExpected() {
+		if ( ! ( getDialect() instanceof SybaseASE15Dialect ) ) {
+			fail( "Dialect does not apply to test that is expected to fail; force failure" );
+		}
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Employee emp = new Employee();
+		emp.setHireDate( new Date() );
+		emp.setPerson( new Person() );
+		emp.getPerson().setName( "steve" );
+		emp.getPerson().setDob( new Date() );
+		s.save( emp );
+		s.createQuery( "from Employee e where e.person = ('steve', current_timestamp)" ).list();
+		s.delete( emp );
+		t.commit();
+		s.close();
+	}
+	
+	public void testComponentFormulaQuery() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.createQuery("from User u where u.person.yob = 1999").list();
+		s.createCriteria(User.class)
+			.add( Property.forName("person.yob").between( new Integer(1999), new Integer(2002) ) )
+			.list();
+		if ( getDialect().supportsRowValueConstructorSyntax() ) {
+			s.createQuery("from User u where u.person = ('gavin', :dob, 'Peachtree Rd', 'Karbarook Ave', 1974, 'Peachtree Rd')")
+				.setDate("dob", new Date("March 25, 1974")).list();
+			s.createQuery("from User where person = ('gavin', :dob, 'Peachtree Rd', 'Karbarook Ave', 1974, 'Peachtree Rd')")
+				.setDate("dob", new Date("March 25, 1974")).list();
+		}
+		t.commit();
+		s.close();
+	}
+	
+	public void testCustomColumnReadAndWrite() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		User u = new User( "steve", "hibernater", new Person( "Steve Ebersole", new Date(), "Main St") );
+		final double HEIGHT_INCHES = 73;
+		final double HEIGHT_CENTIMETERS = HEIGHT_INCHES * 2.54d;
+		u.getPerson().setHeightInches(HEIGHT_INCHES);
+		s.persist( u );
+		s.flush();
+		
+		// Test value conversion during insert
+		Double heightViaSql = (Double)s.createSQLQuery("select height_centimeters from t_user where t_user.username='steve'").uniqueResult();
+		assertEquals(HEIGHT_CENTIMETERS, heightViaSql, 0.01d);
+
+		// Test projection
+		Double heightViaHql = (Double)s.createQuery("select u.person.heightInches from User u where u.id = 'steve'").uniqueResult();
+		assertEquals(HEIGHT_INCHES, heightViaHql, 0.01d);
+		
+		// Test restriction and entity load via criteria
+		u = (User)s.createCriteria(User.class)
+			.add(Restrictions.between("person.heightInches", HEIGHT_INCHES - 0.01d, HEIGHT_INCHES + 0.01d))
+			.uniqueResult();
+		assertEquals(HEIGHT_INCHES, u.getPerson().getHeightInches(), 0.01d);
+		
+		// Test predicate and entity load via HQL
+		u = (User)s.createQuery("from User u where u.person.heightInches between ? and ?")
+			.setDouble(0, HEIGHT_INCHES - 0.01d)
+			.setDouble(1, HEIGHT_INCHES + 0.01d)
+			.uniqueResult();
+		assertEquals(HEIGHT_INCHES, u.getPerson().getHeightInches(), 0.01d);
+		
+		// Test update
+		u.getPerson().setHeightInches(1);
+		s.flush();
+		heightViaSql = (Double)s.createSQLQuery("select height_centimeters from t_user where t_user.username='steve'").uniqueResult();
+		assertEquals(2.54d, heightViaSql, 0.01d);
+		s.delete(u);
+		t.commit();
+		s.close();
+	}
+	
+
+	public void testNamedQuery() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.getNamedQuery("userNameIn")
+			.setParameterList( "nameList", new Object[] {"1ovthafew", "turin", "xam"} )
+			.list();
+		t.commit();
+		s.close();
+	}
+
+	public void testMergeComponent() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Employee emp = new Employee();
+		emp.setHireDate( new Date() );
+		emp.setPerson( new Person() );
+		emp.getPerson().setName( "steve" );
+		emp.getPerson().setDob( new Date() );
+		s.persist( emp );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		emp = (Employee)s.get( Employee.class, emp.getId() );
+		t.commit();
+		s.close();
+
+		assertNull(emp.getOptionalComponent());
+		emp.setOptionalComponent( new OptionalComponent() );
+		emp.getOptionalComponent().setValue1( "emp-value1" );
+		emp.getOptionalComponent().setValue2( "emp-value2" );
+
+		s = openSession();
+		t = s.beginTransaction();
+		emp = (Employee)s.merge( emp );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		emp = (Employee)s.get( Employee.class, emp.getId() );
+		t.commit();
+		s.close();
+
+		assertEquals("emp-value1", emp.getOptionalComponent().getValue1());
+		assertEquals("emp-value2", emp.getOptionalComponent().getValue2());
+		emp.getOptionalComponent().setValue1( null );
+		emp.getOptionalComponent().setValue2( null );
+
+		s = openSession();
+		t = s.beginTransaction();
+		emp = (Employee)s.merge( emp );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		emp = (Employee)s.get( Employee.class, emp.getId() );
+		Hibernate.initialize(emp.getDirectReports());
+		t.commit();
+		s.close();
+
+		assertNull(emp.getOptionalComponent());
+
+		Employee emp1 = new Employee();
+		emp1.setHireDate( new Date() );
+		emp1.setPerson( new Person() );
+		emp1.getPerson().setName( "bozo" );
+		emp1.getPerson().setDob( new Date() );
+		emp.getDirectReports().add( emp1 );
+
+		s = openSession();
+		t = s.beginTransaction();
+		emp = (Employee)s.merge( emp );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		emp = (Employee)s.get( Employee.class, emp.getId() );
+		Hibernate.initialize(emp.getDirectReports());
+		t.commit();
+		s.close();
+
+		assertEquals(1, emp.getDirectReports().size());
+		emp1 = (Employee)emp.getDirectReports().iterator().next();
+		assertNull( emp1.getOptionalComponent() );
+		emp1.setOptionalComponent( new OptionalComponent() );
+		emp1.getOptionalComponent().setValue1( "emp1-value1" );
+		emp1.getOptionalComponent().setValue2( "emp1-value2" );
+
+		s = openSession();
+		t = s.beginTransaction();
+		emp = (Employee)s.merge( emp );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		emp = (Employee)s.get( Employee.class, emp.getId() );
+		Hibernate.initialize(emp.getDirectReports());
+		t.commit();
+		s.close();
+
+		assertEquals(1, emp.getDirectReports().size());
+		emp1 = (Employee)emp.getDirectReports().iterator().next();
+		assertEquals( "emp1-value1", emp1.getOptionalComponent().getValue1());
+		assertEquals( "emp1-value2", emp1.getOptionalComponent().getValue2());
+		emp1.getOptionalComponent().setValue1( null );
+		emp1.getOptionalComponent().setValue2( null );
+
+		s = openSession();
+		t = s.beginTransaction();
+		emp = (Employee)s.merge( emp );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		emp = (Employee)s.get( Employee.class, emp.getId() );
+		Hibernate.initialize(emp.getDirectReports());
+		t.commit();
+		s.close();
+
+		assertEquals(1, emp.getDirectReports().size());
+		emp1 = (Employee)emp.getDirectReports().iterator().next();
+		assertNull(emp1.getOptionalComponent());
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete( emp );
+		t.commit();
+		s.close();
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/basic/ComponentTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/basic/Employee.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/basic/Employee.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/basic/Employee.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,58 @@
+package org.hibernate.test.component.basic;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * todo: describe Employee
+ *
+ * @author Steve Ebersole
+ */
+public class Employee {
+	private Long id;
+	private Person person;
+	private Date hireDate;
+	private OptionalComponent optionalComponent;
+	private Set directReports = new HashSet();
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Person getPerson() {
+		return person;
+	}
+
+	public void setPerson(Person person) {
+		this.person = person;
+	}
+
+	public Date getHireDate() {
+		return hireDate;
+	}
+
+	public void setHireDate(Date hireDate) {
+		this.hireDate = hireDate;
+	}
+
+	public OptionalComponent getOptionalComponent() {
+		return optionalComponent;
+	}
+
+	public void setOptionalComponent(OptionalComponent optionalComponent) {
+		this.optionalComponent = optionalComponent;
+	}
+
+	public Set getDirectReports() {
+		return directReports;
+	}
+
+	public void setDirectReports(Set directReports) {
+		this.directReports = directReports;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/basic/Employee.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/basic/OptionalComponent.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/basic/OptionalComponent.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/basic/OptionalComponent.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,27 @@
+//$Id: $
+package org.hibernate.test.component.basic;
+
+/**
+ * @author Gail Badner
+ */
+
+public class OptionalComponent {
+	private String value1;
+	private String value2;
+
+	public String getValue1() {
+		return value1;
+	}
+
+	public void setValue1(String value1) {
+		this.value1 = value1;
+	}
+
+	public String getValue2() {
+		return value2;
+	}
+
+	public void setValue2(String value2) {
+		this.value2 = value2;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/basic/OptionalComponent.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/basic/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/basic/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/basic/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,70 @@
+//$Id: Person.java 11345 2007-03-26 17:24:20Z steve.ebersole at jboss.com $
+package org.hibernate.test.component.basic;
+
+import java.util.Date;
+
+/**
+ * @author Gavin King
+ */
+public class Person {
+	private String name;
+	private Date dob;
+	private String address;
+	private String currentAddress;
+	private String previousAddress;
+	private int yob;
+	private double heightInches;
+	Person() {}
+	public Person(String name, Date dob, String address) {
+		this.name = name;
+		this.dob = dob;
+		this.address = address;
+		this.currentAddress = address;
+	}
+	public int getYob() {
+		return yob;
+	}
+	public void setYob(int age) {
+		this.yob = age;
+	}
+	public String getAddress() {
+		return address;
+	}
+	public void setAddress(String address) {
+		this.address = address;
+	}
+	public Date getDob() {
+		return dob;
+	}
+	public void setDob(Date dob) {
+		this.dob = dob;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public String getPreviousAddress() {
+		return previousAddress;
+	}
+	public void setPreviousAddress(String previousAddress) {
+		this.previousAddress = previousAddress;
+	}
+	public void changeAddress(String add) {
+		setPreviousAddress( getAddress() );
+		setAddress(add);
+	}
+	public String getCurrentAddress() {
+		return currentAddress;
+	}
+	public void setCurrentAddress(String currentAddress) {
+		this.currentAddress = currentAddress;
+	}
+	public double getHeightInches() {
+		return heightInches;
+	}
+	public void setHeightInches(double heightInches) {
+		this.heightInches = heightInches;
+	}	
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/basic/Person.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/basic/User.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/basic/User.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/basic/User.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,56 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.component.basic">
+
+	<class name="User" table="T_USER">
+		<id name="userName"/>
+		<timestamp name="lastModified"/>
+		<property name="password" column="`password`" not-null="true" optimistic-lock="false"/>
+		<component name="person">
+			<property name="name" update="false" not-null="true"/>
+			<property name="dob" update="false" not-null="true"/>
+			<property name="address"/>
+			<property name="previousAddress" insert="false"/>
+			<property name="yob" formula="year(dob)"/>
+			<property name="heightInches">
+				<column name="height_centimeters"
+					not-null="true" 
+					read="height_centimeters / 2.54" 
+					write="? * 2.54"/>
+			</property>
+			<property name="currentAddress"
+				column="address"
+				insert="false"
+				update="false"/>
+		</component>
+	</class>
+
+	<class name="Employee" table="T_EMP">
+        <id name="id" type="long" column="ID">
+            <generator class="increment"/>
+        </id>
+        <property name="hireDate" type="date" column="HIRE_DATE"/>
+        <component name="person">
+			<property name="name" update="false" not-null="true"/>
+			<property name="dob" update="false" not-null="true"/>
+		</component>
+		<component name="optionalComponent">
+			<property name="value1" not-null="false"/>
+			<property name="value2" not-null="false"/>
+		</component>
+		<set name="directReports" cascade="all-delete-orphan,merge" lazy="true">
+			<key column="PARENT_ID" />
+			<one-to-many class="Employee"/>
+		</set>
+	</class>
+
+	<query name="userNameIn"><![CDATA[from User where person.name in (:nameList) or userName in (:nameList)]]></query>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/basic/User.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/basic/User.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/basic/User.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/basic/User.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,44 @@
+//$Id: User.java 11345 2007-03-26 17:24:20Z steve.ebersole at jboss.com $
+package org.hibernate.test.component.basic;
+
+import java.util.Date;
+
+/**
+ * @author Gavin King
+ */
+public class User {
+	private String userName;
+	private String password;
+	private Person person;
+	private Date lastModified;
+	User() {}
+	public User(String id, String pw, Person person) {
+		this.userName = id;
+		this.password = pw;
+		this.person = person;
+	}
+	public Date getLastModified() {
+		return lastModified;
+	}
+	public void setLastModified(Date lastModified) {
+		this.lastModified = lastModified;
+	}
+	public String getPassword() {
+		return password;
+	}
+	public void setPassword(String password) {
+		this.password = password;
+	}
+	public Person getPerson() {
+		return person;
+	}
+	public void setPerson(Person person) {
+		this.person = person;
+	}
+	public String getUserName() {
+		return userName;
+	}
+	public void setUserName(String userName) {
+		this.userName = userName;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/basic/User.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/collection/CascadeToComponentCollectionTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/collection/CascadeToComponentCollectionTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/collection/CascadeToComponentCollectionTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,116 @@
+package org.hibernate.test.component.cascading.collection;
+
+import java.util.Iterator;
+import java.util.Locale;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class CascadeToComponentCollectionTest extends FunctionalTestCase {
+
+	public CascadeToComponentCollectionTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "component/cascading/collection/Mappings.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( CascadeToComponentCollectionTest.class );
+	}
+
+	public void testMerging() {
+		// step1, we create a definition with one value
+		Session session = openSession();
+		session.beginTransaction();
+		Definition definition = new Definition();
+		Value value1 = new Value( definition );
+		value1.getLocalizedStrings().addString( new Locale( "en_US" ), "hello" );
+		session.persist( definition );
+		session.getTransaction().commit();
+		session.close();
+
+		// step2, we verify that the definition has one value; then we detach it
+		session = openSession();
+		session.beginTransaction();
+		definition = ( Definition ) session.get( Definition.class, definition.getId() );
+		assertEquals( 1, definition.getValues().size() );
+		session.getTransaction().commit();
+		session.close();
+
+		// step3, we add a new value during detachment
+		Value value2 = new Value( definition );
+		value2.getLocalizedStrings().addString( new Locale( "es" ), "hola" );
+
+		// step4 we merge the definition
+		session = openSession();
+		session.beginTransaction();
+		session.merge( definition );
+		session.getTransaction().commit();
+		session.close();
+
+		// step5, final test
+		session = openSession();
+		session.beginTransaction();
+		definition = ( Definition ) session.get( Definition.class, definition.getId() );
+		assertEquals( 2, definition.getValues().size() );
+		Iterator values = definition.getValues().iterator();
+		while ( values.hasNext() ) {
+			assertEquals( 1, ( ( Value ) values.next() ).getLocalizedStrings().getStringsCopy().size() );
+		}
+		session.getTransaction().commit();
+		session.close();
+	}
+
+	public void testMergingOriginallyNullComponent() {
+		// step1, we create a definition with one value, but with a null component
+		Session session = openSession();
+		session.beginTransaction();
+		Definition definition = new Definition();
+		Value value1 = new Value( definition );
+		session.persist( definition );
+		session.getTransaction().commit();
+		session.close();
+
+		// step2, we verify that the definition has one value; then we detach it
+		session = openSession();
+		session.beginTransaction();
+		definition = ( Definition ) session.get( Definition.class, definition.getId() );
+		assertEquals( 1, definition.getValues().size() );
+		session.getTransaction().commit();
+		session.close();
+
+		// step3, we add a new value during detachment
+		( ( Value ) definition.getValues().iterator().next() ).getLocalizedStrings().addString( new Locale( "en_US" ), "hello" );
+		Value value2 = new Value( definition );
+		value2.getLocalizedStrings().addString( new Locale( "es" ), "hola" );
+
+		// step4 we merge the definition
+		session = openSession();
+		session.beginTransaction();
+		session.merge( definition );
+		session.getTransaction().commit();
+		session.close();
+
+		// step5, final test
+		session = openSession();
+		session.beginTransaction();
+		definition = ( Definition ) session.get( Definition.class, definition.getId() );
+		assertEquals( 2, definition.getValues().size() );
+		Iterator values = definition.getValues().iterator();
+		while ( values.hasNext() ) {
+			assertEquals( 1, ( ( Value ) values.next() ).getLocalizedStrings().getStringsCopy().size() );
+		}
+		session.getTransaction().commit();
+		session.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/collection/CascadeToComponentCollectionTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/collection/Definition.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/collection/Definition.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/collection/Definition.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,30 @@
+package org.hibernate.test.component.cascading.collection;
+
+import java.util.Set;
+import java.util.HashSet;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class Definition {
+    private Long id;
+	private Set values = new HashSet();
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Set getValues() {
+		return values;
+	}
+
+	public void setValues(Set values) {
+		this.values = values;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/collection/Definition.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/collection/LocalizedStrings.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/collection/LocalizedStrings.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/collection/LocalizedStrings.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,26 @@
+package org.hibernate.test.component.cascading.collection;
+
+import java.util.Locale;
+import java.util.Map;
+import java.util.HashMap;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class LocalizedStrings {
+	private Map strings = new HashMap();
+
+	public void addString(Locale locale, String value) {
+		strings.put( locale, value );
+	}
+
+	public String getString(Locale locale) {
+		return ( String ) strings.get( locale );
+	}
+
+	public Map getStringsCopy() {
+		return java.util.Collections.unmodifiableMap( strings );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/collection/LocalizedStrings.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/collection/Mappings.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/collection/Mappings.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/collection/Mappings.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.component.cascading.collection">
+
+	<class name="Definition" >
+		<id name="id" type="long" column="ID">
+			<generator class="increment"/>
+		</id>
+		<set name="values" cascade="all-delete-orphan,merge" lazy="false" inverse="true">
+			<key column="DEF_ID" />
+			<one-to-many class="Value"/>
+		</set>
+	</class>
+
+    <class name="Value" table="`Value`">
+		<id name="id" type="long" column="ID">
+			<generator class="increment"/>
+		</id>
+
+		<many-to-one name="definition" class="Definition" column="DEF_ID"/>
+
+        <component name="localizedStrings" class="LocalizedStrings">
+            <map name="strings" access="field" cascade="persist,merge" lazy="false">
+                <key column="VAL_ID" />
+                <map-key type="locale" column="LOC" />
+                <element type="string" column="STR_VAL" />
+            </map>
+		</component>
+
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/collection/Mappings.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/collection/Value.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/collection/Value.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/collection/Value.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,45 @@
+package org.hibernate.test.component.cascading.collection;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class Value {
+	private Long id;
+	private Definition definition;
+	private LocalizedStrings localizedStrings = new LocalizedStrings();
+
+	protected Value() {
+	}
+
+	public Value(Definition definition) {
+		this();
+		this.definition = definition;
+		definition.getValues().add( this );
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Definition getDefinition() {
+		return definition;
+	}
+
+	public void setDefinition(Definition definition) {
+		this.definition = definition;
+	}
+
+	public LocalizedStrings getLocalizedStrings() {
+		return localizedStrings;
+	}
+
+	public void setLocalizedStrings(LocalizedStrings localizedStrings) {
+		this.localizedStrings = localizedStrings;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/collection/Value.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/toone/Address.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/toone/Address.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/toone/Address.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,63 @@
+package org.hibernate.test.component.cascading.toone;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class Address {
+	private Long id;
+	private String street1;
+	private String street2;
+	private String city;
+	private String state;
+	private String zipCode;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getStreet1() {
+		return street1;
+	}
+
+	public void setStreet1(String street1) {
+		this.street1 = street1;
+	}
+
+	public String getStreet2() {
+		return street2;
+	}
+
+	public void setStreet2(String street2) {
+		this.street2 = street2;
+	}
+
+	public String getCity() {
+		return city;
+	}
+
+	public void setCity(String city) {
+		this.city = city;
+	}
+
+	public String getState() {
+		return state;
+	}
+
+	public void setState(String state) {
+		this.state = state;
+	}
+
+	public String getZipCode() {
+		return zipCode;
+	}
+
+	public void setZipCode(String zipCode) {
+		this.zipCode = zipCode;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/toone/Address.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/toone/CascadeToComponentAssociationTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/toone/CascadeToComponentAssociationTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/toone/CascadeToComponentAssociationTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,71 @@
+package org.hibernate.test.component.cascading.toone;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.Session;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class CascadeToComponentAssociationTest extends FunctionalTestCase {
+	public CascadeToComponentAssociationTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "component/cascading/toone/Mappings.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( CascadeToComponentAssociationTest.class );
+	}
+
+	public void testMerging() {
+		// step1, we create a document with owner
+		Session session = openSession();
+		session.beginTransaction();
+		User user = new User();
+		Document document = new Document();
+		document.setOwner( user );
+		session.persist( document );
+		session.getTransaction().commit();
+		session.close();
+
+		// step2, we verify that the document has owner and that owner has no personal-info; then we detach
+		session = openSession();
+		session.beginTransaction();
+		document = ( Document ) session.get( Document.class, document.getId() );
+		assertNotNull( document.getOwner() );
+		assertNull( document.getOwner().getPersonalInfo() );
+		session.getTransaction().commit();
+		session.close();
+
+		// step3, try to specify the personal-info during detachment
+		Address addr = new Address();
+		addr.setStreet1( "123 6th St" );
+		addr.setCity( "Austin" );
+		addr.setState( "TX" );
+		document.getOwner().setPersonalInfo( new PersonalInfo( addr ) );
+
+		// step4 we merge the document
+		session = openSession();
+		session.beginTransaction();
+		session.merge( document );
+		session.getTransaction().commit();
+		session.close();
+
+		// step5, final test
+		session = openSession();
+		session.beginTransaction();
+		document = ( Document ) session.get( Document.class, document.getId() );
+		assertNotNull( document.getOwner() );
+		assertNotNull( document.getOwner().getPersonalInfo() );
+		assertNotNull( document.getOwner().getPersonalInfo().getHomeAddress() );
+		session.getTransaction().commit();
+		session.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/toone/CascadeToComponentAssociationTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/toone/Document.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/toone/Document.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/toone/Document.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,36 @@
+package org.hibernate.test.component.cascading.toone;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class Document {
+	private Long id;
+	private String location;
+	private User owner;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getLocation() {
+		return location;
+	}
+
+	public void setLocation(String location) {
+		this.location = location;
+	}
+
+	public User getOwner() {
+		return owner;
+	}
+
+	public void setOwner(User owner) {
+		this.owner = owner;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/toone/Document.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/toone/Mappings.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/toone/Mappings.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/toone/Mappings.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.component.cascading.toone">
+
+	<class name="Document" table="COMP_CASC_TO1_DOC">
+		<id name="id" type="long" column="ID">
+			<generator class="increment"/>
+		</id>
+        <many-to-one name="owner" class="User" cascade="persist,merge,delete"/>
+	</class>
+
+    <class name="User" table="COMP_CASC_TO1_USER">
+		<id name="id" type="long" column="ID">
+			<generator class="increment"/>
+		</id>
+        <component name="personalInfo" class="PersonalInfo">
+            <many-to-one name="homeAddress" class="Address" cascade="persist,merge,delete"/>
+		</component>
+	</class>
+
+    <class name="Address" table="COMP_CASC_TO1_ADDR">
+        <id name="id" type="long" column="ID">
+			<generator class="increment"/>
+        </id>
+        <property name="street1" type="string" column="STREET1" />
+        <property name="street2" type="string" column="STREET2" />
+        <property name="city" type="string" column="CITY" />
+        <property name="state" type="string" column="STATE" />
+        <property name="zipCode" type="string" column="ZIP_CODE" />
+    </class>
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/toone/Mappings.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/toone/PersonalInfo.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/toone/PersonalInfo.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/toone/PersonalInfo.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,25 @@
+package org.hibernate.test.component.cascading.toone;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class PersonalInfo {
+	private Address homeAddress = new Address();
+
+	public PersonalInfo() {
+	}
+
+	public PersonalInfo(Address homeAddress) {
+		this.homeAddress = homeAddress;
+	}
+
+	public Address getHomeAddress() {
+		return homeAddress;
+	}
+
+	public void setHomeAddress(Address homeAddress) {
+		this.homeAddress = homeAddress;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/toone/PersonalInfo.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/toone/User.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/toone/User.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/toone/User.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,27 @@
+package org.hibernate.test.component.cascading.toone;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class User {
+	private Long id;
+	private PersonalInfo personalInfo;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public PersonalInfo getPersonalInfo() {
+		return personalInfo;
+	}
+
+	public void setPersonalInfo(PersonalInfo personalInfo) {
+		this.personalInfo = personalInfo;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/component/cascading/toone/User.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/compositeelement/Child.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/compositeelement/Child.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/compositeelement/Child.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,71 @@
+//$Id: Child.java 6978 2005-06-01 03:29:27Z oneovthafew $
+package org.hibernate.test.compositeelement;
+
+/**
+ * @author gavin
+ */
+public class Child {
+	private String name;
+	private String bio;
+	private Parent parent;
+	private int bioLength;
+	private int position;
+
+	Child() {}
+	public Child(String name) {
+		this.name = name;
+	}
+	/**
+	 * @return Returns the name.
+	 */
+	public String getName() {
+		return name;
+	}
+	/**
+	 * @param name The name to set.
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+	/**
+	 * @return Returns the parent.
+	 */
+	public Parent getParent() {
+		return parent;
+	}
+	/**
+	 * @param parent The parent to set.
+	 */
+	public void setParent(Parent parent) {
+		this.parent = parent;
+	}
+	public String getBio() {
+		return bio;
+	}
+	public void setBio(String bio) {
+		this.bio = bio;
+	}
+
+	public int getPosition() {
+		return position;
+	}
+
+	public void setPosition(int position) {
+		this.position = position;
+	}
+
+	public int hashCode() {
+		return name.hashCode();
+	}
+	public boolean equals(Object other) {
+		Child c = (Child) other;
+		return c.parent.getId().equals(parent.getId()) 
+			&& c.name.equals(name);
+	}
+	public int getBioLength() {
+		return bioLength;
+	}
+	public void setBioLength(Integer bioLength) {
+		this.bioLength = bioLength==null ? 0 : bioLength.intValue();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/compositeelement/Child.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/compositeelement/CompositeElementTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/compositeelement/CompositeElementTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/compositeelement/CompositeElementTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,128 @@
+//$Id: CompositeElementTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.compositeelement;
+
+import java.util.ArrayList;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Mappings;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.dialect.function.SQLFunction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.mapping.Collection;
+import org.hibernate.mapping.Component;
+import org.hibernate.mapping.Formula;
+
+/**
+ * @author Gavin King
+ */
+public class CompositeElementTest extends FunctionalTestCase {
+
+	public CompositeElementTest(String str) {
+		super( str );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "compositeelement/Parent.hbm.xml" };
+	}
+
+	public void afterConfigurationBuilt(Mappings mappings, Dialect dialect) {
+		super.afterConfigurationBuilt( mappings, dialect );
+		Collection children = mappings.getCollection( Parent.class.getName() + ".children" );
+		Component childComponents = ( Component ) children.getElement();
+		Formula f = ( Formula ) childComponents.getProperty( "bioLength" ).getValue().getColumnIterator().next();
+
+		SQLFunction lengthFunction = ( SQLFunction ) dialect.getFunctions().get( "length" );
+		if ( lengthFunction != null ) {
+			ArrayList args = new ArrayList();
+			args.add( "bio" );
+			f.setFormula( lengthFunction.render( args, null ) );
+		}
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( CompositeElementTest.class );
+	}
+
+	public void testHandSQL() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Child c = new Child( "Child One" );
+		Parent p = new Parent( "Parent" );
+		p.getChildren().add( c );
+		c.setParent( p );
+		s.save( p );
+		s.flush();
+
+		p.getChildren().remove( c );
+		c.setParent( null );
+		s.flush();
+
+		p.getChildren().add( c );
+		c.setParent( p );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery( "select distinct p from Parent p join p.children c where c.name like 'Child%'" ).uniqueResult();
+		s.clear();
+		s.createQuery( "select new Child(c.name) from Parent p left outer join p.children c where c.name like 'Child%'" )
+				.uniqueResult();
+		s.clear();
+		//s.createQuery("select c from Parent p left outer join p.children c where c.name like 'Child%'").uniqueResult(); //we really need to be able to do this!
+		s.clear();
+		p = ( Parent ) s.createQuery( "from Parent p left join fetch p.children" ).uniqueResult();
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete( p );
+		t.commit();
+		s.close();
+	}
+	
+	public void testCustomColumnReadAndWrite() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Child c = new Child( "Child One" );
+		c.setPosition( 1 );
+		Parent p = new Parent( "Parent" );
+		p.getChildren().add( c );
+		c.setParent( p );
+		s.save( p );
+		s.flush();
+
+		Integer sqlValue = (Integer) s.createSQLQuery("select child_position from parentchild c where c.name='Child One'")
+				.uniqueResult();
+		assertEquals( 0, sqlValue.intValue() );
+
+		Integer hqlValue = (Integer)s.createQuery("select c.position from Parent p join p.children c where p.name='Parent'")
+				.uniqueResult();
+		assertEquals( 1, hqlValue.intValue() );
+
+		p = (Parent)s.createCriteria(Parent.class).add(Restrictions.eq("name", "Parent")).uniqueResult();
+		c = (Child)p.getChildren().iterator().next();
+		assertEquals( 1, c.getPosition() );
+
+		p = (Parent)s.createQuery("from Parent p join p.children c where c.position = 1").uniqueResult();
+		c = (Child)p.getChildren().iterator().next();
+		assertEquals( 1, c.getPosition() );
+
+		c.setPosition( 2 );
+		s.flush();
+		sqlValue = (Integer) s.createSQLQuery("select child_position from parentchild c where c.name='Child One'")
+				.uniqueResult();
+		assertEquals( 1, sqlValue.intValue() );
+		s.delete( p );
+		t.commit();
+		s.close();
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/compositeelement/CompositeElementTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/compositeelement/Parent.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/compositeelement/Parent.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/compositeelement/Parent.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,42 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+  This mapping demonstrates how to use a composite
+  element mapping to model a parent/child association.
+     
+-->
+
+<hibernate-mapping 
+	package="org.hibernate.test.compositeelement">
+	
+	<import class="Child"/>
+
+	<class name="Parent">
+		<id name="id" 
+			column="parent_id">
+			<generator class="increment"/>
+		</id>
+		<property name="name"/>
+		<set name="children" table="ParentChild">
+			<key column="parent_id"/>
+			<composite-element class="Child">
+				<parent name="parent"/>
+				<property name="name" not-null="true"/>
+				<property name="bio"/>
+				<property name="bioLength" formula="length(bio)"/>
+				<property name="position">
+					<column name="child_position"
+						not-null="true"
+						read="child_position + 1"
+						write="? - 1"/>
+				</property>				
+			</composite-element>
+		</set>
+	</class>
+	
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/compositeelement/Parent.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/compositeelement/Parent.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/compositeelement/Parent.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/compositeelement/Parent.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,54 @@
+//$Id: Parent.java 4478 2004-09-02 02:30:28Z oneovthafew $
+package org.hibernate.test.compositeelement;
+
+import java.util.Collection;
+import java.util.HashSet;
+
+/**
+ * @author gavin
+ */
+public class Parent {
+	private Long id;
+	private String name;
+	private Collection children = new HashSet();
+	Parent() {}
+	public Parent(String name) {
+		this.name = name;
+	}
+	/**
+	 * @return Returns the children.
+	 */
+	public Collection getChildren() {
+		return children;
+	}
+	/**
+	 * @param children The children to set.
+	 */
+	public void setChildren(Collection children) {
+		this.children = children;
+	}
+	/**
+	 * @return Returns the id.
+	 */
+	public Long getId() {
+		return id;
+	}
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(Long id) {
+		this.id = id;
+	}
+	/**
+	 * @return Returns the name.
+	 */
+	public String getName() {
+		return name;
+	}
+	/**
+	 * @param name The name to set.
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/compositeelement/Parent.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/AggressiveReleaseTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/AggressiveReleaseTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/AggressiveReleaseTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,255 @@
+// $Id: AggressiveReleaseTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.connections;
+
+import java.sql.Connection;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.ConnectionReleaseMode;
+import org.hibernate.Hibernate;
+import org.hibernate.ScrollableResults;
+import org.hibernate.Session;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.impl.SessionImpl;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.testing.tm.ConnectionProviderImpl;
+import org.hibernate.testing.tm.SimpleJtaTransactionManagerImpl;
+import org.hibernate.testing.tm.TransactionManagerLookupImpl;
+import org.hibernate.transaction.CMTTransactionFactory;
+import org.hibernate.util.SerializationHelper;
+
+/**
+ * Implementation of AggressiveReleaseTest.
+ *
+ * @author Steve Ebersole
+ */
+public class AggressiveReleaseTest extends ConnectionManagementTestCase {
+
+	public AggressiveReleaseTest(String name) {
+		super( name );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( AggressiveReleaseTest.class );
+	}
+
+	public void configure(Configuration cfg) {
+		super.configure( cfg );
+		cfg.setProperty( Environment.CONNECTION_PROVIDER, ConnectionProviderImpl.class.getName() );
+		cfg.setProperty( Environment.TRANSACTION_MANAGER_STRATEGY, TransactionManagerLookupImpl.class.getName() );
+		cfg.setProperty( Environment.TRANSACTION_STRATEGY, CMTTransactionFactory.class.getName() );
+		cfg.setProperty( Environment.RELEASE_CONNECTIONS, ConnectionReleaseMode.AFTER_STATEMENT.toString() );
+		cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
+		cfg.setProperty( Environment.STATEMENT_BATCH_SIZE, "0" );
+	}
+
+	protected Session getSessionUnderTest() throws Throwable {
+		return openSession();
+	}
+
+	protected void reconnect(Session session) {
+		session.reconnect();
+	}
+
+	protected void prepare() throws Throwable {
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+	}
+
+	protected void done() throws Throwable {
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+	}
+
+	// Some additional tests specifically for the aggressive-release functionality...
+
+	public void testSerializationOnAfterStatementAggressiveRelease() throws Throwable {
+		prepare();
+		Session s = getSessionUnderTest();
+		Silly silly = new Silly( "silly" );
+		s.save( silly );
+
+		// this should cause the CM to obtain a connection, and then release it
+		s.flush();
+
+		// We should be able to serialize the session at this point...
+		SerializationHelper.serialize( s );
+
+		s.delete( silly );
+		s.flush();
+
+		release( s );
+		done();
+	}
+
+	public void testSerializationFailsOnAfterStatementAggressiveReleaseWithOpenResources() throws Throwable {
+		prepare();
+		Session s = getSessionUnderTest();
+
+		Silly silly = new Silly( "silly" );
+		s.save( silly );
+
+		// this should cause the CM to obtain a connection, and then release it
+		s.flush();
+
+		// both scroll() and iterate() cause the batcher to hold on
+		// to resources, which should make aggresive-release not release
+		// the connection (and thus cause serialization to fail)
+		ScrollableResults sr = s.createQuery( "from Silly" ).scroll();
+
+		try {
+			SerializationHelper.serialize( s );
+			fail( "Serialization allowed on connected session; or aggressive release released connection with open resources" );
+		}
+		catch( IllegalStateException e ) {
+			// expected behavior
+		}
+
+		// getting the first row only because SybaseASE15Dialect throws NullPointerException
+		// if data is not read before closing the ResultSet
+		sr.next();
+
+		// Closing the ScrollableResults does currently force the batcher to
+		// aggressively release the connection
+		sr.close();
+		SerializationHelper.serialize( s );
+
+		s.delete( silly );
+		s.flush();
+
+		release( s );
+		done();
+	}
+
+	public void testQueryIteration() throws Throwable {
+		prepare();
+		Session s = getSessionUnderTest();
+		Silly silly = new Silly( "silly" );
+		s.save( silly );
+		s.flush();
+
+		Iterator itr = s.createQuery( "from Silly" ).iterate();
+		assertTrue( itr.hasNext() );
+		Silly silly2 = ( Silly ) itr.next();
+		assertEquals( silly, silly2 );
+		Hibernate.close( itr );
+
+		itr = s.createQuery( "from Silly" ).iterate();
+		Iterator itr2 = s.createQuery( "from Silly where name = 'silly'" ).iterate();
+
+		assertTrue( itr.hasNext() );
+		assertEquals( silly, itr.next() );
+		assertTrue( itr2.hasNext() );
+		assertEquals( silly, itr2.next() );
+
+		Hibernate.close( itr );
+		Hibernate.close( itr2 );
+
+		s.delete( silly );
+		s.flush();
+
+		release( s );
+		done();
+	}
+
+	public void testQueryScrolling() throws Throwable {
+		prepare();
+		Session s = getSessionUnderTest();
+		Silly silly = new Silly( "silly" );
+		s.save( silly );
+		s.flush();
+
+		ScrollableResults sr = s.createQuery( "from Silly" ).scroll();
+		assertTrue( sr.next() );
+		Silly silly2 = ( Silly ) sr.get( 0 );
+		assertEquals( silly, silly2 );
+		sr.close();
+
+		sr = s.createQuery( "from Silly" ).scroll();
+		ScrollableResults sr2 = s.createQuery( "from Silly where name = 'silly'" ).scroll();
+
+		assertTrue( sr.next() );
+		assertEquals( silly, sr.get( 0 ) );
+		assertTrue( sr2.next() );
+		assertEquals( silly, sr2.get( 0 ) );
+
+		sr.close();
+		sr2.close();
+
+		s.delete( silly );
+		s.flush();
+
+		release( s );
+		done();
+	}
+
+	public void testSuppliedConnection() throws Throwable {
+		prepare();
+
+		Connection originalConnection = ConnectionProviderImpl.getActualConnectionProvider().getConnection();
+		Session session = getSessions().openSession( originalConnection );
+
+		Silly silly = new Silly( "silly" );
+		session.save( silly );
+
+		// this will cause the connection manager to cycle through the aggressive release logic;
+		// it should not release the connection since we explicitly suplied it ourselves.
+		session.flush();
+
+		assertTrue( "Different connections", originalConnection == session.connection() );
+
+		session.delete( silly );
+		session.flush();
+
+		release( session );
+		done();
+
+		ConnectionProviderImpl.getActualConnectionProvider().closeConnection( originalConnection );
+	}
+
+	public void testBorrowedConnections() throws Throwable {
+		prepare();
+		Session s = getSessionUnderTest();
+
+		Connection conn = s.connection();
+		assertTrue( ( ( SessionImpl ) s ).getJDBCContext().getConnectionManager().hasBorrowedConnection() );
+		conn.close();
+		assertFalse( ( ( SessionImpl ) s ).getJDBCContext().getConnectionManager().hasBorrowedConnection() );
+
+		release( s );
+		done();
+	}
+
+	public void testConnectionMaintanenceDuringFlush() throws Throwable {
+		prepare();
+		Session s = getSessionUnderTest();
+		s.beginTransaction();
+
+		List entities = new ArrayList();
+		for ( int i = 0; i < 10; i++ ) {
+			Other other = new Other( "other-" + i );
+			Silly silly = new Silly( "silly-" + i, other );
+			entities.add( silly );
+			s.save( silly );
+		}
+		s.flush();
+
+		Iterator itr = entities.iterator();
+		while ( itr.hasNext() ) {
+			Silly silly = ( Silly ) itr.next();
+			silly.setName( "new-" + silly.getName() );
+			silly.getOther().setName( "new-" + silly.getOther().getName() );
+		}
+		long initialCount = getSessions().getStatistics().getConnectCount();
+		s.flush();
+		assertEquals( "connection not maintained through flush", initialCount + 1, getSessions().getStatistics().getConnectCount() );
+
+		s.createQuery( "delete from Silly" ).executeUpdate();
+		s.createQuery( "delete from Other" ).executeUpdate();
+		s.getTransaction().commit();
+		release( s );
+		done();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/AggressiveReleaseTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/BasicConnectionProviderTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/BasicConnectionProviderTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/BasicConnectionProviderTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,39 @@
+// $Id: BasicConnectionProviderTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.connections;
+
+import junit.framework.Test;
+
+import org.hibernate.ConnectionReleaseMode;
+import org.hibernate.Session;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Implementation of BasicConnectionProviderTest.
+ *
+ * @author Steve Ebersole
+ */
+public class BasicConnectionProviderTest extends ConnectionManagementTestCase {
+
+	public BasicConnectionProviderTest(String name) {
+		super( name );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( BasicConnectionProviderTest.class );
+	}
+
+	protected Session getSessionUnderTest() {
+		return openSession();
+	}
+
+	protected void reconnect(Session session) {
+		session.reconnect();
+	}
+
+	public void configure(Configuration cfg) {
+		super.configure( cfg );
+		cfg.setProperty( Environment.RELEASE_CONNECTIONS, ConnectionReleaseMode.ON_CLOSE.toString() );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/BasicConnectionProviderTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/ConnectionManagementTestCase.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/ConnectionManagementTestCase.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/ConnectionManagementTestCase.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,292 @@
+// $Id: ConnectionManagementTestCase.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.connections;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.util.SerializationHelper;
+
+/**
+ * Common test cases relating to session management and how the sessions
+ * manages its underlying jdbc connection across different config
+ * scenarios.  The different config scenarios are controlled by the
+ * individual test subclasses.
+ * <p/>
+ * In general, all the tests required are defined here in templated fashion.
+ * Subclassed then override various hook methods specific to their given
+ * scneario being tested.
+ *
+ * @author Steve Ebersole
+ */
+public abstract class ConnectionManagementTestCase extends FunctionalTestCase {
+
+	public ConnectionManagementTestCase(String name) {
+		super( name );
+	}
+
+	public final String[] getMappings() {
+		return new String[] { "connections/Silly.hbm.xml" };
+	}
+
+
+	// hooks ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+	/**
+	 * Used to prepare the environment for testing (e.g., starting a
+	 * JTA transaction or obtaining a user-supplied connection).
+	 *
+	 * @throws Throwable indicates problems preparing
+	 */
+	protected void prepare() throws Throwable {
+	}
+
+	/**
+	 * Used to cleanup the environment after testing (e.g., ending a JTA
+	 * transaction or closing a user-supplied connection).
+	 *
+	 * @throws Throwable indicates problems cleaning up
+	 */
+	protected void done() throws Throwable {
+	}
+
+	/**
+	 * Used to get a session configured based on the config scenario being
+	 * tested.
+	 *
+	 * @return The session to be used in testing.
+	 * @throws Throwable Indicates problems building a test session fixture.
+	 */
+	protected abstract Session getSessionUnderTest() throws Throwable;
+
+	/**
+	 * Used to release a {@link #getSessionUnderTest fixture session}.
+	 * Overridden to perform session releasing/testing specific to the given
+	 * config scenario being tested.
+	 *
+	 * @param session The session to be released.
+	 */
+	protected void release(Session session) {
+		if ( session != null && session.isOpen() ) {
+			try {
+				session.close();
+			}
+			catch( Throwable ignore ) {
+			}
+		}
+	}
+
+	/**
+	 * Perform any steps needed to reconnect a fixture session.
+	 *
+	 * @param session The fixture session to be reconnected.
+	 * @throws Throwable Indicates problems reconnecting.
+	 */
+	protected abstract void reconnect(Session session) throws Throwable;
+
+	/**
+	 * Check the state of a fixture session after serialization, as well
+	 * as validate the environmental state after session serialization.
+	 *
+	 * @param session The fixture session that was serialized.
+	 */
+	protected void checkSerializedState(Session session) {
+	}
+
+	/**
+	 * Check the state of a fixture session after deserialization, as well
+	 * as validate the environmental state after session deserialization.
+	 *
+	 * @param session The fixture session that was deserialized.
+	 */
+	protected void checkDeserializedState(Session session) {
+	}
+
+
+	// tests ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+	/**
+	 * Tests to validate that a session holding JDBC resources will not
+	 * be allowed to serialize.
+	 */
+	public final void testConnectedSerialization() throws Throwable {
+		prepare();
+		Session sessionUnderTest = getSessionUnderTest();
+
+		// force the connection to be retained
+		sessionUnderTest.createQuery( "from Silly" ).scroll();
+
+		try {
+			SerializationHelper.serialize( sessionUnderTest );
+
+			fail( "Serialization of connected session allowed!" );
+		}
+		catch( IllegalStateException e ) {
+			// expected behaviour
+		}
+		finally {
+			release( sessionUnderTest );
+			done();
+		}
+	}
+
+	/**
+	 * Test that a session which has been manually disconnected will be allowed
+	 * to serialize.
+	 */
+	public final void testManualDisconnectedSerialization() throws Throwable {
+		prepare();
+		Session sessionUnderTest = getSessionUnderTest();
+
+		sessionUnderTest.disconnect();
+
+		SerializationHelper.serialize( sessionUnderTest );
+		checkSerializedState( sessionUnderTest );
+
+		release( sessionUnderTest );
+		done();
+	}
+
+	/**
+	 * Test that the legacy manual disconnect()/reconnect() chain works as
+	 * expected in the given environment.
+	 */
+	public final void testManualDisconnectChain() throws Throwable {
+		prepare();
+		Session sessionUnderTest = getSessionUnderTest();
+
+		sessionUnderTest.disconnect();
+
+		byte[] bytes = SerializationHelper.serialize( sessionUnderTest );
+		checkSerializedState( sessionUnderTest );
+		Session s2 = ( Session ) SerializationHelper.deserialize( bytes );
+		checkDeserializedState( s2 );
+
+		reconnect( s2 );
+
+		s2.disconnect();
+		reconnect( s2 );
+
+		release( sessionUnderTest );
+		release( s2 );
+		done();
+	}
+
+	/**
+	 * Test that the legacy manual disconnect()/reconnect() chain works as
+	 * expected in the given environment.  Similiar to {@link #testManualDisconnectChain}
+	 * expect that here we force the session to acquire and hold JDBC resources
+	 * prior to disconnecting.
+	 */
+	public final void testManualDisconnectWithOpenResources() throws Throwable {
+		prepare();
+		Session sessionUnderTest = getSessionUnderTest();
+
+		Silly silly = new Silly( "tester" );
+		sessionUnderTest.save( silly );
+		sessionUnderTest.flush();
+
+		sessionUnderTest.createQuery( "from Silly" ).iterate();
+
+		sessionUnderTest.disconnect();
+		SerializationHelper.serialize( sessionUnderTest );
+		checkSerializedState( sessionUnderTest );
+
+		reconnect( sessionUnderTest );
+		sessionUnderTest.createQuery( "from Silly" ).scroll();
+
+		sessionUnderTest.disconnect();
+		SerializationHelper.serialize( sessionUnderTest );
+		checkSerializedState( sessionUnderTest );
+
+		reconnect( sessionUnderTest );
+		sessionUnderTest.delete( silly );
+		sessionUnderTest.flush();
+
+		release( sessionUnderTest );
+		done();
+	}
+
+	/**
+	 * Test that the basic session usage template works in all environment
+	 * scenarios.
+	 */
+	public void testBasicSessionUsage() throws Throwable {
+		prepare();
+		Session s = null;
+		Transaction txn = null;
+		try {
+			s = getSessionUnderTest();
+			txn = s.beginTransaction();
+			s.createQuery( "from Silly" ).list();
+			txn.commit();
+		}
+		catch( Throwable t ) {
+			if ( txn != null ) {
+				try {
+					txn.rollback();
+				}
+				catch( Throwable ignore ) {
+				}
+			}
+		}
+		finally {
+			if ( s != null && s.isOpen() ) {
+				try {
+					s.close();
+				}
+				catch( Throwable ignore ) {
+				}
+			}
+		}
+		done();
+	}
+
+	/**
+	 * Test that session-closed protections work properly in all environments.
+	 */
+	public void testSessionClosedProtections() throws Throwable {
+		prepare();
+		Session s = getSessionUnderTest();
+		release( s );
+		done();
+		assertFalse( s.isOpen() );
+		assertFalse( s.isConnected() );
+		assertNotNull( s.getStatistics() );
+		assertNotNull( s.toString() );
+
+		try {
+			s.createQuery( "from Silly" ).list();
+			fail( "allowed to create query on closed session" );
+		}
+		catch( Throwable ignore ) {
+		}
+
+		try {
+			s.getTransaction();
+			fail( "allowed to access transaction on closed session" );
+		}
+		catch( Throwable ignore ) {
+		}
+
+		try {
+			s.connection();
+			fail( "allowed to access connection on closed session" );
+		}
+		catch( Throwable ignore ) {
+		}
+
+		try {
+			s.close();
+			fail( "allowed to close already closed session" );
+		}
+		catch( Throwable ignore ) {
+		}
+
+		try {
+			s.isDirty();
+			fail( "allowed to check dirtiness of closed session" );
+		}
+		catch( Throwable ignore ) {
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/ConnectionManagementTestCase.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/CurrentSessionConnectionTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/CurrentSessionConnectionTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/CurrentSessionConnectionTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,31 @@
+// $Id: CurrentSessionConnectionTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.connections;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Implementation of CurrentSessionConnectionTest.
+ *
+ * @author Steve Ebersole
+ */
+public class CurrentSessionConnectionTest extends AggressiveReleaseTest {
+
+	public CurrentSessionConnectionTest(String name) {
+		super( name );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( CurrentSessionConnectionTest.class );
+	}
+
+	protected Session getSessionUnderTest() throws Throwable {
+		return getSessions().getCurrentSession();
+	}
+
+	protected void release(Session session) {
+		// do nothing, txn synch should release session as part of current-session definition
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/CurrentSessionConnectionTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/Other.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/Other.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/Other.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,32 @@
+package org.hibernate.test.connections;
+
+/**
+ * @author Steve Ebersole
+ */
+public class Other {
+	private Long id;
+	private String name;
+
+	public Other() {
+	}
+
+	public Other(String name) {
+		this.name = name;
+	}
+
+	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;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/Other.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/Silly.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/Silly.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/Silly.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.connections">
+
+	<class name="Silly">
+		<id name="id" type="long">
+			<generator class="native"/>
+		</id>
+		<property name="name"/>
+        <many-to-one name="other" class="Other" cascade="all"/>
+    </class>
+
+	<class name="Other">
+		<id name="id" type="long">
+			<generator class="native"/>
+		</id>
+		<property name="name"/>
+	</class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/Silly.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/Silly.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/Silly.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/Silly.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,51 @@
+// $Id: Silly.java 9595 2006-03-10 18:14:21Z steve.ebersole at jboss.com $
+package org.hibernate.test.connections;
+
+import java.io.Serializable;
+
+/**
+ * Implementation of Silly.
+ *
+ * @author Steve Ebersole
+ */
+public class Silly implements Serializable {
+	private Long id;
+	private String name;
+	private Other other;
+
+	public Silly() {
+	}
+
+	public Silly(String name) {
+		this.name = name;
+	}
+
+	public Silly(String name, Other other) {
+		this.name = name;
+		this.other = other;
+	}
+
+	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 Other getOther() {
+		return other;
+	}
+
+	public void setOther(Other other) {
+		this.other = other;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/Silly.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/SuppliedConnectionTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/SuppliedConnectionTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/SuppliedConnectionTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,121 @@
+// $Id: SuppliedConnectionTest.java 11332 2007-03-22 17:34:55Z steve.ebersole at jboss.com $
+package org.hibernate.test.connections;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+
+import junit.framework.Test;
+
+import org.hibernate.ConnectionReleaseMode;
+import org.hibernate.Session;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.connection.ConnectionProvider;
+import org.hibernate.connection.ConnectionProviderFactory;
+import org.hibernate.connection.UserSuppliedConnectionProvider;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.tool.hbm2ddl.SchemaExport;
+
+/**
+ * Implementation of SuppliedConnectionTest.
+ *
+ * @author Steve Ebersole
+ */
+public class SuppliedConnectionTest extends ConnectionManagementTestCase {
+
+	private ConnectionProvider cp = ConnectionProviderFactory.newConnectionProvider();
+	private Connection connectionUnderTest;
+
+	public SuppliedConnectionTest(String name) {
+		super( name );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( SuppliedConnectionTest.class );
+	}
+
+	protected Session getSessionUnderTest() throws Throwable {
+		connectionUnderTest = cp.getConnection();
+		return getSessions().openSession( connectionUnderTest );
+	}
+
+	protected void reconnect(Session session) {
+		session.reconnect( connectionUnderTest );
+	}
+
+	protected void done() throws Throwable {
+		cp.closeConnection( connectionUnderTest );
+	}
+
+	public void configure(Configuration cfg) {
+		super.configure( cfg );
+		cfg.setProperty( Environment.RELEASE_CONNECTIONS, ConnectionReleaseMode.ON_CLOSE.toString() );
+		cfg.setProperty( Environment.CONNECTION_PROVIDER, UserSuppliedConnectionProvider.class.getName() );
+		boolean supportsScroll = true;
+		Connection conn = null;
+		try {
+			conn = cp.getConnection();
+			supportsScroll = conn.getMetaData().supportsResultSetType(ResultSet.TYPE_SCROLL_INSENSITIVE);
+		}
+		catch( Throwable ignore ) {
+		}
+		finally {
+			if ( conn != null ) {
+				try {
+					conn.close();
+				}
+				catch( Throwable ignore ) {
+					// ignore it...
+				}
+			}
+		}
+		cfg.setProperty( Environment.USE_SCROLLABLE_RESULTSET, "" + supportsScroll );
+	}
+
+	public boolean createSchema() {
+		return false;
+	}
+
+	public boolean recreateSchemaAfterFailure() {
+		return false;
+	}
+
+	protected void prepareTest() throws Exception {
+		super.prepareTest();
+		Connection conn = cp.getConnection();
+		try {
+			new SchemaExport( getCfg(), conn ).create( false, true );
+		}
+		finally {
+			if ( conn != null ) {
+				try {
+					cp.closeConnection( conn );
+				}
+				catch( Throwable ignore ) {
+				}
+			}
+		}
+	}
+
+	protected void cleanupTest() throws Exception {
+		Connection conn = cp.getConnection();
+		try {
+			new SchemaExport( getCfg(), conn ).drop( false, true );
+		}
+		finally {
+			if ( conn != null ) {
+				try {
+					cp.closeConnection( conn );
+				}
+				catch( Throwable ignore ) {
+				}
+			}
+		}
+		try {
+			cp.close();
+		}
+		catch( Throwable ignore ) {
+		}
+		super.cleanupTest();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/SuppliedConnectionTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/ThreadLocalCurrentSessionTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/ThreadLocalCurrentSessionTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/ThreadLocalCurrentSessionTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,102 @@
+package org.hibernate.test.connections;
+
+import junit.framework.Test;
+
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.context.ThreadLocalSessionContext;
+import org.hibernate.engine.SessionFactoryImplementor;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Steve Ebersole
+ */
+public class ThreadLocalCurrentSessionTest extends ConnectionManagementTestCase {
+
+	public ThreadLocalCurrentSessionTest(String name) {
+		super( name );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( ThreadLocalCurrentSessionTest.class );
+	}
+
+	public void configure(Configuration cfg) {
+		super.configure( cfg );
+		cfg.setProperty( Environment.CURRENT_SESSION_CONTEXT_CLASS, TestableThreadLocalContext.class.getName() );
+		cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
+	}
+
+	protected Session getSessionUnderTest() throws Throwable {
+		Session session = getSessions().getCurrentSession();
+		session.beginTransaction();
+		return session;
+	}
+
+	protected void release(Session session) {
+		long initialCount = getSessions().getStatistics().getSessionCloseCount();
+		session.getTransaction().commit();
+		long subsequentCount = getSessions().getStatistics().getSessionCloseCount();
+		assertEquals( "Session still open after commit", initialCount + 1, subsequentCount );
+		// also make sure it was cleaned up from the internal ThreadLocal...
+		assertFalse( "session still bound to internal ThreadLocal", TestableThreadLocalContext.hasBind() );
+	}
+
+	protected void reconnect(Session session) throws Throwable {
+//		session.reconnect();
+		session.beginTransaction();
+	}
+
+	protected void checkSerializedState(Session session) {
+		assertFalse( "session still bound after serialize", TestableThreadLocalContext.isSessionBound( session ) );
+	}
+
+	protected void checkDeserializedState(Session session) {
+		assertTrue( "session not bound after deserialize", TestableThreadLocalContext.isSessionBound( session ) );
+	}
+
+	public void testTransactionProtection() {
+		Session session = getSessions().getCurrentSession();
+		try {
+			session.createQuery( "from Silly" );
+			fail( "method other than beginTransaction{} allowed" );
+		}
+		catch ( HibernateException e ) {
+			// ok
+		}
+	}
+
+	public void testContextCleanup() {
+		Session session = getSessions().getCurrentSession();
+		session.beginTransaction();
+		session.getTransaction().commit();
+		assertFalse( "session open after txn completion", session.isOpen() );
+		assertFalse( "session still bound after txn completion", TestableThreadLocalContext.isSessionBound( session ) );
+
+		Session session2 = getSessions().getCurrentSession();
+		assertFalse( "same session returned after txn completion", session == session2 );
+		session2.close();
+		assertFalse( "session open after closing", session2.isOpen() );
+		assertFalse( "session still bound after closing", TestableThreadLocalContext.isSessionBound( session2 ) );
+	}
+
+	public static class TestableThreadLocalContext extends ThreadLocalSessionContext {
+		private static TestableThreadLocalContext me;
+
+		public TestableThreadLocalContext(SessionFactoryImplementor factory) {
+			super( factory );
+			me = this;
+		}
+
+		public static boolean isSessionBound(Session session) {
+			return sessionMap() != null && sessionMap().containsKey( me.factory )
+					&& sessionMap().get( me.factory ) == session;
+		}
+
+		public static boolean hasBind() {
+			return sessionMap() != null && sessionMap().containsKey( me.factory );
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/connections/ThreadLocalCurrentSessionTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/AbstractFoo.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/AbstractFoo.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/AbstractFoo.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,39 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.criteria;
+
+
+public abstract class AbstractFoo {
+ 
+    private Integer id;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/AbstractFoo.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/Animal.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/Animal.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/Animal.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+<hibernate-mapping
+	package="org.hibernate.test.hql">
+
+	
+
+    <class name="StateProvince">
+        <id name="id">
+            <generator class="native"/>
+        </id>
+        <property name="name"/>
+        <property name="isoCode"/>
+    </class>
+
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/Animal.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/Bar.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/Bar.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/Bar.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,47 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.criteria;
+
+public class Bar {
+    private Integer id;
+
+    AbstractFoo myFoo;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public AbstractFoo getMyFoo() {
+        return myFoo;
+    }
+
+    public void setMyFoo(AbstractFoo myFoo) {
+        this.myFoo = myFoo;
+    }
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/Bar.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/CityState.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/CityState.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/CityState.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,58 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.criteria;
+
+/**
+ * @author Gail Badner
+ */
+
+public class CityState {
+	private String city;
+	private String state;
+
+	public CityState() {}
+
+	public CityState(String city, String state) {
+		this.city = city;
+		this.state = state;
+	}
+
+	public String getCity() {
+		return city;
+	}
+
+	public void setCity(String city) {
+		this.city = city;
+	}
+
+	public String getState() {
+		return state;
+	}
+
+	public void setState(String state) {
+		this.state = state;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/CityState.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/Course.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/Course.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/Course.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,33 @@
+//$Id: Course.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.criteria;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author Gavin King
+ */
+public class Course {
+	private String courseCode;
+	private String description;
+	private Set courseMeetings = new HashSet();
+
+	public String getCourseCode() {
+		return courseCode;
+	}
+	public void setCourseCode(String courseCode) {
+		this.courseCode = courseCode;
+	}
+	public String getDescription() {
+		return description;
+	}
+	public void setDescription(String description) {
+		this.description = description;
+	}
+	public Set getCourseMeetings() {
+		return courseMeetings;
+	}
+	public void setCourseMeetings(Set courseMeetings) {
+		this.courseMeetings = courseMeetings;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/Course.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/CourseMeeting.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/CourseMeeting.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/CourseMeeting.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,29 @@
+package org.hibernate.test.criteria;
+
+/**
+ * @author Gail Badner
+ */
+public class CourseMeeting {
+	private CourseMeetingId id;
+	private Course course;
+
+	public CourseMeeting() {}
+
+	public CourseMeeting(Course course, String day, int period, String location) {
+		this.id = new CourseMeetingId( course, day, period, location );
+		this.course = course;
+	}
+
+	public CourseMeetingId getId() {
+		return id;
+	}
+	public void setId(CourseMeetingId id) {
+		this.id = id;
+	}
+	public  Course getCourse() {
+		return course;
+	}
+	public void setCourse(Course course) {
+		this.course = course;
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/CourseMeeting.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/CourseMeetingId.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/CourseMeetingId.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/CourseMeetingId.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,47 @@
+package org.hibernate.test.criteria;
+
+import java.io.Serializable;
+
+/**
+ * @author Gail Badner
+ */
+public class CourseMeetingId implements Serializable {
+	private String courseCode;
+	private String day;
+	private int period;
+	private String location;
+
+	public CourseMeetingId() {}
+
+	public CourseMeetingId(Course course, String day, int period, String location) {
+		this.courseCode = course.getCourseCode();
+		this.day = day;
+		this.period = period;
+		this.location = location;
+	}
+
+	public String getCourseCode() {
+		return courseCode;
+	}
+	public void setCourseCode(String courseCode) {
+		this.courseCode = courseCode;
+	}
+	public String getDay() {
+		return day;
+	}
+	public void setDay(String day) {
+		this.day = day;
+	}
+	public int getPeriod() {
+		return period;
+	}
+	public void setPeriod(int period) {
+		this.period = period;
+	}
+	public String getLocation() {
+		return location;
+	}
+	public void setLocation(String location) {
+		this.location = location;
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/CourseMeetingId.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/CriteriaQueryTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/CriteriaQueryTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/CriteriaQueryTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,1588 @@
+//$Id: CriteriaQueryTest.java 10976 2006-12-12 23:22:26Z steve.ebersole at jboss.com $
+package org.hibernate.test.criteria;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.Test;
+
+import org.hibernate.Criteria;
+import org.hibernate.FetchMode;
+import org.hibernate.Hibernate;
+import org.hibernate.JDBCException;
+import org.hibernate.QueryException;
+import org.hibernate.ScrollableResults;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.criterion.DetachedCriteria;
+import org.hibernate.criterion.Example;
+import org.hibernate.criterion.MatchMode;
+import org.hibernate.criterion.Order;
+import org.hibernate.criterion.Projection;
+import org.hibernate.criterion.Projections;
+import org.hibernate.criterion.Property;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.criterion.Subqueries;
+import org.hibernate.exception.SQLGrammarException;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.hql.Animal;
+import org.hibernate.test.hql.Reptile;
+import org.hibernate.transform.Transformers;
+import org.hibernate.type.Type;
+import org.hibernate.util.SerializationHelper;
+
+/**
+ * @author Gavin King
+ */
+public class CriteriaQueryTest extends FunctionalTestCase {
+	
+	public CriteriaQueryTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "criteria/Enrolment.hbm.xml","criteria/Foo.hbm.xml", "hql/Animal.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		super.configure( cfg );
+		cfg.setProperty( Environment.USE_QUERY_CACHE, "true" );
+		cfg.setProperty( Environment.CACHE_REGION_PREFIX, "criteriaquerytest" );
+		cfg.setProperty( Environment.USE_SECOND_LEVEL_CACHE, "true" );
+		cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( CriteriaQueryTest.class );
+	}
+
+	public void testEscapeCharacter() {
+		Session session = openSession();
+		Transaction t = session.beginTransaction();
+		Course c1 = new Course();
+		c1.setCourseCode( "course-1" );
+		c1.setDescription( "%1" );
+		Course c2 = new Course();
+		c2.setCourseCode( "course-2" );
+		c2.setDescription( "%2" );
+		Course c3 = new Course();
+		c3.setCourseCode( "course-3" );
+		c3.setDescription( "control" );
+		session.persist( c1 );
+		session.persist( c2 );
+		session.persist( c3 );
+		session.flush();
+		session.clear();
+
+		// finds all courses which have a description equal to '%1'
+		Course example = new Course();
+		example.setDescription( "&%1" );
+		List result = session.createCriteria( Course.class )
+				.add( Example.create( example ).ignoreCase().enableLike().setEscapeCharacter( new Character( '&' ) ) )
+				.list();
+		assertEquals( 1, result.size() );
+		// finds all courses which contain '%' as the first char in the description 
+		example.setDescription( "&%%" );
+		result = session.createCriteria( Course.class )
+				.add( Example.create( example ).ignoreCase().enableLike().setEscapeCharacter( new Character( '&' ) ) )
+				.list();
+		assertEquals( 2, result.size() );
+
+		session.createQuery( "delete Course" ).executeUpdate();
+		t.commit();
+		session.close();
+	}
+
+	public void testScrollCriteria() {
+		Session session = openSession();
+		Transaction t = session.beginTransaction();
+
+		Course course = new Course();
+		course.setCourseCode("HIB");
+		course.setDescription("Hibernate Training");
+		session.persist(course);
+		session.flush();
+		session.clear();
+		ScrollableResults sr = session.createCriteria(Course.class).scroll();
+		assertTrue( sr.next() );
+		course = (Course) sr.get(0);
+		assertNotNull(course);
+		sr.close();
+		session.delete(course);
+		
+		t.commit();
+		session.close();
+		
+	}
+	
+	public void testSubselect() {
+
+		Session session = openSession();
+		Transaction t = session.beginTransaction();
+
+		Course course = new Course();
+		course.setCourseCode("HIB");
+		course.setDescription("Hibernate Training");
+		session.persist(course);
+		
+		Student gavin = new Student();
+		gavin.setName("Gavin King");
+		gavin.setStudentNumber(232);
+		session.persist(gavin);
+
+		Enrolment enrolment2 = new Enrolment();
+		enrolment2.setCourse(course);
+		enrolment2.setCourseCode(course.getCourseCode());
+		enrolment2.setSemester((short) 3);
+		enrolment2.setYear((short) 1998);
+		enrolment2.setStudent(gavin);
+		enrolment2.setStudentNumber(gavin.getStudentNumber());
+		gavin.getEnrolments().add(enrolment2);
+		session.persist(enrolment2);
+		
+		DetachedCriteria dc = DetachedCriteria.forClass(Student.class)
+			.add( Property.forName("studentNumber").eq( new Long(232) ) )
+			.setProjection( Property.forName("name") );
+
+		session.createCriteria(Student.class)
+			.add( Subqueries.propertyEqAll("name", dc) )
+			.list();
+		
+		session.createCriteria(Student.class)
+			.add( Subqueries.exists(dc) )
+			.list();
+	
+		session.createCriteria(Student.class)
+			.add( Property.forName("name").eqAll(dc) )
+			.list();
+	
+		session.createCriteria(Student.class)
+			.add( Subqueries.in("Gavin King", dc) )
+			.list();
+		
+		DetachedCriteria dc2 = DetachedCriteria.forClass(Student.class, "st")
+			.add( Property.forName("st.studentNumber").eqProperty("e.studentNumber") )
+			.setProjection( Property.forName("name") );
+		
+		session.createCriteria(Enrolment.class, "e")
+			.add( Subqueries.eq("Gavin King", dc2) )
+			.list();
+
+		DetachedCriteria dc3 = DetachedCriteria.forClass(Student.class, "st")
+			.createCriteria("enrolments")
+				.createCriteria("course")
+					.add( Property.forName("description").eq("Hibernate Training") )
+					.setProjection( Property.forName("st.name") );
+	
+		session.createCriteria(Enrolment.class, "e")
+			.add( Subqueries.eq("Gavin King", dc3) )
+			.list();
+
+		session.delete(enrolment2);
+		session.delete(gavin);
+		session.delete(course);
+		t.commit();
+		session.close();
+		
+	}
+
+	public void testSubselectWithComponent() {
+
+		Session session = openSession();
+		Transaction t = session.beginTransaction();
+
+		Course course = new Course();
+		course.setCourseCode("HIB");
+		course.setDescription("Hibernate Training");
+		session.persist(course);
+
+		CityState odessaWa = new CityState( "Odessa", "WA" );
+
+		Student gavin = new Student();
+		gavin.setName("Gavin King");
+		gavin.setStudentNumber(232);
+		gavin.setCityState( odessaWa );
+		session.persist(gavin);
+
+		Enrolment enrolment2 = new Enrolment();
+		enrolment2.setCourse(course);
+		enrolment2.setCourseCode(course.getCourseCode());
+		enrolment2.setSemester((short) 3);
+		enrolment2.setYear((short) 1998);
+		enrolment2.setStudent(gavin);
+		enrolment2.setStudentNumber(gavin.getStudentNumber());
+		gavin.getEnrolments().add(enrolment2);
+		session.persist(enrolment2);
+
+		DetachedCriteria dc = DetachedCriteria.forClass(Student.class)
+			.add( Property.forName("cityState").eq( odessaWa ) )
+			.setProjection( Property.forName("cityState") );
+
+		session.createCriteria(Student.class)
+			.add( Subqueries.exists(dc) )
+			.list();
+		t.commit();
+		session.close();
+
+		session = openSession();
+		t = session.beginTransaction();
+		try {
+			session.createCriteria(Student.class)
+				.add( Subqueries.propertyEqAll("cityState", dc) )
+				.list();
+			fail( "should have failed because cannot compare subquery results with multiple columns" );
+		}
+		catch ( QueryException ex ) {
+			// expected
+		}
+		finally {
+			t.rollback();
+			session.close();
+		}
+
+		session = openSession();
+		t = session.beginTransaction();
+		try {
+			session.createCriteria(Student.class)
+				.add( Property.forName("cityState").eqAll(dc) )
+				.list();
+			fail( "should have failed because cannot compare subquery results with multiple columns" );
+		}
+		catch ( QueryException ex ) {
+			// expected
+		}
+		finally {
+			t.rollback();
+			session.close();
+		}
+
+		session = openSession();
+		t = session.beginTransaction();
+		try {
+			session.createCriteria(Student.class)
+				.add( Subqueries.in( odessaWa, dc) )
+				.list();
+			fail( "should have failed because cannot compare subquery results with multiple columns" );
+		}
+		catch ( JDBCException ex ) {
+			// expected
+		}
+		finally {
+			t.rollback();
+			session.close();
+		}
+
+		session = openSession();
+		t = session.beginTransaction();
+		DetachedCriteria dc2 = DetachedCriteria.forClass(Student.class, "st1")
+			.add( Property.forName("st1.cityState").eqProperty("st2.cityState") )
+			.setProjection( Property.forName("cityState") );
+		try {
+			session.createCriteria(Student.class, "st2")
+				.add( Subqueries.eq( odessaWa, dc2) )
+				.list();
+			fail( "should have failed because cannot compare subquery results with multiple columns" );
+		}
+		catch ( JDBCException ex ) {
+			// expected
+		}
+		finally {
+			t.rollback();
+			session.close();
+		}
+
+		session = openSession();
+		t = session.beginTransaction();
+		DetachedCriteria dc3 = DetachedCriteria.forClass(Student.class, "st")
+			.createCriteria("enrolments")
+				.createCriteria("course")
+					.add( Property.forName("description").eq("Hibernate Training") )
+					.setProjection( Property.forName("st.cityState") );
+		try {
+			session.createCriteria(Enrolment.class, "e")
+				.add( Subqueries.eq( odessaWa, dc3) )
+				.list();
+			fail( "should have failed because cannot compare subquery results with multiple columns" );
+		}
+		catch ( JDBCException ex ) {
+			// expected
+		}
+		finally {
+			t.rollback();
+			session.close();
+		}
+
+		session = openSession();
+		t = session.beginTransaction();
+		session.delete(enrolment2);
+		session.delete(gavin);
+		session.delete(course);
+		t.commit();
+		session.close();
+
+	}
+
+	public void testDetachedCriteria() {
+		
+		DetachedCriteria dc = DetachedCriteria.forClass(Student.class)
+			.add( Property.forName("name").eq("Gavin King") )
+			.addOrder( Order.asc("studentNumber") )
+			.setProjection( Property.forName("studentNumber") );
+		
+		byte[] bytes = SerializationHelper.serialize(dc);
+		
+		dc = (DetachedCriteria) SerializationHelper.deserialize(bytes);
+		
+		Session session = openSession();
+		Transaction t = session.beginTransaction();
+
+		Student gavin = new Student();
+		gavin.setName("Gavin King");
+		gavin.setStudentNumber(232);
+		Student bizarroGavin = new Student();
+		bizarroGavin.setName("Gavin King");
+		bizarroGavin.setStudentNumber(666);
+		session.persist(bizarroGavin);
+		session.persist(gavin);
+		
+		List result = dc.getExecutableCriteria(session)
+			.setMaxResults(3)
+			.list();
+		
+		assertEquals( result.size(), 2 );
+		assertEquals( result.get(0), new Long(232) );
+		assertEquals( result.get(1), new Long(666) );
+		
+		session.delete(gavin);
+		session.delete(bizarroGavin);
+		t.commit();
+		session.close();
+	}
+	
+		public void testProjectionCache() {
+			Session s = openSession();
+			Transaction t = s.beginTransaction();
+			
+			Course course = new Course();
+			course.setCourseCode("HIB");
+			course.setDescription("Hibernate Training");
+			s.save(course);
+			
+			Student gavin = new Student();
+			gavin.setName("Gavin King");
+			gavin.setStudentNumber(666);
+			s.save(gavin);
+			
+			Student xam = new Student();
+			xam.setName("Max Rydahl Andersen");
+			xam.setStudentNumber(101);
+			s.save(xam);
+			
+			Enrolment enrolment1 = new Enrolment();
+			enrolment1.setCourse(course);
+			enrolment1.setCourseCode(course.getCourseCode());
+			enrolment1.setSemester((short) 1);
+			enrolment1.setYear((short) 1999);
+			enrolment1.setStudent(xam);
+			enrolment1.setStudentNumber(xam.getStudentNumber());
+			xam.getEnrolments().add(enrolment1);
+			s.save(enrolment1);
+			
+			Enrolment enrolment2 = new Enrolment();
+			enrolment2.setCourse(course);
+			enrolment2.setCourseCode(course.getCourseCode());
+			enrolment2.setSemester((short) 3);
+			enrolment2.setYear((short) 1998);
+			enrolment2.setStudent(gavin);
+			enrolment2.setStudentNumber(gavin.getStudentNumber());
+			gavin.getEnrolments().add(enrolment2);
+			s.save(enrolment2);
+			
+			List list = s.createCriteria(Enrolment.class)
+				.createAlias("student", "s")
+				.createAlias("course", "c")
+				.add( Restrictions.isNotEmpty("s.enrolments") )
+				.setProjection( Projections.projectionList()
+						.add( Projections.property("s.name") )
+						.add( Projections.property("c.description") )
+				)
+				.setCacheable(true)
+				.list();
+			
+			assertEquals( list.size(), 2 );
+			assertEquals( ( (Object[]) list.get(0) ).length, 2 );
+			assertEquals( ( (Object[]) list.get(1) ).length, 2 );
+			
+			t.commit();
+			s.close();
+	
+			s = openSession();
+			t = s.beginTransaction();
+			
+			s.createCriteria(Enrolment.class)
+				.createAlias("student", "s")
+				.createAlias("course", "c")
+				.add( Restrictions.isNotEmpty("s.enrolments") )
+				.setProjection( Projections.projectionList()
+						.add( Projections.property("s.name") )
+						.add( Projections.property("c.description") )
+				)
+				.setCacheable(true)
+				.list();
+		
+			assertEquals( list.size(), 2 );
+			assertEquals( ( (Object[]) list.get(0) ).length, 2 );
+			assertEquals( ( (Object[]) list.get(1) ).length, 2 );
+			
+			t.commit();
+			s.close();
+	
+			s = openSession();
+			t = s.beginTransaction();
+			
+			s.createCriteria(Enrolment.class)
+				.createAlias("student", "s")
+				.createAlias("course", "c")
+				.add( Restrictions.isNotEmpty("s.enrolments") )
+				.setProjection( Projections.projectionList()
+						.add( Projections.property("s.name") )
+						.add( Projections.property("c.description") )
+				)
+				.setCacheable(true)
+				.list();
+			
+			assertEquals( list.size(), 2 );
+			assertEquals( ( (Object[]) list.get(0) ).length, 2 );
+			assertEquals( ( (Object[]) list.get(1) ).length, 2 );
+			
+			s.delete(enrolment1);
+			s.delete(enrolment2);
+			s.delete(course);
+			s.delete(gavin);
+			s.delete(xam);
+		
+			t.commit();
+			s.close();
+	}
+	
+	public void testProjections() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		
+		Course course = new Course();
+		course.setCourseCode("HIB");
+		course.setDescription("Hibernate Training");
+		s.save(course);
+		
+		Student gavin = new Student();
+		gavin.setName("Gavin King");
+		gavin.setStudentNumber(667);
+		s.save(gavin);
+		
+		Student xam = new Student();
+		xam.setName("Max Rydahl Andersen");
+		xam.setStudentNumber(101);
+		s.save(xam);
+		
+		Enrolment enrolment = new Enrolment();
+		enrolment.setCourse(course);
+		enrolment.setCourseCode(course.getCourseCode());
+		enrolment.setSemester((short) 1);
+		enrolment.setYear((short) 1999);
+		enrolment.setStudent(xam);
+		enrolment.setStudentNumber(xam.getStudentNumber());
+		xam.getEnrolments().add(enrolment);
+		s.save(enrolment);
+		
+		enrolment = new Enrolment();
+		enrolment.setCourse(course);
+		enrolment.setCourseCode(course.getCourseCode());
+		enrolment.setSemester((short) 3);
+		enrolment.setYear((short) 1998);
+		enrolment.setStudent(gavin);
+		enrolment.setStudentNumber(gavin.getStudentNumber());
+		gavin.getEnrolments().add(enrolment);
+		s.save(enrolment);
+		
+		//s.flush();
+		
+		Long count = (Long) s.createCriteria(Enrolment.class)
+			.setProjection( Projections.count("studentNumber").setDistinct() )
+			.uniqueResult();
+		assertEquals(count, new Long(2));
+		
+		count = (Long) s.createCriteria(Enrolment.class)
+			.setProjection( Projections.countDistinct("studentNumber") )
+			.uniqueResult();
+		assertEquals(count, new Long(2));
+
+		count = (Long) s.createCriteria(Enrolment.class)
+			.setProjection( Projections.countDistinct("courseCode").as( "cnt" ) )
+			.uniqueResult();
+		assertEquals(count, new Long(1));
+
+		Object object = s.createCriteria(Enrolment.class)
+			.setProjection( Projections.projectionList()
+					.add( Projections.count("studentNumber") )
+					.add( Projections.max("studentNumber") )
+					.add( Projections.min("studentNumber") )
+					.add( Projections.avg("studentNumber") )
+			)
+			.uniqueResult();
+		Object[] result = (Object[])object; 
+		
+		assertEquals(new Long(2),result[0]);
+		assertEquals(new Long(667),result[1]);
+		assertEquals(new Long(101),result[2]);
+		assertEquals( 384.0, ( (Double) result[3] ).doubleValue(), 0.01 );
+		
+		
+		List resultWithMaps = s.createCriteria(Enrolment.class)
+			.setProjection( Projections.distinct( Projections.projectionList()
+					.add( Projections.property("studentNumber"), "stNumber" )
+					.add( Projections.property("courseCode"), "cCode" ) )
+			)
+		    .add( Restrictions.gt( "studentNumber", new Long(665) ) )
+		    .add( Restrictions.lt( "studentNumber", new Long(668) ) )
+		    .addOrder( Order.asc("stNumber") )
+			.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP)
+			.list();
+		
+		assertEquals(1, resultWithMaps.size());
+		Map m1 = (Map) resultWithMaps.get(0);
+		
+		assertEquals(new Long(667), m1.get("stNumber"));
+		assertEquals(course.getCourseCode(), m1.get("cCode"));		
+
+		resultWithMaps = s.createCriteria(Enrolment.class)
+			.setProjection( Projections.property("studentNumber").as("stNumber") )
+		    .addOrder( Order.desc("stNumber") )
+			.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP)
+			.list();
+		
+		assertEquals(2, resultWithMaps.size());
+		Map m0 = (Map) resultWithMaps.get(0);
+		m1 = (Map) resultWithMaps.get(1);
+		
+		assertEquals(new Long(101), m1.get("stNumber"));
+		assertEquals(new Long(667), m0.get("stNumber"));
+
+	
+		List resultWithAliasedBean = s.createCriteria(Enrolment.class)
+			.createAlias("student", "st")
+			.createAlias("course", "co")
+			.setProjection( Projections.projectionList()
+					.add( Projections.property("st.name"), "studentName" )
+					.add( Projections.property("co.description"), "courseDescription" )
+			)
+			.addOrder( Order.desc("studentName") )
+			.setResultTransformer( Transformers.aliasToBean(StudentDTO.class) )
+			.list();
+		
+		assertEquals(2, resultWithAliasedBean.size());
+		
+		StudentDTO dto = (StudentDTO) resultWithAliasedBean.get(0);
+		assertNotNull(dto.getDescription());
+		assertNotNull(dto.getName());
+	
+		s.createCriteria(Student.class)
+			.add( Restrictions.like("name", "Gavin", MatchMode.START) )
+			.addOrder( Order.asc("name") )
+			.createCriteria("enrolments", "e")
+				.addOrder( Order.desc("year") )
+				.addOrder( Order.desc("semester") )
+			.createCriteria("course","c")
+				.addOrder( Order.asc("description") )
+				.setProjection( Projections.projectionList()
+					.add( Projections.property("this.name") )
+					.add( Projections.property("e.year") )
+					.add( Projections.property("e.semester") )
+					.add( Projections.property("c.courseCode") )
+					.add( Projections.property("c.description") )
+				)
+			.uniqueResult();
+			
+		Projection p1 = Projections.projectionList()
+			.add( Projections.count("studentNumber") )
+			.add( Projections.max("studentNumber") )
+			.add( Projections.rowCount() );
+		
+		Projection p2 = Projections.projectionList()
+			.add( Projections.min("studentNumber") )
+			.add( Projections.avg("studentNumber") )
+			.add( Projections.sqlProjection(
+					"1 as constOne, count(*) as countStar", 
+					new String[] { "constOne", "countStar" }, 
+					new Type[] { Hibernate.INTEGER, Hibernate.INTEGER }
+			) );
+	
+		Object[] array = (Object[]) s.createCriteria(Enrolment.class)
+			.setProjection( Projections.projectionList().add(p1).add(p2) )
+			.uniqueResult();
+		
+		assertEquals( array.length, 7 );
+		
+		List list = s.createCriteria(Enrolment.class)
+			.createAlias("student", "st")
+			.createAlias("course", "co")
+			.setProjection( Projections.projectionList()
+					.add( Projections.groupProperty("co.courseCode") )
+					.add( Projections.count("st.studentNumber").setDistinct() )
+					.add( Projections.groupProperty("year") )
+			)
+			.list();
+		
+		assertEquals( list.size(), 2 );
+		
+		Object g = s.createCriteria(Student.class)
+			.add( Restrictions.idEq( new Long(667) ) )
+			.setFetchMode("enrolments", FetchMode.JOIN)
+			//.setFetchMode("enrolments.course", FetchMode.JOIN) //TODO: would love to make that work...
+			.uniqueResult();
+		assertSame(g, gavin);
+
+		s.delete(gavin);
+		s.delete(xam);
+		s.delete(course);
+		
+		t.commit();
+		s.close();
+	}
+		
+	public void testProjectionsUsingProperty() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		
+		Course course = new Course();
+		course.setCourseCode("HIB");
+		course.setDescription("Hibernate Training");
+		course.getCourseMeetings().add( new CourseMeeting( course, "Monday", 1, "1313 Mockingbird Lane" ) );
+		s.save(course);
+
+		Student gavin = new Student();
+		gavin.setName("Gavin King");
+		gavin.setStudentNumber(667);
+		CityState odessaWa = new CityState( "Odessa", "WA" );
+		gavin.setCityState( odessaWa );
+		gavin.setPreferredCourse( course );
+		s.save(gavin);
+		
+		Student xam = new Student();
+		xam.setName("Max Rydahl Andersen");
+		xam.setStudentNumber(101);
+		s.save(xam);
+		
+		Enrolment enrolment = new Enrolment();
+		enrolment.setCourse(course);
+		enrolment.setCourseCode(course.getCourseCode());
+		enrolment.setSemester((short) 1);
+		enrolment.setYear((short) 1999);
+		enrolment.setStudent(xam);
+		enrolment.setStudentNumber(xam.getStudentNumber());
+		xam.getEnrolments().add(enrolment);
+		s.save(enrolment);
+		
+		enrolment = new Enrolment();
+		enrolment.setCourse(course);
+		enrolment.setCourseCode(course.getCourseCode());
+		enrolment.setSemester((short) 3);
+		enrolment.setYear((short) 1998);
+		enrolment.setStudent(gavin);
+		enrolment.setStudentNumber(gavin.getStudentNumber());
+		gavin.getEnrolments().add(enrolment);
+		s.save(enrolment);
+		
+		s.flush();
+
+		List  resultList = s.createCriteria(Enrolment.class)
+			.setProjection( Projections.projectionList()
+					.add( Property.forName( "student" ), "student" )
+					.add( Property.forName( "course" ), "course" )
+					.add( Property.forName( "semester" ), "semester" )
+					.add( Property.forName("year"), "year" )
+			)
+			.list();
+		assertEquals( 2, resultList.size() );
+		for ( Iterator it = resultList.iterator(); it.hasNext(); ) {
+			Object[] objects = ( Object[] ) it.next();
+			assertEquals( 4, objects.length );
+			assertTrue( objects[ 0 ] instanceof Student );
+			assertTrue( objects[ 1 ] instanceof Course );
+			assertTrue( objects[ 2 ] instanceof Short );
+			assertTrue( objects[ 3 ] instanceof Short );
+		}
+
+		resultList = s.createCriteria(Student.class)
+			.setProjection( Projections.projectionList()
+					.add( Projections.id().as( "studentNumber" ))
+					.add( Property.forName( "name" ), "name" )
+					.add( Property.forName( "cityState" ), "cityState" )
+					.add( Property.forName("preferredCourse"), "preferredCourse" )
+			)
+			.list();
+		assertEquals( 2, resultList.size() );
+		for ( Iterator it = resultList.iterator(); it.hasNext(); ) {
+			Object[] objects = ( Object[] ) it.next();
+			assertEquals( 4, objects.length );
+			assertTrue( objects[ 0 ] instanceof Long );
+			assertTrue( objects[ 1 ] instanceof String );
+			if ( "Gavin King".equals( objects[ 1 ] ) ) {
+				assertTrue( objects[ 2 ] instanceof CityState );
+				assertTrue( objects[ 3 ] instanceof Course );
+			}
+			else {
+				assertNull( objects[ 2 ] );
+				assertNull( objects[ 3 ] );
+			}
+		}
+
+		Object[] aResult = ( Object[] ) s.createCriteria(Student.class)
+			.add( Restrictions.idEq( new Long( 667 ) ) )
+			.setProjection( Projections.projectionList()
+					.add( Projections.id().as( "studentNumber" ))
+					.add( Property.forName( "name" ), "name" )
+					.add( Property.forName( "cityState" ), "cityState" )
+					.add( Property.forName("preferredCourse"), "preferredCourse" )
+			)
+			.uniqueResult();
+		assertNotNull( aResult );
+		assertEquals( 4, aResult.length );
+		assertTrue( aResult[ 0 ] instanceof Long );
+		assertTrue( aResult[ 1 ] instanceof String );
+		assertTrue( aResult[ 2 ] instanceof CityState );
+		assertTrue( aResult[ 3 ] instanceof Course );
+
+		Long count = (Long) s.createCriteria(Enrolment.class)
+			.setProjection( Property.forName("studentNumber").count().setDistinct() )
+			.uniqueResult();
+		assertEquals(count, new Long(2));
+		
+		Object object = s.createCriteria(Enrolment.class)
+			.setProjection( Projections.projectionList()
+					.add( Property.forName("studentNumber").count() )
+					.add( Property.forName("studentNumber").max() )
+					.add( Property.forName("studentNumber").min() )
+					.add( Property.forName("studentNumber").avg() )
+			)
+			.uniqueResult();
+		Object[] result = (Object[])object; 
+		
+		assertEquals(new Long(2),result[0]);
+		assertEquals(new Long(667),result[1]);
+		assertEquals(new Long(101),result[2]);
+		assertEquals(384.0, ( (Double) result[3] ).doubleValue(), 0.01);
+		
+		
+		s.createCriteria(Enrolment.class)
+		    .add( Property.forName("studentNumber").gt( new Long(665) ) )
+		    .add( Property.forName("studentNumber").lt( new Long(668) ) )
+		    .add( Property.forName("courseCode").like("HIB", MatchMode.START) )
+		    .add( Property.forName("year").eq( new Short( (short) 1999 ) ) )
+		    .addOrder( Property.forName("studentNumber").asc() )
+			.uniqueResult();
+	
+		List resultWithMaps = s.createCriteria(Enrolment.class)
+			.setProjection( Projections.projectionList()
+					.add( Property.forName("studentNumber").as("stNumber") )
+					.add( Property.forName("courseCode").as("cCode") )
+			)
+		    .add( Property.forName("studentNumber").gt( new Long(665) ) )
+		    .add( Property.forName("studentNumber").lt( new Long(668) ) )
+		    .addOrder( Property.forName("studentNumber").asc() )
+			.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP)
+			.list();
+		
+		assertEquals(1, resultWithMaps.size());
+		Map m1 = (Map) resultWithMaps.get(0);
+		
+		assertEquals(new Long(667), m1.get("stNumber"));
+		assertEquals(course.getCourseCode(), m1.get("cCode"));		
+
+		resultWithMaps = s.createCriteria(Enrolment.class)
+			.setProjection( Property.forName("studentNumber").as("stNumber") )
+		    .addOrder( Order.desc("stNumber") )
+			.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP)
+			.list();
+		
+		assertEquals(2, resultWithMaps.size());
+		Map m0 = (Map) resultWithMaps.get(0);
+		m1 = (Map) resultWithMaps.get(1);
+		
+		assertEquals(new Long(101), m1.get("stNumber"));
+		assertEquals(new Long(667), m0.get("stNumber"));
+
+	
+		List resultWithAliasedBean = s.createCriteria(Enrolment.class)
+			.createAlias("student", "st")
+			.createAlias("course", "co")
+			.setProjection( Projections.projectionList()
+					.add( Property.forName("st.name").as("studentName") )
+					.add( Property.forName("co.description").as("courseDescription") )
+			)
+			.addOrder( Order.desc("studentName") )
+			.setResultTransformer( Transformers.aliasToBean(StudentDTO.class) )
+			.list();
+		
+		assertEquals(2, resultWithAliasedBean.size());
+		
+		StudentDTO dto = (StudentDTO) resultWithAliasedBean.get(0);
+		assertNotNull(dto.getDescription());
+		assertNotNull(dto.getName());
+
+		CourseMeeting courseMeetingDto = ( CourseMeeting ) s.createCriteria(CourseMeeting.class)
+			.setProjection( Projections.projectionList()
+					.add( Property.forName("id").as("id") )
+					.add( Property.forName("course").as("course") )
+			)
+			.addOrder( Order.desc("id") )
+			.setResultTransformer( Transformers.aliasToBean(CourseMeeting.class) )
+			.uniqueResult();
+
+		assertNotNull( courseMeetingDto.getId() );
+		assertEquals( course.getCourseCode(), courseMeetingDto.getId().getCourseCode() );
+		assertEquals( "Monday", courseMeetingDto.getId().getDay() );
+		assertEquals( "1313 Mockingbird Lane", courseMeetingDto.getId().getLocation() );
+		assertEquals( 1, courseMeetingDto.getId().getPeriod() );
+		assertEquals( course.getDescription(), courseMeetingDto.getCourse().getDescription() );
+
+		s.createCriteria(Student.class)
+			.add( Restrictions.like("name", "Gavin", MatchMode.START) )
+			.addOrder( Order.asc("name") )
+			.createCriteria("enrolments", "e")
+				.addOrder( Order.desc("year") )
+				.addOrder( Order.desc("semester") )
+			.createCriteria("course","c")
+				.addOrder( Order.asc("description") )
+				.setProjection( Projections.projectionList()
+					.add( Property.forName("this.name") )
+					.add( Property.forName("e.year") )
+					.add( Property.forName("e.semester") )
+					.add( Property.forName("c.courseCode") )
+					.add( Property.forName("c.description") )
+				)
+			.uniqueResult();
+			
+		Projection p1 = Projections.projectionList()
+			.add( Property.forName("studentNumber").count() )
+			.add( Property.forName("studentNumber").max() )
+			.add( Projections.rowCount() );
+		
+		Projection p2 = Projections.projectionList()
+			.add( Property.forName("studentNumber").min() )
+			.add( Property.forName("studentNumber").avg() )
+			.add( Projections.sqlProjection(
+					"1 as constOne, count(*) as countStar", 
+					new String[] { "constOne", "countStar" }, 
+					new Type[] { Hibernate.INTEGER, Hibernate.INTEGER }
+			) );
+	
+		Object[] array = (Object[]) s.createCriteria(Enrolment.class)
+			.setProjection( Projections.projectionList().add(p1).add(p2) )
+			.uniqueResult();
+		
+		assertEquals( array.length, 7 );
+		
+		List list = s.createCriteria(Enrolment.class)
+			.createAlias("student", "st")
+			.createAlias("course", "co")
+			.setProjection( Projections.projectionList()
+					.add( Property.forName("co.courseCode").group() )
+					.add( Property.forName("st.studentNumber").count().setDistinct() )
+					.add( Property.forName("year").group() )
+			)
+			.list();
+		
+		assertEquals( list.size(), 2 );
+		
+		s.delete(gavin);
+		s.delete(xam);
+		s.delete(course);
+		
+		t.commit();
+		s.close();
+	}
+
+	public void testDistinctProjectionsOfComponents() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Course course = new Course();
+		course.setCourseCode("HIB");
+		course.setDescription("Hibernate Training");
+		s.save(course);
+
+		Student gavin = new Student();
+		gavin.setName("Gavin King");
+		gavin.setStudentNumber(667);
+		gavin.setCityState( new CityState( "Odessa", "WA" ) );
+		s.save(gavin);
+
+		Student xam = new Student();
+		xam.setName("Max Rydahl Andersen");
+		xam.setStudentNumber(101);
+		xam.setPreferredCourse( course );
+		xam.setCityState( new CityState( "Odessa", "WA" ) );
+		s.save(xam);
+
+		Enrolment enrolment = new Enrolment();
+		enrolment.setCourse(course);
+		enrolment.setCourseCode(course.getCourseCode());
+		enrolment.setSemester((short) 1);
+		enrolment.setYear((short) 1999);
+		enrolment.setStudent(xam);
+		enrolment.setStudentNumber(xam.getStudentNumber());
+		xam.getEnrolments().add(enrolment);
+		s.save(enrolment);
+
+		enrolment = new Enrolment();
+		enrolment.setCourse(course);
+		enrolment.setCourseCode(course.getCourseCode());
+		enrolment.setSemester((short) 3);
+		enrolment.setYear((short) 1998);
+		enrolment.setStudent(gavin);
+		enrolment.setStudentNumber(gavin.getStudentNumber());
+		gavin.getEnrolments().add(enrolment);
+		s.save(enrolment);
+
+		s.flush();
+
+		Object result = s.createCriteria( Student.class )
+			.setProjection( Projections.distinct( Property.forName( "cityState" ) ) )
+			.uniqueResult();
+		assertTrue( result instanceof CityState );
+		assertEquals( ( ( CityState ) result ).getCity(), "Odessa" );
+		assertEquals( ( ( CityState ) result ).getState(), "WA" );		
+
+		result = s.createCriteria( Student.class )
+			.setProjection( Projections.distinct( Property.forName( "cityState" ).as( "cityState" ) ) )
+				.addOrder( Order.asc( "cityState" ) )
+			.uniqueResult();
+		assertTrue( result instanceof CityState );
+		assertEquals( ( ( CityState ) result ).getCity(), "Odessa" );
+		assertEquals( ( ( CityState ) result ).getState(), "WA" );
+
+		result = s.createCriteria( Student.class )
+			.setProjection( Projections.count( "cityState.city" ) )
+			.uniqueResult();
+		assertEquals( 2, ( ( Long ) result ).longValue() );
+
+		result = s.createCriteria( Student.class )
+			.setProjection( Projections.countDistinct( "cityState.city" ) )
+			.uniqueResult();
+		assertEquals( 1, ( ( Long ) result ).longValue() );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		try {
+			result = s.createCriteria( Student.class )
+				.setProjection( Projections.count( "cityState" ) )
+				.uniqueResult();
+			if ( ! getDialect().supportsTupleCounts() ) {
+				fail( "expected SQLGrammarException" );
+			}
+			assertEquals( 1, ( ( Long ) result ).longValue() );
+		}
+		catch ( SQLGrammarException ex ) {
+			if ( ! getDialect().supportsTupleCounts() ) {
+				// expected
+			}
+			else {
+				throw ex;
+			}
+		}
+		finally {
+			t.rollback();
+			s.close();
+		}
+
+		s = openSession();
+		t = s.beginTransaction();
+		try {
+			result = s.createCriteria( Student.class )
+					.setProjection( Projections.countDistinct( "cityState" ) )
+					.uniqueResult();
+			if ( ! getDialect().supportsTupleDistinctCounts() ) {
+				fail( "expected SQLGrammarException" );
+			}
+			assertEquals( 1, ( ( Long ) result ).longValue() );
+		}
+		catch ( SQLGrammarException ex ) {
+			if ( ! getDialect().supportsTupleDistinctCounts() ) {
+				// expected
+			}
+			else {
+				throw ex;
+			}
+		}
+		finally {
+			t.rollback();
+			s.close();
+		}
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete(gavin);
+		s.delete(xam);
+		s.delete(course);
+
+		t.commit();
+		s.close();
+	}
+
+	public void testGroupByComponent() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Course course = new Course();
+		course.setCourseCode("HIB");
+		course.setDescription("Hibernate Training");
+		s.save(course);
+
+		Student gavin = new Student();
+		gavin.setName("Gavin King");
+		gavin.setStudentNumber(667);
+		gavin.setCityState( new CityState( "Odessa", "WA" ) );
+		s.save(gavin);
+
+		Student xam = new Student();
+		xam.setName("Max Rydahl Andersen");
+		xam.setStudentNumber(101);
+		xam.setPreferredCourse( course );
+		xam.setCityState( new CityState( "Odessa", "WA" ) );
+		s.save(xam);
+
+		Enrolment enrolment = new Enrolment();
+		enrolment.setCourse(course);
+		enrolment.setCourseCode(course.getCourseCode());
+		enrolment.setSemester((short) 1);
+		enrolment.setYear((short) 1999);
+		enrolment.setStudent(xam);
+		enrolment.setStudentNumber(xam.getStudentNumber());
+		xam.getEnrolments().add(enrolment);
+		s.save(enrolment);
+
+		enrolment = new Enrolment();
+		enrolment.setCourse(course);
+		enrolment.setCourseCode(course.getCourseCode());
+		enrolment.setSemester((short) 3);
+		enrolment.setYear((short) 1998);
+		enrolment.setStudent(gavin);
+		enrolment.setStudentNumber(gavin.getStudentNumber());
+		gavin.getEnrolments().add(enrolment);
+		s.save(enrolment);
+
+		s.flush();
+
+		Object result = s.createCriteria( Student.class )
+			.setProjection( Projections.groupProperty( "cityState" ) )
+			.uniqueResult();
+		assertTrue( result instanceof CityState );
+		assertEquals( ( ( CityState ) result ).getCity(), "Odessa" );
+		assertEquals( ( ( CityState ) result ).getState(), "WA" );
+
+		result = s.createCriteria( Student.class, "st")
+			.setProjection( Projections.groupProperty( "st.cityState" ) )
+			.uniqueResult();
+		assertTrue( result instanceof CityState );
+		assertEquals( ( ( CityState ) result ).getCity(), "Odessa" );
+		assertEquals( ( ( CityState ) result ).getState(), "WA" );
+
+		result = s.createCriteria( Student.class, "st")
+			.setProjection( Projections.groupProperty( "st.cityState" ) )
+				.addOrder( Order.asc( "cityState" ) )
+			.uniqueResult();
+		assertTrue( result instanceof CityState );
+		assertEquals( ( ( CityState ) result ).getCity(), "Odessa" );
+		assertEquals( ( ( CityState ) result ).getState(), "WA" );
+
+		result = s.createCriteria( Student.class, "st")
+			.setProjection( Projections.groupProperty( "st.cityState" ).as( "cityState" ) )
+				.addOrder( Order.asc( "cityState" ) )
+			.uniqueResult();
+		assertTrue( result instanceof CityState );
+		assertEquals( ( ( CityState ) result ).getCity(), "Odessa" );
+		assertEquals( ( ( CityState ) result ).getState(), "WA" );
+
+		result = s.createCriteria( Student.class, "st")
+			.setProjection( Projections.groupProperty( "st.cityState" ).as( "cityState" ) )
+				.addOrder( Order.asc( "cityState" ) )
+			.uniqueResult();
+		assertTrue( result instanceof CityState );
+		assertEquals( ( ( CityState ) result ).getCity(), "Odessa" );
+		assertEquals( ( ( CityState ) result ).getState(), "WA" );
+
+		result = s.createCriteria( Student.class, "st")
+			.setProjection( Projections.groupProperty( "st.cityState" ).as( "cityState" ) )
+			.add( Restrictions.eq( "st.cityState", new CityState( "Odessa", "WA" ) ) )
+			.addOrder( Order.asc( "cityState" ) )
+			.uniqueResult();
+		assertTrue( result instanceof CityState );
+		assertEquals( ( ( CityState ) result ).getCity(), "Odessa" );
+		assertEquals( ( ( CityState ) result ).getState(), "WA" );
+
+		List list = s.createCriteria(Enrolment.class)
+			.createAlias("student", "st")
+			.createAlias("course", "co")
+			.setProjection( Projections.projectionList()
+					.add( Property.forName("co.courseCode").group() )
+					.add( Property.forName("st.cityState").group() )
+					.add( Property.forName("year").group() )
+			)
+			.list();
+
+
+		s.delete(gavin);
+		s.delete(xam);
+		s.delete(course);
+
+		t.commit();
+		s.close();
+	}
+
+	public void testRestrictionOnSubclassCollection() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		s.createCriteria( Reptile.class )
+				.add( Restrictions.isEmpty( "offspring" ) )
+				.list();
+
+		s.createCriteria( Reptile.class )
+				.add( Restrictions.isNotEmpty( "offspring" ) )
+				.list();
+
+		t.rollback();
+		s.close();
+	}
+
+	public void testClassProperty() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		// HQL: from Animal a where a.mother.class = Reptile
+		Criteria c = s.createCriteria(Animal.class,"a")
+			.createAlias("mother","m")
+			.add( Property.forName("m.class").eq(Reptile.class) );
+		c.list();
+		t.rollback();
+		s.close();
+	}
+
+	public void testClassProperty2() {
+		Session session = openSession();
+		Transaction t = session.beginTransaction();
+		GreatFoo foo = new GreatFoo();
+		Bar b = new Bar();
+		b.setMyFoo(foo);
+		foo.setId(1);
+		b.setId(1);
+		session.persist(b);
+		session.flush();
+		t.commit();
+		session=openSession();
+		t=session.beginTransaction();
+		// OK, one BAR in DB
+		assertEquals(1, session.createCriteria(Bar.class).list().size());
+		Criteria crit = session.createCriteria(Bar.class, "b").createAlias(
+				"myFoo", "m").add(
+				Property.forName("m.class").eq(GreatFoo.class));
+		assertEquals(1, crit.list().size());
+		crit = session.createCriteria(Bar.class, "b").createAlias("myFoo", "m")
+				.add(Restrictions.eq("m.class", GreatFoo.class));
+		assertEquals(1, crit.list().size());
+		t.commit();
+		session.close();
+	}
+	
+	public void testProjectedId() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.createCriteria(Course.class).setProjection( Projections.property("courseCode") ).list();
+		s.createCriteria(Course.class).setProjection( Projections.id() ).list();
+		t.rollback();
+		s.close();
+	}
+
+	public void testProjectedEmbeddedCompositeId() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Course course = new Course();
+		course.setCourseCode("HIB");
+		course.setDescription("Hibernate Training");
+		s.save(course);
+
+		Student gavin = new Student();
+		gavin.setName("Gavin King");
+		gavin.setStudentNumber(667);
+		s.save(gavin);
+
+		Student xam = new Student();
+		xam.setName("Max Rydahl Andersen");
+		xam.setStudentNumber(101);
+		s.save(xam);
+
+		Enrolment enrolment = new Enrolment();
+		enrolment.setCourse(course);
+		enrolment.setCourseCode(course.getCourseCode());
+		enrolment.setSemester((short) 1);
+		enrolment.setYear((short) 1999);
+		enrolment.setStudent(xam);
+		enrolment.setStudentNumber(xam.getStudentNumber());
+		xam.getEnrolments().add(enrolment);
+		s.save(enrolment);
+
+		enrolment = new Enrolment();
+		enrolment.setCourse(course);
+		enrolment.setCourseCode(course.getCourseCode());
+		enrolment.setSemester((short) 3);
+		enrolment.setYear((short) 1998);
+		enrolment.setStudent(gavin);
+		enrolment.setStudentNumber(gavin.getStudentNumber());
+		gavin.getEnrolments().add(enrolment);
+		s.save(enrolment);
+
+		s.flush();
+
+		List enrolments = ( List ) s.createCriteria( Enrolment.class).setProjection( Projections.id() ).list();
+		t.rollback();
+		s.close();
+	}
+
+	public void testProjectedCompositeId() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Course course = new Course();
+		course.setCourseCode("HIB");
+		course.setDescription("Hibernate Training");
+		course.getCourseMeetings().add( new CourseMeeting( course, "Monday", 1, "1313 Mockingbird Lane" ) );
+		s.save(course);
+		s.flush();
+		s.clear();
+		List data = ( List ) s.createCriteria( CourseMeeting.class).setProjection( Projections.id() ).list();
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		try {
+			s.createCriteria( CourseMeeting.class).setProjection( Projections.count( "id" ) ).list();
+			fail( "should have thrown SQLGrammarException" );
+		}
+		catch ( SQLGrammarException ex ) {
+			// expected
+		}
+		finally {
+			t.rollback();
+			s.close();
+		}
+
+		s = openSession();
+		t = s.beginTransaction();
+		try {
+			s.createCriteria( CourseMeeting.class).setProjection( Projections.countDistinct( "id" ) ).list();
+			if ( ! getDialect().supportsTupleDistinctCounts() ) {
+				fail( "expected SQLGrammarException" );
+			}
+		}
+		catch ( SQLGrammarException ex ) {
+			if ( ! getDialect().supportsTupleDistinctCounts() ) {
+				// expected
+			}
+			else {
+				throw ex;
+			}
+		}
+		finally {
+			t.rollback();
+			s.close();
+		}
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete( course );
+		t.commit();
+		s.close();
+	}
+
+	public void testProjectedCompositeIdWithAlias() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Course course = new Course();
+		course.setCourseCode("HIB");
+		course.setDescription("Hibernate Training");
+		course.getCourseMeetings().add( new CourseMeeting( course, "Monday", 1, "1313 Mockingbird Lane" ) );
+		s.save(course);
+		s.flush();
+
+		List data = ( List ) s.createCriteria( CourseMeeting.class).setProjection( Projections.id().as( "id" ) ).list();
+		t.rollback();
+		s.close();
+	}
+
+	public void testProjectedComponent() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Student gaith = new Student();
+		gaith.setName("Gaith Bell");
+		gaith.setStudentNumber(123);
+		gaith.setCityState( new CityState( "Chicago", "Illinois" ) );
+		s.save( gaith );
+		s.flush();
+
+		List cityStates = ( List ) s.createCriteria( Student.class).setProjection( Projections.property( "cityState" )).list();
+		t.rollback();
+		s.close();
+	}
+
+	public void testProjectedListIncludesComponent() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Student gaith = new Student();
+		gaith.setName("Gaith Bell");
+		gaith.setStudentNumber(123);
+		gaith.setCityState( new CityState( "Chicago", "Illinois" ) );
+		s.save(gaith);
+		s.flush();
+		List data = ( List ) s.createCriteria( Student.class)
+				.setProjection( Projections.projectionList()
+					.add( Projections.property( "cityState" ) )
+					.add( Projections.property("name") ) )
+				.list();
+		t.rollback();
+		s.close();
+	}
+
+	public void testProjectedListIncludesEmbeddedCompositeId() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Course course = new Course();
+		course.setCourseCode("HIB");
+		course.setDescription("Hibernate Training");
+		s.save(course);
+
+		Student gavin = new Student();
+		gavin.setName("Gavin King");
+		gavin.setStudentNumber(667);
+		s.save(gavin);
+
+		Student xam = new Student();
+		xam.setName("Max Rydahl Andersen");
+		xam.setStudentNumber(101);
+		s.save(xam);
+
+		Enrolment enrolment = new Enrolment();
+		enrolment.setCourse(course);
+		enrolment.setCourseCode(course.getCourseCode());
+		enrolment.setSemester((short) 1);
+		enrolment.setYear((short) 1999);
+		enrolment.setStudent(xam);
+		enrolment.setStudentNumber(xam.getStudentNumber());
+		xam.getEnrolments().add(enrolment);
+		s.save(enrolment);
+
+		enrolment = new Enrolment();
+		enrolment.setCourse(course);
+		enrolment.setCourseCode(course.getCourseCode());
+		enrolment.setSemester((short) 3);
+		enrolment.setYear((short) 1998);
+		enrolment.setStudent(gavin);
+		enrolment.setStudentNumber(gavin.getStudentNumber());
+		gavin.getEnrolments().add(enrolment);
+		s.save(enrolment);
+		s.flush();
+		List data = ( List ) s.createCriteria( Enrolment.class)
+				.setProjection( Projections.projectionList()
+					.add( Projections.property( "semester" ) )
+					.add( Projections.property("year") )
+					.add( Projections.id() ) )
+				.list();
+		t.rollback();
+		s.close();
+	}
+
+	public void testSubcriteriaJoinTypes() {
+		Session session = openSession();
+		Transaction t = session.beginTransaction();
+
+		Course courseA = new Course();
+		courseA.setCourseCode("HIB-A");
+		courseA.setDescription("Hibernate Training A");
+		session.persist(courseA);
+
+		Course courseB = new Course();
+		courseB.setCourseCode("HIB-B");
+		courseB.setDescription("Hibernate Training B");
+		session.persist(courseB);
+
+		Student gavin = new Student();
+		gavin.setName("Gavin King");
+		gavin.setStudentNumber(232);
+		gavin.setPreferredCourse(courseA);
+		session.persist(gavin);
+
+		Student leonardo = new Student();
+		leonardo.setName("Leonardo Quijano");
+		leonardo.setStudentNumber(233);
+		leonardo.setPreferredCourse(courseB);
+		session.persist(leonardo);
+
+		Student johnDoe = new Student();
+		johnDoe.setName("John Doe");
+		johnDoe.setStudentNumber(235);
+		johnDoe.setPreferredCourse(null);
+		session.persist(johnDoe);
+
+		List result = session.createCriteria( Student.class )
+				.setProjection( Property.forName("preferredCourse.courseCode") )
+				.createCriteria( "preferredCourse", Criteria.LEFT_JOIN )
+						.addOrder( Order.asc( "courseCode" ) )
+						.list();
+		assertEquals( 3, result.size() );
+		// can't be sure of NULL comparison ordering aside from they should
+		// either come first or last
+		if ( result.get( 0 ) == null ) {
+			assertEquals( "HIB-A", result.get(1) );
+			assertEquals( "HIB-B", result.get(2) );
+		}
+		else {
+			assertNull( result.get(2) );
+			assertEquals( "HIB-A", result.get(0) );
+			assertEquals( "HIB-B", result.get(1) );
+		}
+
+		result = session.createCriteria( Student.class )
+				.setFetchMode( "preferredCourse", FetchMode.JOIN )
+				.createCriteria( "preferredCourse", Criteria.LEFT_JOIN )
+						.addOrder( Order.asc( "courseCode" ) )
+						.list();
+		assertEquals( 3, result.size() );
+		assertNotNull( result.get(0) );
+		assertNotNull( result.get(1) );
+		assertNotNull( result.get(2) );
+
+		result = session.createCriteria( Student.class )
+				.setFetchMode( "preferredCourse", FetchMode.JOIN )
+				.createAlias( "preferredCourse", "pc", Criteria.LEFT_JOIN )
+				.addOrder( Order.asc( "pc.courseCode" ) )
+				.list();
+		assertEquals( 3, result.size() );
+		assertNotNull( result.get(0) );
+		assertNotNull( result.get(1) );
+		assertNotNull( result.get(2) );
+
+		session.delete(gavin);
+		session.delete(leonardo);
+		session.delete(johnDoe);
+		session.delete(courseA);
+		session.delete(courseB);
+		t.commit();
+		session.close();
+	}
+	
+	public void testAliasJoinCriterion() {
+		Session session = openSession();
+		Transaction t = session.beginTransaction();
+
+		Course courseA = new Course();
+		courseA.setCourseCode("HIB-A");
+		courseA.setDescription("Hibernate Training A");
+		session.persist(courseA);
+
+		Course courseB = new Course();
+		courseB.setCourseCode("HIB-B");
+		courseB.setDescription("Hibernate Training B");
+		session.persist(courseB);
+
+		Student gavin = new Student();
+		gavin.setName("Gavin King");
+		gavin.setStudentNumber(232);
+		gavin.setPreferredCourse(courseA);
+		session.persist(gavin);
+
+		Student leonardo = new Student();
+		leonardo.setName("Leonardo Quijano");
+		leonardo.setStudentNumber(233);
+		leonardo.setPreferredCourse(courseB);
+		session.persist(leonardo);
+
+		Student johnDoe = new Student();
+		johnDoe.setName("John Doe");
+		johnDoe.setStudentNumber(235);
+		johnDoe.setPreferredCourse(null);
+		session.persist(johnDoe);
+
+		// test == on one value exists
+		List result = session.createCriteria( Student.class )
+			.createAlias( "preferredCourse", "pc", Criteria.LEFT_JOIN, Restrictions.eq("pc.courseCode", "HIB-A") )
+			.setProjection( Property.forName("pc.courseCode") )
+			.addOrder(Order.asc("pc.courseCode"))
+			.list();
+		
+		assertEquals( 3, result.size() );
+		
+		// can't be sure of NULL comparison ordering aside from they should
+		// either come first or last
+		if ( result.get( 0 ) == null ) {
+			assertNull(result.get(1));
+			assertEquals( "HIB-A", result.get(2) );
+		}
+		else {
+			assertNull( result.get(2) );
+			assertNull( result.get(1) );
+			assertEquals( "HIB-A", result.get(0) );
+		}
+		
+		// test == on non existent value
+		result = session.createCriteria( Student.class )
+		.createAlias( "preferredCourse", "pc", Criteria.LEFT_JOIN, Restrictions.eq("pc.courseCode", "HIB-R") )
+		.setProjection( Property.forName("pc.courseCode") )
+		.addOrder(Order.asc("pc.courseCode"))
+		.list();
+	
+		assertEquals( 3, result.size() );
+		assertNull( result.get(2) );
+		assertNull( result.get(1) );
+		assertNull(result.get(0) );
+		
+		// test != on one existing value
+		result = session.createCriteria( Student.class )
+		.createAlias( "preferredCourse", "pc", Criteria.LEFT_JOIN, Restrictions.ne("pc.courseCode", "HIB-A") )
+		.setProjection( Property.forName("pc.courseCode") )
+		.addOrder(Order.asc("pc.courseCode"))
+		.list();
+	
+		assertEquals( 3, result.size() );
+		// can't be sure of NULL comparison ordering aside from they should
+		// either come first or last
+		if ( result.get( 0 ) == null ) {
+			assertNull( result.get(1) );
+			assertEquals( "HIB-B", result.get(2) );
+		}
+		else {
+			assertEquals( "HIB-B", result.get(0) );
+			assertNull( result.get(1) );
+			assertNull( result.get(2) );
+		}
+
+		session.delete(gavin);
+		session.delete(leonardo);
+		session.delete(johnDoe);
+		session.delete(courseA);
+		session.delete(courseB);
+		t.commit();
+		session.close();
+	}
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/CriteriaQueryTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/Enrolment.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/Enrolment.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/Enrolment.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,65 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.criteria">
+	
+	<class name="Course">
+		<id name="courseCode">
+			<generator class="assigned"/>
+		</id>
+		<property name="description"/>
+        <set name="courseMeetings" inverse="true" cascade="all-delete-orphan">
+            <key column="courseCode"/>
+            <one-to-many class="CourseMeeting"/>
+        </set>
+	</class>
+
+    <class name="CourseMeeting">
+        <composite-id name="id" class="CourseMeetingId">
+            <key-property name="courseCode"/>
+            <key-property name="day"/>
+            <key-property name="period"/>
+            <key-property name="location"/>
+        </composite-id>
+        <many-to-one name="course" insert="false" update="false">
+            <column name="courseCode"/>
+        </many-to-one>
+    </class>
+
+	<class name="Student">
+		<id name="studentNumber">
+		    <column name="studentId"/>
+			<generator class="assigned"/>
+		</id>
+		<property name="name" not-null="true"/>
+        <component name="cityState">
+		    <property name="city" column="address_city"/>
+            <property name="state" column="address_state"/>
+        </component>
+		<set name="enrolments" inverse="true" cascade="delete">
+			<key column="studentId"/>
+			<one-to-many class="Enrolment"/>
+		</set>
+        <many-to-one name="preferredCourse" column="preferredCourseCode"/>
+	</class>
+
+	<class name="Enrolment">
+		<composite-id>
+			<key-property name="studentNumber">
+				<column name="studentId"/>
+			</key-property>
+			<key-property name="courseCode"/>
+		</composite-id>
+		<many-to-one name="student" insert="false" update="false">
+			<column name="studentId"/>
+		</many-to-one>
+		<many-to-one name="course" insert="false" update="false">
+			<column name="courseCode"/>
+		</many-to-one>
+		<property name="semester" not-null="true"/>
+		<property name="year" column="`year`" not-null="true"/>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/Enrolment.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/Enrolment.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/Enrolment.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/Enrolment.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,63 @@
+//$Id: Enrolment.java 6970 2005-05-31 20:24:41Z oneovthafew $
+package org.hibernate.test.criteria;
+
+import java.io.Serializable;
+
+/**
+ * @author Gavin King
+ */
+public class Enrolment implements Serializable {
+	private Student student;
+	private Course course;
+	private long studentNumber;
+	private String courseCode;
+	private short year;
+	private short semester;
+	public String getCourseCode() {
+		return courseCode;
+	}
+	public void setCourseCode(String courseId) {
+		this.courseCode = courseId;
+	}
+	public long getStudentNumber() {
+		return studentNumber;
+	}
+	public void setStudentNumber(long studentId) {
+		this.studentNumber = studentId;
+	}
+	public Course getCourse() {
+		return course;
+	}
+	public void setCourse(Course course) {
+		this.course = course;
+	}
+	public Student getStudent() {
+		return student;
+	}
+	public void setStudent(Student student) {
+		this.student = student;
+	}
+	public short getSemester() {
+		return semester;
+	}
+	public void setSemester(short semester) {
+		this.semester = semester;
+	}
+	public short getYear() {
+		return year;
+	}
+	public void setYear(short year) {
+		this.year = year;
+	}
+	
+	public boolean equals(Object other) {
+		if ( !(other instanceof Enrolment) ) return false;
+		Enrolment that = (Enrolment) other;
+		return studentNumber==that.studentNumber &&
+			courseCode.equals(that.courseCode);
+	}
+	
+	public int hashCode() {
+		return courseCode.hashCode();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/Enrolment.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/Foo.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/Foo.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/Foo.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.criteria">
+
+	<class name="AbstractFoo">
+		<id name="id">
+		</id>
+		<discriminator type="string" column="subtype" />
+		<subclass name="GreatFoo" discriminator-value="KAPUT">
+		</subclass>
+	</class>
+
+	<class name="Bar">
+		<id name="id">
+		</id>
+
+		<one-to-one name="myFoo" cascade="all" />
+	</class>
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/Foo.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/GreatFoo.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/GreatFoo.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/GreatFoo.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,29 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.criteria;
+
+public class GreatFoo extends AbstractFoo {
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/GreatFoo.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/LikeTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/LikeTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/LikeTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,92 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.criteria;
+
+import java.util.List;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.dialect.MySQLDialect;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+
+
+public class LikeTest extends FunctionalTestCase {
+
+    public LikeTest( String string ) {
+        super( string );
+    }
+
+    public String[] getMappings() {
+        return new String[]{"criteria/TestObject.hbm.xml"};
+    }
+    public void testLike(){
+        Session session = openSession();
+        Transaction tx = session.beginTransaction();
+        TestObject obj = new TestObject();
+        String uniq = "uniq" + System.currentTimeMillis();
+        obj.setText( "XyZ " + uniq + " blablabla" );
+        session.save( obj );
+        session.flush();
+        tx.commit();
+        session.close();
+        String pattern = "XyZ " + uniq + "%";
+        // retrieve object - case sensitive - works ok
+        session = openSession();
+        tx = session.beginTransaction();
+        List objects = session.createCriteria( TestObject.class ).add(
+                Restrictions.like( "text", pattern ) ).list();
+        assertEquals( 1, objects.size() );
+        session.clear();
+
+        // retrieve object - case insensitive - works ok
+        objects = session.createCriteria( TestObject.class ).add(
+                Restrictions.like( "text", pattern ).ignoreCase() ).list();
+
+        assertEquals( 1, objects.size() );
+        session.clear();
+        if ( !( getDialect() instanceof MySQLDialect ) ) {
+            // retrieve object - case insensitive via custom expression - works
+            // ok
+            objects = session.createCriteria( TestObject.class ).add(
+                    StringExpression.stringExpression( "text", pattern, true ) )
+                    .list();
+
+            assertEquals( 1, objects.size() );
+            session.clear();
+
+            // retrieve object - case sensitive via custom expression - not
+            // working
+            objects = session.createCriteria( TestObject.class )
+                    .add(
+                            StringExpression.stringExpression( "text", pattern,
+                                    false ) ).list();
+            assertEquals( 1, objects.size() );
+        }
+        tx.rollback();
+        session.close();
+        
+    }
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/LikeTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/LongInElementsTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/LongInElementsTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/LongInElementsTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,129 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.criteria;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.hibernate.Criteria;
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.dialect.Oracle8iDialect;
+import org.hibernate.dialect.SQLServerDialect;
+import org.hibernate.dialect.TeradataDialect;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.test.hql.StateProvince;
+
+/**
+ * 
+ * HHH-2166 Long "in" lists in queries results in a Java stack overflow
+ * exception. to reproduce this issue, you should add
+ * "<argLine>-Xss128k</argLine>" to the surefire plugin (test on Fedora 12)
+ * 
+ * @author Strong Liu
+ */
+public class LongInElementsTest extends FunctionalTestCase {
+
+	private static final int ELEMENTS_SIZE = 4000;
+
+	public LongInElementsTest( String string ) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "criteria/Animal.hbm.xml" };
+	}
+
+	// HHH-2166
+	public void testLongInElementsByHQL() {
+		if ( (getDialect() instanceof SQLServerDialect)
+				|| (getDialect() instanceof Oracle8iDialect) 
+				|| (getDialect() instanceof TeradataDialect)){
+			skipExpectedFailure( new Exception("this test fails on oracle and ms sql server, for more info, see HHH-1123") );
+			return;
+		}
+		Session session = openSession();
+		Transaction t = session.beginTransaction();
+
+		StateProvince beijing = new StateProvince();
+		beijing.setIsoCode( "100089" );
+		beijing.setName( "beijing" );
+		session.persist( beijing );
+		session.flush();
+		session.clear();
+
+		Query query = session
+				.createQuery( "from org.hibernate.test.hql.StateProvince sp where sp.id in ( :idList )" );
+		query.setParameterList( "idList" , createLotsOfElements() );
+		List list = query.list();
+		session.flush();
+		session.clear();
+		assertEquals( 1 , list.size() );
+		session.delete( beijing );
+		t.commit();
+		session.close();
+
+	}
+
+	// HHH-2166
+	public void testLongInElementsByCriteria() {
+		if ( (getDialect() instanceof SQLServerDialect)
+				|| (getDialect() instanceof Oracle8iDialect) 
+				|| (getDialect() instanceof TeradataDialect)){
+			skipExpectedFailure( new Exception("this test fails on oracle and ms sql server, for more info, see HHH-1123") );
+			return;
+		}
+		Session session = openSession();
+		Transaction t = session.beginTransaction();
+
+		StateProvince beijing = new StateProvince();
+		beijing.setIsoCode( "100089" );
+		beijing.setName( "beijing" );
+		session.persist( beijing );
+		session.flush();
+		session.clear();
+
+		Criteria criteria = session.createCriteria( StateProvince.class );
+		criteria.add( Restrictions.in( "id" , createLotsOfElements() ) );
+		List list = criteria.list();
+		session.flush();
+		session.clear();
+		assertEquals( 1 , list.size() );
+		session.delete( beijing );
+		t.commit();
+		session.close();
+
+	}
+
+	private List createLotsOfElements() {
+		List list = new ArrayList();
+		for ( int i = 0; i < ELEMENTS_SIZE; i++ ) {
+			list.add( Long.valueOf( i ) );
+		}
+		return list;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/LongInElementsTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/StringExpression.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/StringExpression.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/StringExpression.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,18 @@
+package org.hibernate.test.criteria;
+
+import org.hibernate.criterion.Criterion;
+import org.hibernate.criterion.LikeExpression;
+
+public class StringExpression extends LikeExpression {
+    private final static Character ESCAPE_CODE = new Character( '\\' );
+
+    protected StringExpression( String property, String value,
+            boolean ignoreCase ) {
+        super( property, value, ESCAPE_CODE, ignoreCase );
+    }
+
+    public static Criterion stringExpression( String propertyName,
+            String value, boolean ignoreCase ) {
+        return new StringExpression( propertyName, value, ignoreCase );
+    }
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/StringExpression.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/Student.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/Student.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/Student.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,56 @@
+//$Id: Student.java 9116 2006-01-23 21:21:01Z steveebersole $
+package org.hibernate.test.criteria;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author Gavin King
+ */
+public class Student {
+	private long studentNumber;
+	private String name;
+	private CityState cityState;
+	private Course preferredCourse;
+	private Set enrolments = new HashSet();
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public long getStudentNumber() {
+		return studentNumber;
+	}
+
+	public void setStudentNumber(long studentNumber) {
+		this.studentNumber = studentNumber;
+	}
+
+	public CityState getCityState() {
+		return cityState;
+	}
+
+	public void setCityState(CityState cityState) {
+		this.cityState = cityState;
+	}
+
+	public Course getPreferredCourse() {
+		return preferredCourse;
+	}
+
+	public void setPreferredCourse(Course preferredCourse) {
+		this.preferredCourse = preferredCourse;
+	}
+
+	public Set getEnrolments() {
+		return enrolments;
+	}
+
+	public void setEnrolments(Set employments) {
+		this.enrolments = employments;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/Student.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/StudentDTO.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/StudentDTO.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/StudentDTO.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,26 @@
+/*
+ * Created on 28-Jan-2005
+ *
+ */
+package org.hibernate.test.criteria;
+
+/**
+ * @author max
+ *
+ */
+public class StudentDTO {
+
+	private String studentName;
+	private String courseDescription;
+
+	public StudentDTO() { }
+	
+	public String getName() {
+		return studentName;
+	}
+	
+	public String getDescription() {
+		return courseDescription;
+	}
+	
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/StudentDTO.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/TestObject.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/TestObject.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/TestObject.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.criteria">
+	<class name="TestObject" table="test">
+		<id name="id">
+			<column name="ID" />
+			<generator class="native" />
+		</id>
+
+		<property name="text" />
+	</class>
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/TestObject.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/TestObject.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/TestObject.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/TestObject.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,22 @@
+package org.hibernate.test.criteria;
+
+public class TestObject {
+    private Integer id;
+    private String text;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId( Integer id ) {
+        this.id = id;
+    }
+
+    public String getText() {
+        return text;
+    }
+
+    public void setText( String text ) {
+        this.text = text;
+    }
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/criteria/TestObject.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cuk/Account.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cuk/Account.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cuk/Account.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,50 @@
+//$Id: Account.java 4592 2004-09-26 00:39:43Z oneovthafew $
+package org.hibernate.test.cuk;
+
+import java.io.Serializable;
+
+/**
+ * @author Gavin King
+ */
+public class Account implements Serializable {
+	private String accountId;
+	private Person user;
+	private char type;
+	/**
+	 * @return Returns the user.
+	 */
+	public Person getUser() {
+		return user;
+	}
+	/**
+	 * @param user The user to set.
+	 */
+	public void setUser(Person user) {
+		this.user = user;
+	}
+	/**
+	 * @return Returns the accountId.
+	 */
+	public String getAccountId() {
+		return accountId;
+	}
+	/**
+	 * @param accountId The accountId to set.
+	 */
+	public void setAccountId(String accountId) {
+		this.accountId = accountId;
+	}
+	/**
+	 * @return Returns the type.
+	 */
+	public char getType() {
+		return type;
+	}
+	/**
+	 * @param type The type to set.
+	 */
+	public void setType(char type) {
+		this.type = type;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cuk/Account.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cuk/Address.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cuk/Address.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cuk/Address.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,75 @@
+//$Id: Address.java 4592 2004-09-26 00:39:43Z oneovthafew $
+package org.hibernate.test.cuk;
+
+import java.io.Serializable;
+
+/**
+ * @author gavin
+ */
+public class Address implements Serializable {
+	private Long id;
+	private String address;
+	private String zip;
+	private String country;
+	private Person person;
+	/**
+	 * @return Returns the id.
+	 */
+	public Long getId() {
+		return id;
+	}
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(Long id) {
+		this.id = id;
+	}
+	/**
+	 * @return Returns the person.
+	 */
+	public Person getPerson() {
+		return person;
+	}
+	/**
+	 * @param person The person to set.
+	 */
+	public void setPerson(Person person) {
+		this.person = person;
+	}
+	/**
+	 * @return Returns the address.
+	 */
+	public String getAddress() {
+		return address;
+	}
+	/**
+	 * @param address The address to set.
+	 */
+	public void setAddress(String address) {
+		this.address = address;
+	}
+	/**
+	 * @return Returns the country.
+	 */
+	public String getCountry() {
+		return country;
+	}
+	/**
+	 * @param country The country to set.
+	 */
+	public void setCountry(String country) {
+		this.country = country;
+	}
+	/**
+	 * @return Returns the zip.
+	 */
+	public String getZip() {
+		return zip;
+	}
+	/**
+	 * @param zip The zip to set.
+	 */
+	public void setZip(String zip) {
+		this.zip = zip;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cuk/Address.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cuk/CompositePropertyRefTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cuk/CompositePropertyRefTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cuk/CompositePropertyRefTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,124 @@
+//$Id: CompositePropertyRefTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.cuk;
+
+import java.util.List;
+import java.util.Set;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class CompositePropertyRefTest extends FunctionalTestCase {
+	
+	public CompositePropertyRefTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "cuk/Person.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setProperty(Environment.DEFAULT_BATCH_FETCH_SIZE, "1");
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( CompositePropertyRefTest.class );
+	}
+	
+	public void testOneToOnePropertyRef() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Person p = new Person();
+		p.setName("Steve");
+		p.setUserId("steve");
+		Address a = new Address();
+		a.setAddress("Texas");
+		a.setCountry("USA");
+		p.setAddress(a);
+		a.setPerson(p);
+		s.save(p);
+		Person p2 = new Person();
+		p2.setName("Max");
+		p2.setUserId("max");
+		s.save(p2);
+		Account act = new Account();
+		act.setType('c');
+		act.setUser(p2);
+		p2.getAccounts().add(act);
+		s.save(act);
+		s.flush();
+		s.clear();
+		
+		p = (Person) s.get( Person.class, p.getId() ); //get address reference by outer join
+		p2 = (Person) s.get( Person.class, p2.getId() ); //get null address reference by outer join
+		assertNull( p2.getAddress() );
+		assertNotNull( p.getAddress() );
+		List l = s.createQuery("from Person").list(); //pull address references for cache
+		assertEquals( l.size(), 2 );
+		assertTrue( l.contains(p) && l.contains(p2) );
+		s.clear();
+		
+		l = s.createQuery("from Person p order by p.name").list(); //get address references by sequential selects
+		assertEquals( l.size(), 2 );
+		assertNull( ( (Person) l.get(0) ).getAddress() );
+		assertNotNull( ( (Person) l.get(1) ).getAddress() );
+		s.clear();
+		
+		l = s.createQuery("from Person p left join fetch p.address a order by a.country").list(); //get em by outer join
+		assertEquals( l.size(), 2 );
+		if ( ( (Person) l.get(0) ).getName().equals("Max") ) {
+			assertNull( ( (Person) l.get(0) ).getAddress() );
+			assertNotNull( ( (Person) l.get(1) ).getAddress() );
+		}
+		else {
+			assertNull( ( (Person) l.get(1) ).getAddress() );
+			assertNotNull( ( (Person) l.get(0) ).getAddress() );
+		}
+		s.clear();
+		
+		l = s.createQuery("from Person p left join p.accounts").list();
+		for ( int i=0; i<2; i++ ) {
+			Object[] row = (Object[]) l.get(i);
+			Person px = (Person) row[0];
+			Set accounts = px.getAccounts();
+			assertFalse( Hibernate.isInitialized(accounts) );
+			assertTrue( px.getAccounts().size()>0 || row[1]==null );
+		}
+		s.clear();
+
+		l = s.createQuery("from Person p left join fetch p.accounts a order by p.name").list();
+		Person p0 = (Person) l.get(0);
+		assertTrue( Hibernate.isInitialized( p0.getAccounts() ) );
+		assertEquals( p0.getAccounts().size(), 1 );
+		assertSame( ( (Account) p0.getAccounts().iterator().next() ).getUser(), p0 );
+		Person p1 = (Person) l.get(1);
+		assertTrue( Hibernate.isInitialized( p1.getAccounts() ) );
+		assertEquals( p1.getAccounts().size(), 0 );
+		s.clear();
+		
+		l = s.createQuery("from Account a join fetch a.user").list();
+		
+		s.clear();
+		
+		l = s.createQuery("from Person p left join fetch p.address").list();
+		
+		s.clear();
+		s.createQuery( "delete Address" ).executeUpdate();
+		s.createQuery( "delete Account" ).executeUpdate();
+		s.createQuery( "delete Person" ).executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cuk/CompositePropertyRefTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cuk/Person.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cuk/Person.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cuk/Person.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,63 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+  Demonstrates the use of property-ref to map legacy data where
+  foreign keys reference something other than the primary key of
+  the associated entity. Here we show:
+  
+  (1) A one-to-one foreign key association (prefer primary key 
+      associations)
+      
+  (2) A bidirectional one-to-many association on a key that is
+      comprised of several properties of the associated entity
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.cuk">
+
+	<class name="Person">
+		<id name="id">
+			<generator class="hilo"/>
+		</id>
+		<property name="name" length="100"/>
+        <one-to-one name="address" property-ref="person" cascade="all" fetch="join"/>
+		<set name="accounts" inverse="true">
+            <key property-ref="userIdAndDeleted">
+				<column name="userId"/>
+				<column name="userDeleted"/>
+			</key>
+			<one-to-many class="Account"/>
+		</set>
+		<properties name="userIdAndDeleted" update="false" unique="true">
+			<property name="userId" length="8"/>
+			<property name="deleted"/>
+		</properties>
+		
+	</class>
+
+	<class name="Address">
+	    <id name="id">
+			<generator class="hilo"/>
+		</id>
+		<property name="address" length="300"/>
+		<property name="zip" length="5"/>
+		<property name="country" length="25"/>
+		<many-to-one name="person" unique="true" not-null="true"/>
+	</class>
+	
+	<class name="Account" table="`Account`">
+		<id name="accountId" length="32">
+			<generator class="uuid.hex"/>
+		</id>
+		<many-to-one name="user" property-ref="userIdAndDeleted">
+			<column name="userId"/>
+			<column name="userDeleted"/>
+		</many-to-one>
+		<property name="type" column="`type`" not-null="true"/>
+	</class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cuk/Person.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cuk/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cuk/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cuk/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,100 @@
+//$Id: Person.java 4592 2004-09-26 00:39:43Z oneovthafew $
+package org.hibernate.test.cuk;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author gavin
+ */
+public class Person implements Serializable {
+	private Long id;
+	private String name;
+	private Address address;
+	private String userId;
+	private boolean deleted;
+	private Set accounts = new HashSet();
+	/**
+	 * @return Returns the userId.
+	 */
+	public String getUserId() {
+		return userId;
+	}
+	/**
+	 * @param userId The userId to set.
+	 */
+	public void setUserId(String userId) {
+		this.userId = userId;
+	}
+	/**
+	 * @return Returns the address.
+	 */
+	public Address getAddress() {
+		return address;
+	}
+	/**
+	 * @param address The address to set.
+	 */
+	public void setAddress(Address address) {
+		this.address = address;
+	}
+	/**
+	 * @return Returns the id.
+	 */
+	public Long getId() {
+		return id;
+	}
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(Long id) {
+		this.id = id;
+	}
+	/**
+	 * @return Returns the name.
+	 */
+	public String getName() {
+		return name;
+	}
+	/**
+	 * @param name The name to set.
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+	/**
+	 * @return Returns the accounts.
+	 */
+	public Set getAccounts() {
+		return accounts;
+	}
+	/**
+	 * @param accounts The accounts to set.
+	 */
+	public void setAccounts(Set accounts) {
+		this.accounts = accounts;
+	}
+	
+	public boolean isDeleted() {
+		return deleted;
+	}
+	
+	public void setDeleted(boolean deleted) {
+		this.deleted = deleted;
+	}
+	
+	public boolean equals(Object other) {
+		if (other instanceof Person) {
+			Person that = (Person) other;
+			return that.isDeleted() == deleted && that.getUserId().equals(userId);
+		}
+		else {
+			return false;
+		}
+	}
+	
+	public int hashCode() {
+		return userId.hashCode();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cuk/Person.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cut/CompositeUserTypeTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cut/CompositeUserTypeTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cut/CompositeUserTypeTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,101 @@
+//$Id: CompositeUserTypeTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.cut;
+
+import java.math.BigDecimal;
+import java.util.Currency;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.dialect.HSQLDialect;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class CompositeUserTypeTest extends FunctionalTestCase {
+	
+	public CompositeUserTypeTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "cut/types.hbm.xml", "cut/Transaction.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( CompositeUserTypeTest.class );
+	}
+	
+	public void testCompositeUserType() {
+		Session s = openSession();
+		org.hibernate.Transaction t = s.beginTransaction();
+		
+		Transaction tran = new Transaction();
+		tran.setDescription("a small transaction");
+		tran.setValue( new MonetoryAmount( new BigDecimal(1.5), Currency.getInstance("USD") ) );
+		s.persist(tran);
+		
+		List result = s.createQuery("from Transaction tran where tran.value.amount > 1.0 and tran.value.currency = 'USD'").list();
+		assertEquals( result.size(), 1 );
+		tran.getValue().setCurrency( Currency.getInstance("AUD") );
+		result = s.createQuery("from Transaction tran where tran.value.amount > 1.0 and tran.value.currency = 'AUD'").list();
+		assertEquals( result.size(), 1 );
+		
+		if ( !(getDialect() instanceof HSQLDialect) ) {
+		
+			result = s.createQuery("from Transaction txn where txn.value = (1.5, 'AUD')").list();
+			assertEquals( result.size(), 1 );
+			result = s.createQuery("from Transaction where value = (1.5, 'AUD')").list();
+			assertEquals( result.size(), 1 );
+			
+		}
+		
+		s.delete(tran);
+		t.commit();
+		s.close();
+	}
+	
+	public void testCustomColumnReadAndWrite() {
+		Session s = openSession();
+		org.hibernate.Transaction t = s.beginTransaction();
+		final BigDecimal AMOUNT = new BigDecimal(73000000d);
+		final BigDecimal AMOUNT_MILLIONS = AMOUNT.divide(new BigDecimal(1000000d));
+		MutualFund f = new MutualFund();
+		f.setHoldings( new MonetoryAmount( AMOUNT, Currency.getInstance("USD") ) );
+		s.persist(f);
+		s.flush();
+		
+		// Test value conversion during insert
+		BigDecimal amountViaSql = (BigDecimal)s.createSQLQuery("select amount_millions from MutualFund").uniqueResult();
+		assertEquals(AMOUNT_MILLIONS.doubleValue(), amountViaSql.doubleValue(), 0.01d);
+		
+		// Test projection
+		BigDecimal amountViaHql = (BigDecimal)s.createQuery("select f.holdings.amount from MutualFund f").uniqueResult();
+		assertEquals(AMOUNT.doubleValue(), amountViaHql.doubleValue(), 0.01d);
+		
+		// Test restriction and entity load via criteria
+		BigDecimal one = new BigDecimal(1);
+		f = (MutualFund)s.createCriteria(MutualFund.class)
+			.add(Restrictions.between("holdings.amount", AMOUNT.subtract(one), AMOUNT.add(one)))
+			.uniqueResult();
+		assertEquals(AMOUNT.doubleValue(), f.getHoldings().getAmount().doubleValue(), 0.01d);
+		
+		// Test predicate and entity load via HQL
+		f = (MutualFund)s.createQuery("from MutualFund f where f.holdings.amount between ? and ?")
+			.setBigDecimal(0, AMOUNT.subtract(one))
+			.setBigDecimal(1, AMOUNT.add(one))
+			.uniqueResult();
+		assertEquals(AMOUNT.doubleValue(), f.getHoldings().getAmount().doubleValue(), 0.01d);
+				
+		s.delete(f);
+		t.commit();
+		s.close();
+		
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cut/CompositeUserTypeTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cut/MonetoryAmount.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cut/MonetoryAmount.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cut/MonetoryAmount.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,37 @@
+//$Id: MonetoryAmount.java 6234 2005-03-29 03:07:30Z oneovthafew $
+package org.hibernate.test.cut;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Currency;
+
+/**
+ * @author Gavin King
+ */
+public class MonetoryAmount implements Serializable {
+
+	private BigDecimal amount;
+	private Currency currency;
+	
+	public MonetoryAmount(BigDecimal amount, Currency currency) {
+		this.amount = amount;
+		this.currency = currency;
+	}
+	
+	public BigDecimal getAmount() {
+		return amount;
+	}
+	
+	public void setAmount(BigDecimal amount) {
+		this.amount = amount;
+	}
+
+	public Currency getCurrency() {
+		return currency;
+	}
+
+	public void setCurrency(Currency currency) {
+		this.currency = currency;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cut/MonetoryAmount.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cut/MonetoryAmountUserType.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cut/MonetoryAmountUserType.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cut/MonetoryAmountUserType.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,104 @@
+//$Id: MonetoryAmountUserType.java 6235 2005-03-29 03:17:49Z oneovthafew $
+package org.hibernate.test.cut;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.Currency;
+
+import org.hibernate.Hibernate;
+import org.hibernate.HibernateException;
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.type.Type;
+import org.hibernate.usertype.CompositeUserType;
+
+/**
+ * @author Gavin King
+ */
+public class MonetoryAmountUserType implements CompositeUserType {
+
+	public String[] getPropertyNames() {
+		return new String[] { "amount", "currency" };
+	}
+
+	public Type[] getPropertyTypes() {
+		return new Type[] { Hibernate.BIG_DECIMAL, Hibernate.CURRENCY };
+	}
+
+	public Object getPropertyValue(Object component, int property) throws HibernateException {
+		MonetoryAmount ma = (MonetoryAmount) component;
+		return property==0 ? (Object) ma.getAmount() : (Object) ma.getCurrency();
+	}
+
+	public void setPropertyValue(Object component, int property, Object value)
+			throws HibernateException {
+		MonetoryAmount ma = (MonetoryAmount) component;
+		if ( property==0 ) {
+			ma.setAmount( (BigDecimal) value );
+		}
+		else {
+			ma.setCurrency( (Currency) value );
+		}
+	}
+
+	public Class returnedClass() {
+		return MonetoryAmount.class;
+	}
+
+	public boolean equals(Object x, Object y) throws HibernateException {
+		if (x==y) return true;
+		if (x==null || y==null) return false;
+		MonetoryAmount mx = (MonetoryAmount) x;
+		MonetoryAmount my = (MonetoryAmount) y;
+		return mx.getAmount().equals( my.getAmount() ) &&
+			mx.getCurrency().equals( my.getCurrency() );
+	}
+
+	public int hashCode(Object x) throws HibernateException {
+		return ( (MonetoryAmount) x ).getAmount().hashCode();
+	}
+
+	public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner)
+			throws HibernateException, SQLException {
+		BigDecimal amt = (BigDecimal) Hibernate.BIG_DECIMAL.nullSafeGet( rs, names[0] );
+		Currency cur = (Currency) Hibernate.CURRENCY.nullSafeGet( rs, names[1] );
+		if (amt==null) return null;
+		return new MonetoryAmount(amt, cur);
+	}
+
+	public void nullSafeSet(PreparedStatement st, Object value, int index,
+			SessionImplementor session) throws HibernateException, SQLException {
+		MonetoryAmount ma = (MonetoryAmount) value;
+		BigDecimal amt = ma == null ? null : ma.getAmount();
+		Currency cur = ma == null ? null : ma.getCurrency();
+		Hibernate.BIG_DECIMAL.nullSafeSet(st, amt, index);
+		Hibernate.CURRENCY.nullSafeSet(st, cur, index+1);
+	}
+
+	public Object deepCopy(Object value) throws HibernateException {
+		MonetoryAmount ma = (MonetoryAmount) value;
+		return new MonetoryAmount( ma.getAmount(), ma.getCurrency() );
+	}
+
+	public boolean isMutable() {
+		return true;
+	}
+
+	public Serializable disassemble(Object value, SessionImplementor session)
+			throws HibernateException {
+		return (Serializable) deepCopy(value);
+	}
+
+	public Object assemble(Serializable cached, SessionImplementor session, Object owner)
+			throws HibernateException {
+		return deepCopy(cached);
+	}
+
+	public Object replace(Object original, Object target, SessionImplementor session, Object owner)
+			throws HibernateException {
+		return deepCopy(original); //TODO: improve
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cut/MonetoryAmountUserType.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cut/MutualFund.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cut/MutualFund.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cut/MutualFund.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,28 @@
+package org.hibernate.test.cut;
+
+/**
+ * @author Rob.Hasselbaum
+ *
+ */
+public class MutualFund {
+	
+	private Long id;
+	private MonetoryAmount holdings;
+	
+	public Long getId() {
+		return id;
+	}
+	
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public MonetoryAmount getHoldings() {
+		return holdings;
+	}
+
+	public void setHoldings(MonetoryAmount holdings) {
+		this.holdings = holdings;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cut/MutualFund.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cut/Transaction.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cut/Transaction.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cut/Transaction.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,38 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+  Demonstrates the use of a CompositeUserType.
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.cut">
+
+    <class name="Transaction" table="Trnsctn">
+		<id name="id">
+			<generator class="native"/>
+		</id>
+		<property name="description" length="100" not-null="true"/>
+		<property name="value" type="money">
+			<column name="amount" not-null="true"/>
+			<column name="currency" not-null="true"/>
+		</property>
+	</class>
+	
+    <class name="MutualFund" table="MutualFund">
+		<id name="id">
+			<generator class="native"/>
+		</id>
+		<property name="holdings" type="money">
+			<column name="amount_millions"
+				not-null="true"
+				read="amount_millions * 1000000.0"
+				write="? / 1000000.0"/>
+			<column name="currency" not-null="true"/>
+		</property>
+	</class>	
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cut/Transaction.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cut/Transaction.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cut/Transaction.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cut/Transaction.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,37 @@
+//$Id: Transaction.java 6234 2005-03-29 03:07:30Z oneovthafew $
+package org.hibernate.test.cut;
+
+/**
+ * @author Gavin King
+ */
+public class Transaction {
+
+	private Long id;
+	private String description;
+	private MonetoryAmount value;
+	
+	public String getDescription() {
+		return description;
+	}
+	
+	public void setDescription(String description) {
+		this.description = description;
+	}
+	
+	public Long getId() {
+		return id;
+	}
+	
+	public void setId(Long id) {
+		this.id = id;
+	}
+	
+	public MonetoryAmount getValue() {
+		return value;
+	}
+	
+	public void setValue(MonetoryAmount value) {
+		this.value = value;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cut/Transaction.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cut/types.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cut/types.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cut/types.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.cut">
+	<typedef name="money" class="org.hibernate.test.cut.MonetoryAmountUserType"/>
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/cut/types.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/deletetransient/Address.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/deletetransient/Address.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/deletetransient/Address.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,46 @@
+package org.hibernate.test.deletetransient;
+
+import java.util.Set;
+import java.util.HashSet;
+
+/**
+ * todo: describe Address
+ *
+ * @author Steve Ebersole
+ */
+public class Address {
+	private Long id;
+	private String info;
+	private Set suites = new HashSet();
+
+	public Address() {
+	}
+
+	public Address(String info) {
+		this.info = info;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getInfo() {
+		return info;
+	}
+
+	public void setInfo(String info) {
+		this.info = info;
+	}
+
+	public Set getSuites() {
+		return suites;
+	}
+
+	public void setSuites(Set suites) {
+		this.suites = suites;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/deletetransient/Address.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/deletetransient/DeleteTransientEntityTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/deletetransient/DeleteTransientEntityTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/deletetransient/DeleteTransientEntityTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,174 @@
+package org.hibernate.test.deletetransient;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * todo: describe DeleteTransientEntityTest
+ *
+ * @author Steve Ebersole
+ */
+public class DeleteTransientEntityTest extends FunctionalTestCase {
+	public DeleteTransientEntityTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "deletetransient/Person.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( DeleteTransientEntityTest.class );
+	}
+
+	public void testTransientEntityDeletionNoCascades() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.delete( new Address() );
+		t.commit();
+		s.close();
+	}
+
+	public void testTransientEntityDeletionCascadingToTransientAssociation() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Person p = new Person();
+		p.getAddresses().add( new Address() );
+		s.delete( p );
+		t.commit();
+		s.close();
+	}
+
+	public void testTransientEntityDeleteCascadingToCircularity() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Person p1 = new Person();
+		Person p2 = new Person();
+		p1.getFriends().add( p2 );
+		p2.getFriends().add( p1 );
+		s.delete( p1 );
+		t.commit();
+		s.close();
+	}
+
+	public void testTransientEntityDeletionCascadingToDetachedAssociation() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Address address = new Address();
+		address.setInfo( "123 Main St." );
+		s.save( address );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Person p = new Person();
+		p.getAddresses().add( address );
+		s.delete( p );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Long count = ( Long ) s.createQuery( "select count(*) from Address" ).list().get( 0 );
+		assertEquals( "delete not cascaded properly across transient entity", 0, count.longValue() );
+		t.commit();
+		s.close();
+	}
+
+	public void testTransientEntityDeletionCascadingToPersistentAssociation() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Address address = new Address();
+		address.setInfo( "123 Main St." );
+		s.save( address );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		address = ( Address ) s.get( Address.class, address.getId() );
+		Person p = new Person();
+		p.getAddresses().add( address );
+		s.delete( p );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Long count = ( Long ) s.createQuery( "select count(*) from Address" ).list().get( 0 );
+		assertEquals( "delete not cascaded properly across transient entity", 0, count.longValue() );
+		t.commit();
+		s.close();
+	}
+
+	public void testCascadeAllFromClearedPersistentAssnToTransientEntity() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Person p = new Person();
+		Address address = new Address();
+		address.setInfo( "123 Main St." );
+		p.getAddresses().add( address );
+		s.save( p );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Suite suite = new Suite();
+		address.getSuites().add( suite );
+		p.getAddresses().clear();
+		s.saveOrUpdate( p );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		p = ( Person ) s.get( p.getClass(), p.getId() );
+		assertEquals( "persistent collection not cleared", 0, p.getAddresses().size() );
+		Long count = ( Long ) s.createQuery( "select count(*) from Address" ).list().get( 0 );
+		assertEquals( 1, count.longValue() );
+		count = ( Long ) s.createQuery( "select count(*) from Suite" ).list().get( 0 );
+		assertEquals( 0, count.longValue() );
+		s.delete( p );
+		t.commit();
+		s.close();
+	}
+
+	public void testCascadeAllDeleteOrphanFromClearedPersistentAssnToTransientEntity() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Address address = new Address();
+		address.setInfo( "123 Main St." );
+		Suite suite = new Suite();
+		address.getSuites().add( suite );
+		s.save( address );
+		t.commit();
+		s.close();
+
+
+		s = openSession();
+		t = s.beginTransaction();
+		Note note = new Note();
+		note.setDescription( "a description" );
+		suite.getNotes().add( note );
+		address.getSuites().clear();
+		s.saveOrUpdate( address );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Long count = ( Long ) s.createQuery( "select count(*) from Suite" ).list().get( 0 );
+		assertEquals( "all-delete-orphan not cascaded properly to cleared persistent collection entities", 0, count.longValue() );
+		count = ( Long ) s.createQuery( "select count(*) from Note" ).list().get( 0 );
+		assertEquals( 0, count.longValue() );
+		s.delete( address );
+		t.commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/deletetransient/DeleteTransientEntityTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/deletetransient/Note.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/deletetransient/Note.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/deletetransient/Note.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,33 @@
+package org.hibernate.test.deletetransient;
+
+/**
+ *
+ * @author Gail Badner
+ */
+public class Note {
+	private Long id;
+	private String description;
+
+	public Note() {
+	}
+
+	public Note(String description) {
+		this.description = description;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getDescription() {
+		return description;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/deletetransient/Note.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/deletetransient/Person.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/deletetransient/Person.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/deletetransient/Person.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,56 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.deletetransient">
+	
+	<class name="Person" table="T_PERSON">
+        <id name="id" type="long">
+            <generator class="increment"/>
+        </id>
+        <property name="name" type="string"/>
+        <set name="addresses" lazy="true" inverse="false" cascade="all">
+            <key column="PERSON_ID"/>
+            <one-to-many class="Address"/>
+        </set>
+        <bag name="friends" lazy="true" inverse="false" cascade="all" table="T_FRIENDS">
+            <key column="FRIEND_ID_1"/>
+            <many-to-many class="Person" column="FRIEND_ID_2"/>
+        </bag>
+    </class>
+
+    <class name="Address" table="T_ADDRESS">
+        <id name="id" type="long">
+            <generator class="increment"/>
+        </id>
+        <property name="info" type="string"/>
+        <set name="suites" lazy="true" inverse="false" cascade="all-delete-orphan">
+            <key column="ADDRESS_ID"/>
+            <one-to-many class="Suite"/>
+        </set>
+    </class>
+
+    <class name="Suite" table="T_SUITE">
+        <id name="id" type="long">
+            <generator class="increment"/>
+        </id>
+        <property name="location" type="string"/>
+        <set name="notes" lazy="true" inverse="false" cascade="all-delete-orphan">
+            <key column="SUITE_ID"/>
+            <one-to-many class="Note"/>
+        </set>
+    </class>
+
+    <class name="Note" table="T_NOTE">
+        <id name="id" type="long">
+            <generator class="increment"/>
+        </id>
+        <property name="description" type="string"/>
+    </class>    
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/deletetransient/Person.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/deletetransient/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/deletetransient/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/deletetransient/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,57 @@
+package org.hibernate.test.deletetransient;
+
+import java.util.Set;
+import java.util.HashSet;
+import java.util.Collection;
+import java.util.ArrayList;
+
+/**
+ * todo: describe Person
+ *
+ * @author Steve Ebersole
+ */
+public class Person {
+	private Long id;
+	private String name;
+	private Set addresses = new HashSet();
+	private Collection friends = new ArrayList();
+
+	public Person() {
+	}
+
+	public Person(String name) {
+		this.name = name;
+	}
+
+	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 Set getAddresses() {
+		return addresses;
+	}
+
+	public void setAddresses(Set addresses) {
+		this.addresses = addresses;
+	}
+
+	public Collection getFriends() {
+		return friends;
+	}
+
+	public void setFriends(Collection friends) {
+		this.friends = friends;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/deletetransient/Person.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/deletetransient/Suite.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/deletetransient/Suite.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/deletetransient/Suite.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,47 @@
+package org.hibernate.test.deletetransient;
+
+import java.util.Set;
+import java.util.HashSet;
+import java.util.Collection;
+import java.util.ArrayList;
+
+/**
+ *
+ * @author Gail Badner
+ */
+public class Suite {
+	private Long id;
+	private String location;
+	private Set notes = new HashSet();
+
+	public Suite() {
+	}
+
+	public Suite(String location) {
+		this.location = location;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getLocation() {
+		return location;
+	}
+
+	public void setLocation(String location) {
+		this.location = location;
+	}
+
+	public Set getNotes() {
+		return notes;
+	}
+
+	public void setNotes(Set notes) {
+		this.notes = notes;
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/deletetransient/Suite.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/function/AnsiTrimEmulationFunctionTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/function/AnsiTrimEmulationFunctionTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/function/AnsiTrimEmulationFunctionTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,169 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.dialect.function;
+
+import java.util.List;
+import java.util.ArrayList;
+
+import junit.framework.TestCase;
+
+import org.hibernate.dialect.function.AnsiTrimEmulationFunction;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class AnsiTrimEmulationFunctionTest extends TestCase {
+	private static final String trimSource = "a.column";
+
+	public void testBasicSqlServerProcessing() {
+		AnsiTrimEmulationFunction function = new AnsiTrimEmulationFunction();
+
+		performBasicSpaceTrimmingTests( function );
+
+		final String expectedTrimPrep = "replace(replace(a.column,' ','${space}$'),'-',' ')";
+		final String expectedPostTrimPrefix = "replace(replace(";
+		final String expectedPostTrimSuffix = ",' ','-'),'${space}$',' ')";
+
+		// -> trim(LEADING '-' FROM a.column)
+		String rendered = function.render( argList( "LEADING", "'-'", "FROM", trimSource ), null );
+		String expected = expectedPostTrimPrefix + "ltrim(" + expectedTrimPrep + ")" + expectedPostTrimSuffix;
+		assertEquals( expected, rendered );
+
+		// -> trim(TRAILING '-' FROM a.column)
+		rendered = function.render( argList( "TRAILING", "'-'", "FROM", trimSource ), null );
+		expected = expectedPostTrimPrefix + "rtrim(" + expectedTrimPrep + ")" + expectedPostTrimSuffix;
+		assertEquals( expected, rendered );
+
+		// -> trim(BOTH '-' FROM a.column)
+		rendered = function.render( argList( "BOTH", "'-'", "FROM", trimSource ), null );
+		expected = expectedPostTrimPrefix + "ltrim(rtrim(" + expectedTrimPrep + "))" + expectedPostTrimSuffix;
+		assertEquals( expected, rendered );
+
+		// -> trim('-' FROM a.column)
+		rendered = function.render( argList( "'-'", "FROM", trimSource ), null );
+		expected = expectedPostTrimPrefix + "ltrim(rtrim(" + expectedTrimPrep + "))" + expectedPostTrimSuffix;
+		assertEquals( expected, rendered );
+	}
+
+	public void testBasicSybaseProcessing() {
+		AnsiTrimEmulationFunction function = new AnsiTrimEmulationFunction(
+				AnsiTrimEmulationFunction.LTRIM,
+				AnsiTrimEmulationFunction.RTRIM,
+				"str_replace"
+		);
+
+		performBasicSpaceTrimmingTests( function );
+
+		final String expectedTrimPrep = "str_replace(str_replace(a.column,' ','${space}$'),'-',' ')";
+		final String expectedPostTrimPrefix = "str_replace(str_replace(";
+		final String expectedPostTrimSuffix = ",' ','-'),'${space}$',' ')";
+
+		// -> trim(LEADING '-' FROM a.column)
+		String rendered = function.render( argList( "LEADING", "'-'", "FROM", trimSource ), null );
+		String expected = expectedPostTrimPrefix + "ltrim(" + expectedTrimPrep + ")" + expectedPostTrimSuffix;
+		assertEquals( expected, rendered );
+
+		// -> trim(TRAILING '-' FROM a.column)
+		rendered = function.render( argList( "TRAILING", "'-'", "FROM", trimSource ), null );
+		expected = expectedPostTrimPrefix + "rtrim(" + expectedTrimPrep + ")" + expectedPostTrimSuffix;
+		assertEquals( expected, rendered );
+
+		// -> trim(BOTH '-' FROM a.column)
+		rendered = function.render( argList( "BOTH", "'-'", "FROM", trimSource ), null );
+		expected = expectedPostTrimPrefix + "ltrim(rtrim(" + expectedTrimPrep + "))" + expectedPostTrimSuffix;
+		assertEquals( expected, rendered );
+
+		// -> trim('-' FROM a.column)
+		rendered = function.render( argList( "'-'", "FROM", trimSource ), null );
+		expected = expectedPostTrimPrefix + "ltrim(rtrim(" + expectedTrimPrep + "))" + expectedPostTrimSuffix;
+		assertEquals( expected, rendered );
+	}
+
+	private void performBasicSpaceTrimmingTests(AnsiTrimEmulationFunction function) {
+		// -> trim(a.column)
+		String rendered = function.render( argList( trimSource ), null );
+		assertEquals( "ltrim(rtrim(a.column))", rendered );
+
+		// -> trim(FROM a.column)
+		rendered = function.render( argList( "FROM", trimSource ), null );
+		assertEquals( "ltrim(rtrim(a.column))", rendered );
+
+		// -> trim(BOTH FROM a.column)
+		rendered = function.render( argList( "BOTH", "FROM", trimSource ), null );
+		assertEquals( "ltrim(rtrim(a.column))", rendered );
+
+		// -> trim(BOTH ' ' FROM a.column)
+		rendered = function.render( argList( "BOTH", "' '", "FROM", trimSource ), null );
+		assertEquals( "ltrim(rtrim(a.column))", rendered );
+
+		// -> trim(LEADING FROM a.column)
+		rendered = function.render( argList( "LEADING", "FROM", trimSource ), null );
+		assertEquals( "ltrim(a.column)", rendered );
+
+		// -> trim(LEADING ' ' FROM a.column)
+		rendered = function.render( argList( "LEADING", "' '", "FROM", trimSource ), null );
+		assertEquals( "ltrim(a.column)", rendered );
+
+		// -> trim(TRAILING FROM a.column)
+		rendered = function.render( argList( "TRAILING", "FROM", trimSource ), null );
+		assertEquals( "rtrim(a.column)", rendered );
+
+		// -> trim(TRAILING ' ' FROM a.column)
+		rendered = function.render( argList( "TRAILING", "' '", "FROM", trimSource ), null );
+		assertEquals( "rtrim(a.column)", rendered );
+	}
+
+	private List argList(String arg) {
+		ArrayList args = new ArrayList();
+		args.add( arg );
+		return args;
+	}
+
+	private List argList(String arg1, String arg2) {
+		ArrayList args = new ArrayList();
+		args.add( arg1 );
+		args.add( arg2 );
+		return args;
+	}
+
+	private List argList(String arg1, String arg2, String arg3) {
+		ArrayList args = new ArrayList();
+		args.add( arg1 );
+		args.add( arg2 );
+		args.add( arg3 );
+		return args;
+	}
+
+	private List argList(String arg1, String arg2, String arg3, String arg4) {
+		ArrayList args = new ArrayList();
+		args.add( arg1 );
+		args.add( arg2 );
+		args.add( arg3 );
+		args.add( arg4 );
+		return args;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/function/AnsiTrimEmulationFunctionTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/function/MySQLRoundFunctionTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/function/MySQLRoundFunctionTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/function/MySQLRoundFunctionTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,71 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.dialect.function;
+
+import java.math.BigDecimal;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.dialect.MySQLDialect;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+
+/**
+ * 
+ * @author Strong Liu <stliu at redhat.com>
+ *
+ */
+public class MySQLRoundFunctionTest extends FunctionalTestCase {
+
+	public MySQLRoundFunctionTest( String string ) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[]{"dialect/function/Product.hbm.xml"};
+	}
+	
+	public void testRoundFuntion(){
+		if(!(getDialect() instanceof MySQLDialect))
+			return;
+		Product product = new Product();
+		product.setLength( 100 );
+		product.setPrice( new BigDecimal( 1.298 ) );
+		Session s=openSession();
+		Transaction tx=s.beginTransaction();
+		s.save( product );
+		tx.commit();
+		s.close();
+		s=openSession();
+		tx=s.beginTransaction();
+		Query q=s.createQuery( "select round(p.price,1) from Product p" );
+		Object o=q.uniqueResult();
+		assertEquals( BigDecimal.class , o.getClass() );
+		assertEquals( BigDecimal.valueOf( 1.3 ) , o );
+		tx.commit();
+		s.close();
+		
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/function/MySQLRoundFunctionTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/function/Product.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/function/Product.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/function/Product.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.dialect.function">
+
+	<class name="Product" table="t_product">
+		<id name="id">
+            <generator class="native"/>
+        </id>
+        <property name="length" />
+        <property name="weight" />
+        <property name="price" />
+	</class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/function/Product.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/function/Product.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/function/Product.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/function/Product.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,71 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.dialect.function;
+
+import java.math.BigDecimal;
+
+/**
+ * 
+ * @author Strong Liu <stliu at redhat.com>
+ *
+ */
+public class Product {
+	private Long id;
+	private int length;
+	private long weight;
+	private BigDecimal price;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId( Long id ) {
+		this.id = id;
+	}
+
+	public int getLength() {
+		return length;
+	}
+
+	public void setLength( int length ) {
+		this.length = length;
+	}
+
+	public long getWeight() {
+		return weight;
+	}
+
+	public void setWeight( long weight ) {
+		this.weight = weight;
+	}
+
+	public BigDecimal getPrice() {
+		return price;
+	}
+
+	public void setPrice( BigDecimal price ) {
+		this.price = price;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/function/Product.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/functional/cache/SQLFunctionsInterSystemsTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/functional/cache/SQLFunctionsInterSystemsTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/functional/cache/SQLFunctionsInterSystemsTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,817 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.dialect.functional.cache;
+
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.hibernate.LockMode;
+import org.hibernate.Query;
+import org.hibernate.ScrollableResults;
+import org.hibernate.Transaction;
+import org.hibernate.classic.Session;
+import org.hibernate.dialect.Cache71Dialect;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.dialect.HSQLDialect;
+import org.hibernate.dialect.InterbaseDialect;
+import org.hibernate.dialect.MckoiDialect;
+import org.hibernate.dialect.MySQLDialect;
+import org.hibernate.dialect.SybaseDialect;
+import org.hibernate.dialect.TimesTenDialect;
+import org.hibernate.dialect.function.SQLFunction;
+import org.hibernate.testing.junit.functional.DatabaseSpecificFunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.legacy.Blobber;
+import org.hibernate.test.legacy.Broken;
+import org.hibernate.test.legacy.Fixed;
+import org.hibernate.test.legacy.Simple;
+import org.hibernate.test.legacy.Single;
+
+/**
+ * Tests for function support on CacheSQL...
+ *
+ * @author Jonathan Levinson
+ */
+public class SQLFunctionsInterSystemsTest extends DatabaseSpecificFunctionalTestCase {
+
+	private static final Logger log = LoggerFactory.getLogger(SQLFunctionsInterSystemsTest.class);
+
+	public SQLFunctionsInterSystemsTest(String name) {
+		super(name);
+	}
+
+	public String[] getMappings() {
+		return new String[] {
+				"legacy/AltSimple.hbm.xml",
+				"legacy/Broken.hbm.xml",
+				"legacy/Blobber.hbm.xml",
+				"dialect/cache/TestInterSystemsFunctionsClass.hbm.xml"
+		};
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( SQLFunctionsInterSystemsTest.class );
+	}
+
+	public boolean appliesTo(Dialect dialect) {
+		// all these test case apply only to testing InterSystems' CacheSQL dialect
+		return dialect instanceof Cache71Dialect;
+	}
+
+	public void testDialectSQLFunctions() throws Exception {
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Iterator iter = s.createQuery( "select max(s.count) from Simple s" ).iterate();
+
+		if ( getDialect() instanceof MySQLDialect ) assertTrue( iter.hasNext() && iter.next()==null );
+
+		Simple simple = new Simple();
+		simple.setName("Simple Dialect Function Test");
+		simple.setAddress("Simple Address");
+		simple.setPay(new Float(45.8));
+		simple.setCount(2);
+		s.save(simple, new Long(10) );
+
+		// Test to make sure allocating an specified object operates correctly.
+		assertTrue(
+				s.createQuery( "select new org.hibernate.test.legacy.S(s.count, s.address) from Simple s" ).list().size() == 1
+		);
+
+		// Quick check the base dialect functions operate correctly
+		assertTrue(
+				s.createQuery( "select max(s.count) from Simple s" ).list().size() == 1
+		);
+		assertTrue(
+				s.createQuery( "select count(*) from Simple s" ).list().size() == 1
+		);
+
+		if ( getDialect() instanceof Cache71Dialect) {
+			// Check Oracle Dialect mix of dialect functions - no args (no parenthesis and single arg functions
+			List rset = s.createQuery( "select s.name, sysdate, floor(s.pay), round(s.pay,0) from Simple s" ).list();
+			assertNotNull("Name string should have been returned",(((Object[])rset.get(0))[0]));
+			assertNotNull("Todays Date should have been returned",(((Object[])rset.get(0))[1]));
+			assertEquals("floor(45.8) result was incorrect ", new Integer(45), ( (Object[]) rset.get(0) )[2] );
+			assertEquals("round(45.8) result was incorrect ", new Float(46), ( (Object[]) rset.get(0) )[3] );
+
+			simple.setPay(new Float(-45.8));
+			s.update(simple);
+
+			// Test type conversions while using nested functions (Float to Int).
+			rset = s.createQuery( "select abs(round(s.pay,0)) from Simple s" ).list();
+			assertEquals("abs(round(-45.8)) result was incorrect ", new Float(46), rset.get(0));
+
+			// Test a larger depth 3 function example - Not a useful combo other than for testing
+			assertTrue(
+					s.createQuery( "select floor(round(sysdate,1)) from Simple s" ).list().size() == 1
+			);
+
+			// Test the oracle standard NVL funtion as a test of multi-param functions...
+			simple.setPay(null);
+			s.update(simple);
+			Double value = (Double) s.createQuery("select mod( nvl(s.pay, 5000), 2 ) from Simple as s where s.id = 10").list().get(0);
+			assertTrue( 0 == value.intValue() );
+		}
+
+		if ( (getDialect() instanceof Cache71Dialect) ) {
+			// Test the hsql standard MOD funtion as a test of multi-param functions...
+			Double value = (Double) s.createQuery( "select MOD(s.count, 2) from Simple as s where s.id = 10" )
+					.list()
+					.get(0);
+			assertTrue( 0 == value.intValue() );
+        }
+
+        /*
+        if ( (getDialect() instanceof Cache71Dialect) ) {
+            // Test the hsql standard MOD funtion as a test of multi-param functions...
+            Date value = (Date) s.find("select sysdate from Simple as s where nvl(cast(null as date), sysdate)=sysdate" ).get(0);
+            assertTrue( value.equals(new java.sql.Date(System.currentTimeMillis())));
+        }
+        */
+
+        s.delete(simple);
+		t.commit();
+		s.close();
+	}
+
+	public void testSetProperties() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Simple simple = new Simple();
+		simple.setName("Simple 1");
+		s.save(simple, new Long(10) );
+		Query q = s.createQuery("from Simple s where s.name=:name and s.count=:count");
+		q.setProperties(simple);
+		assertTrue( q.list().get(0)==simple );
+		//misuse of "Single" as a propertyobject, but it was the first testclass i found with a collection ;)
+		Single single = new Single() { // trivial hack to test properties with arrays.
+			String[] getStuff() { return (String[]) getSeveral().toArray(new String[getSeveral().size()]); }
+		};
+
+		List l = new ArrayList();
+		l.add("Simple 1");
+		l.add("Slimeball");
+		single.setSeveral(l);
+		q = s.createQuery("from Simple s where s.name in (:several)");
+		q.setProperties(single);
+		assertTrue( q.list().get(0)==simple );
+
+
+		q = s.createQuery("from Simple s where s.name in (:stuff)");
+		q.setProperties(single);
+		assertTrue( q.list().get(0)==simple );
+		s.delete(simple);
+		t.commit();
+		s.close();
+	}
+
+	public void testBroken() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Broken b = new Fixed();
+		b.setId( new Long(123));
+		b.setOtherId("foobar");
+		s.save(b);
+		s.flush();
+		b.setTimestamp( new Date() );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.update(b);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		b = (Broken) s.load( Broken.class, b );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete(b);
+		t.commit();
+		s.close();
+	}
+
+	public void testNothinToUpdate() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Simple simple = new Simple();
+		simple.setName("Simple 1");
+		s.save( simple, new Long(10) );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.update( simple, new Long(10) );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.update( simple, new Long(10) );
+		s.delete(simple);
+		t.commit();
+		s.close();
+	}
+
+	public void testCachedQuery() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Simple simple = new Simple();
+		simple.setName("Simple 1");
+		s.save( simple, new Long(10) );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Query q = s.createQuery("from Simple s where s.name=?");
+		q.setCacheable(true);
+		q.setString(0, "Simple 1");
+		assertTrue( q.list().size()==1 );
+		assertTrue( q.list().size()==1 );
+		assertTrue( q.list().size()==1 );
+		q = s.createQuery("from Simple s where s.name=:name");
+		q.setCacheable(true);
+		q.setString("name", "Simple 1");
+		assertTrue( q.list().size()==1 );
+		simple = (Simple) q.list().get(0);
+
+		q.setString("name", "Simple 2");
+		assertTrue( q.list().size()==0 );
+		assertTrue( q.list().size()==0 );
+		simple.setName("Simple 2");
+		assertTrue( q.list().size()==1 );
+		assertTrue( q.list().size()==1 );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		q = s.createQuery("from Simple s where s.name=:name");
+		q.setString("name", "Simple 2");
+		q.setCacheable(true);
+		assertTrue( q.list().size()==1 );
+		assertTrue( q.list().size()==1 );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.update( simple, new Long(10) );
+		s.delete(simple);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		q = s.createQuery("from Simple s where s.name=?");
+		q.setCacheable(true);
+		q.setString(0, "Simple 1");
+		assertTrue( q.list().size()==0 );
+		assertTrue( q.list().size()==0 );
+		t.commit();
+		s.close();
+	}
+
+	public void testCachedQueryRegion() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Simple simple = new Simple();
+		simple.setName("Simple 1");
+		s.save( simple, new Long(10) );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Query q = s.createQuery("from Simple s where s.name=?");
+		q.setCacheRegion("foo");
+		q.setCacheable(true);
+		q.setString(0, "Simple 1");
+		assertTrue( q.list().size()==1 );
+		assertTrue( q.list().size()==1 );
+		assertTrue( q.list().size()==1 );
+		q = s.createQuery("from Simple s where s.name=:name");
+		q.setCacheRegion("foo");
+		q.setCacheable(true);
+		q.setString("name", "Simple 1");
+		assertTrue( q.list().size()==1 );
+		simple = (Simple) q.list().get(0);
+
+		q.setString("name", "Simple 2");
+		assertTrue( q.list().size()==0 );
+		assertTrue( q.list().size()==0 );
+		simple.setName("Simple 2");
+		assertTrue( q.list().size()==1 );
+		assertTrue( q.list().size()==1 );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.update( simple, new Long(10) );
+		s.delete(simple);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		q = s.createQuery("from Simple s where s.name=?");
+		q.setCacheRegion("foo");
+		q.setCacheable(true);
+		q.setString(0, "Simple 1");
+		assertTrue( q.list().size()==0 );
+		assertTrue( q.list().size()==0 );
+		t.commit();
+		s.close();
+	}
+
+	public void testSQLFunctions() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Simple simple = new Simple();
+		simple.setName("Simple 1");
+		s.save(simple, new Long(10) );
+
+		if ( getDialect() instanceof Cache71Dialect) {
+			s.createQuery( "from Simple s where repeat('foo', 3) = 'foofoofoo'" ).list();
+			s.createQuery( "from Simple s where repeat(s.name, 3) = 'foofoofoo'" ).list();
+			s.createQuery( "from Simple s where repeat( lower(s.name), (3 + (1-1)) / 2) = 'foofoofoo'" ).list();
+		}
+
+		assertTrue(
+				s.createQuery( "from Simple s where upper( s.name ) ='SIMPLE 1'" ).list().size()==1
+		);
+		if ( !(getDialect() instanceof HSQLDialect) ) {
+			assertTrue(
+					s.createQuery(
+							"from Simple s where not( upper( s.name ) ='yada' or 1=2 or 'foo'='bar' or not('foo'='foo') or 'foo' like 'bar' )"
+					).list()
+							.size()==1
+			);
+		}
+		if ( !(getDialect() instanceof MySQLDialect) && !(getDialect() instanceof SybaseDialect) && !(getDialect() instanceof MckoiDialect) && !(getDialect() instanceof InterbaseDialect) && !(getDialect() instanceof TimesTenDialect) ) { //My SQL has a funny concatenation operator
+			assertTrue(
+					s.createQuery( "from Simple s where lower( s.name || ' foo' ) ='simple 1 foo'" ).list().size()==1
+			);
+		}
+        /* + is not concat in Cache
+        if ( (getDialect() instanceof Cache71Dialect) ) {
+			assertTrue(
+				s.find("from Simple s where lower( cons.name ' foo' ) ='simple 1 foo'").size()==1
+			);
+		}
+		*/
+		if ( (getDialect() instanceof Cache71Dialect) ) {
+			assertTrue(
+					s.createQuery( "from Simple s where lower( concat(s.name, ' foo') ) ='simple 1 foo'" ).list().size()==1
+			);
+		}
+
+		Simple other = new Simple();
+		other.setName("Simple 2");
+		other.setCount(12);
+		simple.setOther(other);
+		s.save( other, new Long(20) );
+		//s.find("from Simple s where s.name ## 'cat|rat|bag'");
+		assertTrue(
+				s.createQuery( "from Simple s where upper( s.other.name ) ='SIMPLE 2'" ).list().size()==1
+		);
+		assertTrue(
+				s.createQuery( "from Simple s where not ( upper( s.other.name ) ='SIMPLE 2' )" ).list().size()==0
+		);
+		assertTrue(
+				s.createQuery(
+						"select distinct s from Simple s where ( ( s.other.count + 3 ) = (15*2)/2 and s.count = 69) or ( ( s.other.count + 2 ) / 7 ) = 2"
+				).list()
+						.size()==1
+		);
+		assertTrue(
+				s.createQuery(
+						"select s from Simple s where ( ( s.other.count + 3 ) = (15*2)/2 and s.count = 69) or ( ( s.other.count + 2 ) / 7 ) = 2 order by s.other.count"
+				).list()
+						.size()==1
+		);
+		Simple min = new Simple();
+		min.setCount(-1);
+		s.save(min, new Long(30) );
+		if ( ! (getDialect() instanceof MySQLDialect) && ! (getDialect() instanceof HSQLDialect) ) { //My SQL has no subqueries
+			assertTrue(
+					s.createQuery( "from Simple s where s.count > ( select min(sim.count) from Simple sim )" )
+							.list()
+							.size()==2
+			);
+			t.commit();
+			t = s.beginTransaction();
+			assertTrue(
+					s.createQuery(
+							"from Simple s where s = some( select sim from Simple sim where sim.count>=0 ) and s.count >= 0"
+					).list()
+							.size()==2
+			);
+			assertTrue(
+					s.createQuery(
+							"from Simple s where s = some( select sim from Simple sim where sim.other.count=s.other.count ) and s.other.count > 0"
+					).list()
+							.size()==1
+			);
+		}
+
+		Iterator iter = s.createQuery( "select sum(s.count) from Simple s group by s.count having sum(s.count) > 10" )
+				.iterate();
+		assertTrue( iter.hasNext() );
+		assertEquals( new Long(12), iter.next() );
+		assertTrue( !iter.hasNext() );
+		if ( ! (getDialect() instanceof MySQLDialect) ) {
+			iter = s.createQuery( "select s.count from Simple s group by s.count having s.count = 12" ).iterate();
+			assertTrue( iter.hasNext() );
+		}
+
+		s.createQuery(
+				"select s.id, s.count, count(t), max(t.date) from Simple s, Simple t where s.count = t.count group by s.id, s.count order by s.count"
+		).iterate();
+
+		Query q = s.createQuery("from Simple s");
+		q.setMaxResults(10);
+		assertTrue( q.list().size()==3 );
+		q = s.createQuery("from Simple s");
+		q.setMaxResults(1);
+		assertTrue( q.list().size()==1 );
+		q = s.createQuery("from Simple s");
+		assertTrue( q.list().size()==3 );
+		q = s.createQuery("from Simple s where s.name = ?");
+		q.setString(0, "Simple 1");
+		assertTrue( q.list().size()==1 );
+		q = s.createQuery("from Simple s where s.name = ? and upper(s.name) = ?");
+		q.setString(1, "SIMPLE 1");
+		q.setString(0, "Simple 1");
+		q.setFirstResult(0);
+		assertTrue( q.iterate().hasNext() );
+		q = s.createQuery("from Simple s where s.name = :foo and upper(s.name) = :bar or s.count=:count or s.count=:count + 1");
+		q.setParameter("bar", "SIMPLE 1");
+		q.setString("foo", "Simple 1");
+		q.setInteger("count", 69);
+		q.setFirstResult(0);
+		assertTrue( q.iterate().hasNext() );
+		q = s.createQuery("select s.id from Simple s");
+		q.setFirstResult(1);
+		q.setMaxResults(2);
+		iter = q.iterate();
+		int i=0;
+		while ( iter.hasNext() ) {
+			assertTrue( iter.next() instanceof Long );
+			i++;
+		}
+		assertTrue(i==2);
+		q = s.createQuery("select all s, s.other from Simple s where s = :s");
+		q.setParameter("s", simple);
+		assertTrue( q.list().size()==1 );
+
+
+		q = s.createQuery("from Simple s where s.name in (:name_list) and s.count > :count");
+		HashSet set = new HashSet();
+		set.add("Simple 1"); set.add("foo");
+		q.setParameterList( "name_list", set );
+		q.setParameter("count", new Integer(-1) );
+		assertTrue( q.list().size()==1 );
+
+		ScrollableResults sr = s.createQuery("from Simple s").scroll();
+		sr.next();
+		sr.get(0);
+		sr.close();
+
+		s.delete(other);
+		s.delete(simple);
+		s.delete(min);
+		t.commit();
+		s.close();
+
+	}
+
+	public void testBlobClob() throws Exception {
+
+		Session s = openSession();
+		s.beginTransaction();
+		Blobber b = new Blobber();
+		b.setBlob( s.getLobHelper().createBlob( "foo/bar/baz".getBytes() ) );
+		b.setClob( s.getLobHelper().createClob("foo/bar/baz") );
+		s.save(b);
+		//s.refresh(b);
+		//assertTrue( b.getClob() instanceof ClobImpl );
+		s.flush();
+		s.refresh(b);
+		//b.getBlob().setBytes( 2, "abc".getBytes() );
+        log.debug("levinson: just bfore b.getClob()");
+        b.getClob().getSubString(2, 3);
+		//b.getClob().setString(2, "abc");
+		s.flush();
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		b = (Blobber) s.load( Blobber.class, new Integer( b.getId() ) );
+		Blobber b2 = new Blobber();
+		s.save(b2);
+		b2.setBlob( b.getBlob() );
+		b.setBlob(null);
+		//assertTrue( b.getClob().getSubString(1, 3).equals("fab") );
+		b.getClob().getSubString(1, 6);
+		//b.getClob().setString(1, "qwerty");
+		s.flush();
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		b = (Blobber) s.load( Blobber.class, new Integer( b.getId() ) );
+		b.setClob( s.getLobHelper().createClob("xcvfxvc xcvbx cvbx cvbx cvbxcvbxcvbxcvb") );
+		s.flush();
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		b = (Blobber) s.load( Blobber.class, new Integer( b.getId() ) );
+		assertTrue( b.getClob().getSubString(1, 7).equals("xcvfxvc") );
+		//b.getClob().setString(5, "1234567890");
+		s.flush();
+		s.getTransaction().commit();
+		s.close();
+
+
+		/*InputStream is = getClass().getClassLoader().getResourceAsStream("jdbc20.pdf");
+		s = sessionsopenSession();
+		b = (Blobber) s.load( Blobber.class, new Integer( b.getId() ) );
+		System.out.println( is.available() );
+		int size = is.available();
+		b.setBlob( Hibernate.createBlob( is, is.available() ) );
+		s.flush();
+		s.connection().commit();
+		ResultSet rs = s.connection().createStatement().executeQuery("select datalength(blob_) from blobber where id=" + b.getId() );
+		rs.next();
+		assertTrue( size==rs.getInt(1) );
+		rs.close();
+		s.close();
+
+		s = sessionsopenSession();
+		b = (Blobber) s.load( Blobber.class, new Integer( b.getId() ) );
+		File f = new File("C:/foo.pdf");
+		f.createNewFile();
+		FileOutputStream fos = new FileOutputStream(f);
+		Blob blob = b.getBlob();
+		byte[] bytes = blob.getBytes( 1, (int) blob.length() );
+		System.out.println( bytes.length );
+		fos.write(bytes);
+		fos.flush();
+		fos.close();
+		s.close();*/
+
+	}
+
+	public void testSqlFunctionAsAlias() throws Exception {
+		String functionName = locateAppropriateDialectFunctionNameForAliasTest();
+		if (functionName == null) {
+			log.info("Dialect does not list any no-arg functions");
+			return;
+		}
+
+		log.info("Using function named [" + functionName + "] for 'function as alias' test");
+		String query = "select " + functionName + " from Simple as " + functionName + " where " + functionName + ".id = 10";
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Simple simple = new Simple();
+		simple.setName("Simple 1");
+		s.save( simple, new Long(10) );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		List result = s.createQuery( query ).list();
+		assertTrue( result.size() == 1 );
+		assertTrue(result.get(0) instanceof Simple);
+		s.delete( result.get(0) );
+		t.commit();
+		s.close();
+	}
+
+	private String locateAppropriateDialectFunctionNameForAliasTest() {
+		for (Iterator itr = getDialect().getFunctions().entrySet().iterator(); itr.hasNext(); ) {
+			final Map.Entry entry = (Map.Entry) itr.next();
+			final SQLFunction function = (SQLFunction) entry.getValue();
+			if ( !function.hasArguments() && !function.hasParenthesesIfNoArguments() ) {
+				return (String) entry.getKey();
+			}
+		}
+		return null;
+	}
+
+	public void testCachedQueryOnInsert() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Simple simple = new Simple();
+		simple.setName("Simple 1");
+		s.save( simple, new Long(10) );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Query q = s.createQuery("from Simple s");
+		List list = q.setCacheable(true).list();
+		assertTrue( list.size()==1 );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		q = s.createQuery("from Simple s");
+		list = q.setCacheable(true).list();
+		assertTrue( list.size()==1 );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Simple simple2 = new Simple();
+		simple2.setCount(133);
+		s.save( simple2, new Long(12) );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		q = s.createQuery("from Simple s");
+		list = q.setCacheable(true).list();
+		assertTrue( list.size()==2 );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		q = s.createQuery("from Simple s");
+		list = q.setCacheable(true).list();
+		assertTrue( list.size()==2 );
+		Iterator i = list.iterator();
+		while ( i.hasNext() ) s.delete( i.next() );
+		t.commit();
+		s.close();
+
+	}
+
+    public void testInterSystemsFunctions() throws Exception {
+        Calendar cal = new GregorianCalendar();
+        cal.set(1977,6,3,0,0,0);
+        java.sql.Timestamp testvalue = new java.sql.Timestamp(cal.getTimeInMillis());
+        testvalue.setNanos(0);
+        Calendar cal3 = new GregorianCalendar();
+        cal3.set(1976,2,3,0,0,0);
+        java.sql.Timestamp testvalue3 = new java.sql.Timestamp(cal3.getTimeInMillis());
+        testvalue3.setNanos(0);
+
+        Session s = openSession();
+        Transaction t = s.beginTransaction();
+        try {
+            Statement stmt = s.connection().createStatement();
+            stmt.executeUpdate("DROP FUNCTION spLock FROM TestInterSystemsFunctionsClass");
+            t.commit();
+        }
+        catch (Exception ex) {
+            System.out.println("as we expected stored procedure sp does not exist when we drop it");
+
+        }
+        t = s.beginTransaction();
+        Statement stmt = s.connection().createStatement();
+        String create_function = "CREATE FUNCTION SQLUser.TestInterSystemsFunctionsClass_spLock\n" +
+                "     ( INOUT pHandle %SQLProcContext, \n" +
+                "       ROWID INTEGER \n" +
+                " )\n" +
+                " FOR User.TestInterSystemsFunctionsClass " +
+                "    PROCEDURE\n" +
+                "    RETURNS INTEGER\n" +
+                "    LANGUAGE OBJECTSCRIPT\n" +
+                "    {\n" +
+                "        q 0\n" +
+                "     }";
+        stmt.executeUpdate(create_function);
+        t.commit();
+        t = s.beginTransaction();
+
+        TestInterSystemsFunctionsClass object = new TestInterSystemsFunctionsClass();
+        object.setDateText("1977-07-03");
+        object.setDate1(testvalue);
+        object.setDate3(testvalue3);
+        s.save( object, new Long(10));
+        t.commit();
+        s.close();
+        s = openSession();
+        s.clear();
+        t = s.beginTransaction();
+        TestInterSystemsFunctionsClass test = (TestInterSystemsFunctionsClass) s.get(TestInterSystemsFunctionsClass.class, new Long(10));
+        assertTrue( test.getDate1().equals(testvalue));
+        test = (TestInterSystemsFunctionsClass) s.get(TestInterSystemsFunctionsClass.class, new Long(10), LockMode.UPGRADE);
+        assertTrue( test.getDate1().equals(testvalue));
+        Date value = (Date) s.createQuery( "select nvl(o.date,o.dateText) from TestInterSystemsFunctionsClass as o" )
+				.list()
+				.get(0);
+        assertTrue( value.equals(testvalue));
+        Object nv = s.createQuery( "select nullif(o.dateText,o.dateText) from TestInterSystemsFunctionsClass as o" )
+				.list()
+				.get(0);
+        assertTrue( nv == null);
+        String dateText = (String) s.createQuery(
+				"select nvl(o.dateText,o.date) from TestInterSystemsFunctionsClass as o"
+		).list()
+				.get(0);
+        assertTrue( dateText.equals("1977-07-03"));
+        value = (Date) s.createQuery( "select ifnull(o.date,o.date1) from TestInterSystemsFunctionsClass as o" )
+				.list()
+				.get(0);
+        assertTrue( value.equals(testvalue));
+        value = (Date) s.createQuery( "select ifnull(o.date3,o.date,o.date1) from TestInterSystemsFunctionsClass as o" )
+				.list()
+				.get(0);
+        assertTrue( value.equals(testvalue));
+        Integer pos = (Integer) s.createQuery(
+				"select position('07', o.dateText) from TestInterSystemsFunctionsClass as o"
+		).list()
+				.get(0);
+        assertTrue(pos.intValue() == 6);
+        String st = (String) s.createQuery( "select convert(o.date1, SQL_TIME) from TestInterSystemsFunctionsClass as o" )
+				.list()
+				.get(0);
+        assertTrue( st.equals("00:00:00"));
+        java.sql.Time tm = (java.sql.Time) s.createQuery(
+				"select cast(o.date1, time) from TestInterSystemsFunctionsClass as o"
+		).list()
+				.get(0);
+        assertTrue( tm.toString().equals("00:00:00"));
+        Double diff = (Double) s.createQuery(
+				"select timestampdiff(SQL_TSI_FRAC_SECOND, o.date3, o.date1) from TestInterSystemsFunctionsClass as o"
+		).list()
+				.get(0);
+        assertTrue(diff.doubleValue() != 0.0);
+        diff = (Double) s.createQuery(
+				"select timestampdiff(SQL_TSI_MONTH, o.date3, o.date1) from TestInterSystemsFunctionsClass as o"
+		).list()
+				.get(0);
+        assertTrue(diff.doubleValue() == 16.0);
+        diff = (Double) s.createQuery(
+				"select timestampdiff(SQL_TSI_WEEK, o.date3, o.date1) from TestInterSystemsFunctionsClass as o"
+		).list()
+				.get(0);
+        assertTrue(diff.doubleValue() >= 16*4);
+        diff = (Double) s.createQuery(
+				"select timestampdiff(SQL_TSI_YEAR, o.date3, o.date1) from TestInterSystemsFunctionsClass as o"
+		).list()
+				.get(0);
+        assertTrue(diff.doubleValue() == 1.0);
+
+        t.commit();
+        s.close();
+
+
+    }
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/functional/cache/SQLFunctionsInterSystemsTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/functional/cache/TestInterSystemsFunctionsClass.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/functional/cache/TestInterSystemsFunctionsClass.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/functional/cache/TestInterSystemsFunctionsClass.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.dialect.functional.cache" >
+
+    <class name="TestInterSystemsFunctionsClass" table="SQLUser.TestInterSystemsFunctionsClass">
+        <id type="long" column="id_">
+            <generator class="assigned"/>
+        </id>
+        <property name="date" column="date_"/>
+        <property name="date1" column="date1_"/>
+        <property name="date3" column="date3_"/>
+        <property name="dateText" column="dateText_"/>
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/functional/cache/TestInterSystemsFunctionsClass.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/functional/cache/TestInterSystemsFunctionsClass.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/functional/cache/TestInterSystemsFunctionsClass.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/functional/cache/TestInterSystemsFunctionsClass.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,51 @@
+package org.hibernate.test.dialect.functional.cache;
+
+import java.util.Date;
+
+/**
+ * Entity for testing function support of InterSystems' CacheSQL...
+ *
+ * @author Jonathan Levinson
+ */
+public class TestInterSystemsFunctionsClass {
+    private java.util.Date date3;
+    private java.util.Date date1;
+    private java.util.Date date;
+    private String dateText;
+
+	public Date getDate() {
+        return date;
+    }
+
+    public void setDate(Date date) {
+        this.date = date;
+    }
+
+
+    public String getDateText() {
+        return dateText;
+    }
+
+    public void setDateText(String dateText) {
+        this.dateText = dateText;
+    }
+
+
+    public Date getDate1() {
+        return date1;
+    }
+
+    public void setDate1(Date date1) {
+        this.date1 = date1;
+    }
+
+
+    public Date getDate3() {
+        return date3;
+    }
+
+    public void setDate3(Date date3) {
+        this.date3 = date3;
+    }
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/functional/cache/TestInterSystemsFunctionsClass.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/unit/lockhint/AbstractLockHintTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/unit/lockhint/AbstractLockHintTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/unit/lockhint/AbstractLockHintTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,64 @@
+package org.hibernate.test.dialect.unit.lockhint;
+
+import java.util.Collections;
+
+import org.hibernate.testing.junit.UnitTestCase;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.util.StringHelper;
+import org.hibernate.LockMode;
+import org.hibernate.LockOptions;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public abstract class AbstractLockHintTest extends UnitTestCase {
+	public AbstractLockHintTest(String string) {
+		super( string );
+	}
+
+	private Dialect dialect;
+
+	protected abstract String getLockHintUsed();
+	protected abstract Dialect getDialectUnderTest();
+
+	protected void setUp() throws Exception {
+		super.setUp();
+		this.dialect = getDialectUnderTest();
+	}
+
+	protected void tearDown() throws Exception {
+		this.dialect = null;
+		super.tearDown();
+	}
+
+	public void testBasicLocking() {
+		new SyntaxChecker( "select xyz from ABC $HOLDER$", "a" ).verify();
+		new SyntaxChecker( "select xyz from ABC $HOLDER$ join DEF d", "a" ).verify();
+		new SyntaxChecker( "select xyz from ABC $HOLDER$, DEF d", "a" ).verify();
+	}
+
+	protected class SyntaxChecker {
+		private final String aliasToLock;
+		private final String rawSql;
+		private final String expectedProcessedSql;
+
+		public SyntaxChecker(String template) {
+			this( template, "" );
+		}
+
+		public SyntaxChecker(String template, String aliasToLock) {
+			this.aliasToLock = aliasToLock;
+			rawSql = StringHelper.replace( template, "$HOLDER$", aliasToLock );
+			expectedProcessedSql = StringHelper.replace( template, "$HOLDER$", aliasToLock + " " + getLockHintUsed() );
+		}
+
+		public void verify() {
+			LockOptions lockOptions = new LockOptions(LockMode.UPGRADE);
+			lockOptions.setAliasSpecificLockMode( aliasToLock, LockMode.UPGRADE );
+			String actualProcessedSql = dialect.applyLocksToSql( rawSql, lockOptions, Collections.EMPTY_MAP );
+			assertEquals( expectedProcessedSql, actualProcessedSql );
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/unit/lockhint/AbstractLockHintTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/unit/lockhint/SQLServerLockHintsTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/unit/lockhint/SQLServerLockHintsTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/unit/lockhint/SQLServerLockHintsTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,31 @@
+package org.hibernate.test.dialect.unit.lockhint;
+
+import junit.framework.TestSuite;
+
+import org.hibernate.dialect.Dialect;
+import org.hibernate.dialect.SQLServerDialect;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class SQLServerLockHintsTest extends AbstractLockHintTest {
+	public static final Dialect DIALECT = new SQLServerDialect();
+
+	public SQLServerLockHintsTest(String string) {
+		super( string );
+	}
+
+	protected String getLockHintUsed() {
+		return "with (updlock, rowlock)";
+	}
+
+	protected Dialect getDialectUnderTest() {
+		return DIALECT;
+	}
+
+	public static TestSuite suite() {
+		return new TestSuite( SQLServerLockHintsTest.class );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/unit/lockhint/SQLServerLockHintsTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/unit/lockhint/SybaseASE15LockHintsTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/unit/lockhint/SybaseASE15LockHintsTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/unit/lockhint/SybaseASE15LockHintsTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,56 @@
+//$Id $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.dialect.unit.lockhint;
+
+import junit.framework.TestSuite;
+
+import org.hibernate.dialect.Dialect;
+import org.hibernate.dialect.SybaseASE15Dialect;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Gail Badner
+ */
+public class SybaseASE15LockHintsTest extends AbstractLockHintTest {
+	public static final Dialect DIALECT = new SybaseASE15Dialect();
+
+	public SybaseASE15LockHintsTest(String string) {
+		super( string );
+	}
+
+	protected String getLockHintUsed() {
+		return "holdlock";
+	}
+
+	protected Dialect getDialectUnderTest() {
+		return DIALECT;
+	}
+
+	public static TestSuite suite() {
+		return new TestSuite( SybaseASE15LockHintsTest.class );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/unit/lockhint/SybaseASE15LockHintsTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/unit/lockhint/SybaseLockHintsTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/unit/lockhint/SybaseLockHintsTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/unit/lockhint/SybaseLockHintsTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,31 @@
+package org.hibernate.test.dialect.unit.lockhint;
+
+import junit.framework.TestSuite;
+
+import org.hibernate.dialect.Dialect;
+import org.hibernate.dialect.SybaseDialect;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class SybaseLockHintsTest extends AbstractLockHintTest {
+	public static final Dialect DIALECT = new SybaseDialect();
+
+	public SybaseLockHintsTest(String string) {
+		super( string );
+	}
+
+	protected String getLockHintUsed() {
+		return "holdlock";
+	}
+
+	protected Dialect getDialectUnderTest() {
+		return DIALECT;
+	}
+
+	public static TestSuite suite() {
+		return new TestSuite( SybaseLockHintsTest.class );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dialect/unit/lockhint/SybaseLockHintsTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/discriminator/Address.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/discriminator/Address.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/discriminator/Address.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,11 @@
+//$Id: Address.java 4373 2004-08-18 09:18:34Z oneovthafew $
+package org.hibernate.test.discriminator;
+
+/**
+ * @author Gavin King
+ */
+public class Address {
+	public String address;
+	public String zip;
+	public String country;
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/discriminator/Address.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/discriminator/Customer.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/discriminator/Customer.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/discriminator/Customer.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,35 @@
+//$Id: Customer.java 4373 2004-08-18 09:18:34Z oneovthafew $
+package org.hibernate.test.discriminator;
+
+/**
+ * @author Gavin King
+ */
+public class Customer extends Person {
+	private Employee salesperson;
+	private String comments;
+
+	/**
+	 * @return Returns the salesperson.
+	 */
+	public Employee getSalesperson() {
+		return salesperson;
+	}
+	/**
+	 * @param salesperson The salesperson to set.
+	 */
+	public void setSalesperson(Employee salesperson) {
+		this.salesperson = salesperson;
+	}
+	/**
+	 * @return Returns the comments.
+	 */
+	public String getComments() {
+		return comments;
+	}
+	/**
+	 * @param comments The comments to set.
+	 */
+	public void setComments(String comments) {
+		this.comments = comments;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/discriminator/Customer.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/discriminator/DiscriminatorTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/discriminator/DiscriminatorTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/discriminator/DiscriminatorTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,254 @@
+//$Id: DiscriminatorTest.java 10976 2006-12-12 23:22:26Z steve.ebersole at jboss.com $
+package org.hibernate.test.discriminator;
+
+import java.math.BigDecimal;
+import java.util.Iterator;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.proxy.HibernateProxy;
+import org.hibernate.criterion.Property;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class DiscriminatorTest extends FunctionalTestCase {
+
+	public DiscriminatorTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "discriminator/Person.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( DiscriminatorTest.class );
+	}
+
+	public void testDiscriminatorSubclass() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Employee mark = new Employee();
+		mark.setName("Mark");
+		mark.setTitle("internal sales");
+		mark.setSex('M');
+		mark.setAddress("buckhead");
+		mark.setZip("30305");
+		mark.setCountry("USA");
+
+		Customer joe = new Customer();
+		joe.setName("Joe");
+		joe.setAddress("San Francisco");
+		joe.setZip("XXXXX");
+		joe.setCountry("USA");
+		joe.setComments("Very demanding");
+		joe.setSex('M');
+		joe.setSalesperson(mark);
+
+		Person yomomma = new Person();
+		yomomma.setName("mum");
+		yomomma.setSex('F');
+
+		s.save(yomomma);
+		s.save(mark);
+		s.save(joe);
+
+		assertEquals( s.createQuery("from java.io.Serializable").list().size(), 0 );
+
+		assertEquals( s.createQuery("from Person").list().size(), 3 );
+		assertEquals( s.createQuery("from Person p where p.class = Person").list().size(), 1 );
+		assertEquals( s.createQuery("from Person p where p.class = Customer").list().size(), 1 );
+		s.clear();
+
+		List customers = s.createQuery("from Customer c left join fetch c.salesperson").list();
+		for ( Iterator iter = customers.iterator(); iter.hasNext(); ) {
+			Customer c = (Customer) iter.next();
+			assertTrue( Hibernate.isInitialized( c.getSalesperson() ) );
+			assertEquals( c.getSalesperson().getName(), "Mark" );
+		}
+		assertEquals( customers.size(), 1 );
+		s.clear();
+
+		customers = s.createQuery("from Customer").list();
+		for ( Iterator iter = customers.iterator(); iter.hasNext(); ) {
+			Customer c = (Customer) iter.next();
+			assertFalse( Hibernate.isInitialized( c.getSalesperson() ) );
+			assertEquals( c.getSalesperson().getName(), "Mark" );
+		}
+		assertEquals( customers.size(), 1 );
+		s.clear();
+
+
+		mark = (Employee) s.get( Employee.class, new Long( mark.getId() ) );
+		joe = (Customer) s.get( Customer.class, new Long( joe.getId() ) );
+
+ 		mark.setZip("30306");
+		assertEquals( s.createQuery("from Person p where p.address.zip = '30306'").list().size(), 1 );
+		s.delete(mark);
+		s.delete(joe);
+		s.delete(yomomma);
+		assertTrue( s.createQuery("from Person").list().isEmpty() );
+		t.commit();
+		s.close();
+	}
+
+	public void testAccessAsIncorrectSubclass() {
+		Session s = openSession();
+		s.beginTransaction();
+		Employee e = new Employee();
+		e.setName( "Steve" );
+		e.setSex( 'M' );
+		e.setTitle( "grand poobah" );
+		s.save( e );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		Customer c = ( Customer ) s.get( Customer.class, new Long( e.getId() ) );
+		s.getTransaction().commit();
+		s.close();
+		assertNull( c );
+
+		s = openSession();
+		s.beginTransaction();
+		e = ( Employee ) s.get( Employee.class, new Long( e.getId() ) );
+		c = ( Customer ) s.get( Customer.class, new Long( e.getId() ) );
+		s.getTransaction().commit();
+		s.close();
+		assertNotNull( e );
+		assertNull( c );
+
+		s = openSession();
+		s.beginTransaction();
+		s.delete( e );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testQuerySubclassAttribute() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Person p = new Person();
+		p.setName("Emmanuel");
+		p.setSex('M');
+		s.persist(p);
+		Employee q = new Employee();
+		q.setName("Steve");
+		q.setSex('M');
+		q.setTitle("Mr");
+		q.setSalary( new BigDecimal(1000) );
+		s.persist(q);
+
+		List result = s.createQuery("from Person where salary > 100").list();
+		assertEquals( result.size(), 1 );
+		assertSame( result.get(0), q );
+
+		result = s.createQuery("from Person where salary > 100 or name like 'E%'").list();
+		assertEquals( result.size(), 2 );
+
+		result = s.createCriteria(Person.class)
+			.add( Property.forName("salary").gt( new BigDecimal(100) ) )
+			.list();
+		assertEquals( result.size(), 1 );
+		assertSame( result.get(0), q );
+
+		//TODO: make this work:
+		/*result = s.createQuery("select salary from Person where salary > 100").list();
+		assertEquals( result.size(), 1 );
+		assertEquals( result.get(0), new BigDecimal(1000) );*/
+
+		s.delete(p);
+		s.delete(q);
+		t.commit();
+		s.close();
+	}
+
+	public void testLoadSuperclassProxyPolymorphicAccess() {
+		Session s = openSession();
+		s.beginTransaction();
+		Employee e = new Employee();
+		e.setName( "Steve" );
+		e.setSex( 'M' );
+		e.setTitle( "grand poobah" );
+		s.save( e );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		// load the superclass proxy.
+		Person pLoad = ( Person ) s.load( Person.class, new Long( e.getId() ) );
+		assertTrue( pLoad instanceof HibernateProxy);
+		Person pGet = ( Person ) s.get( Person.class, new Long( e.getId() ));
+		Person pQuery = ( Person ) s.createQuery( "from Person where id = :id" )
+				.setLong( "id", e.getId() )
+				.uniqueResult();
+		Person pCriteria = ( Person ) s.createCriteria( Person.class )
+				.add( Restrictions.idEq( new Long( e.getId() ) ) )
+				.uniqueResult();
+		// assert that executing the queries polymorphically returns the same proxy
+		assertSame( pLoad, pGet );
+		assertSame( pLoad, pQuery );
+		assertSame( pLoad, pCriteria );
+
+		// assert that the proxy is not an instance of Employee
+		assertFalse( pLoad instanceof Employee );
+
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.delete( e );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testLoadSuperclassProxyEvictPolymorphicAccess() {
+		Session s = openSession();
+		s.beginTransaction();
+		Employee e = new Employee();
+		e.setName( "Steve" );
+		e.setSex( 'M' );
+		e.setTitle( "grand poobah" );
+		s.save( e );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		// load the superclass proxy.
+		Person pLoad = ( Person ) s.load( Person.class, new Long( e.getId() ) );
+		assertTrue( pLoad instanceof HibernateProxy);
+		// evict the proxy
+		s.evict( pLoad );
+		Employee pGet = ( Employee ) s.get( Person.class, new Long( e.getId() ));
+		Employee pQuery = ( Employee ) s.createQuery( "from Person where id = :id" )
+				.setLong( "id", e.getId() )
+				.uniqueResult();
+		Employee pCriteria = ( Employee ) s.createCriteria( Person.class )
+				.add( Restrictions.idEq( new Long( e.getId() ) ) )
+				.uniqueResult();
+		// assert that executing the queries polymorphically returns the same Employee instance
+		assertSame( pGet, pQuery );
+		assertSame( pGet, pCriteria );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.delete( e );
+		s.getTransaction().commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/discriminator/DiscriminatorTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/discriminator/Employee.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/discriminator/Employee.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/discriminator/Employee.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,49 @@
+//$Id: Employee.java 4373 2004-08-18 09:18:34Z oneovthafew $
+package org.hibernate.test.discriminator;
+
+import java.math.BigDecimal;
+
+/**
+ * @author Gavin King
+ */
+public class Employee extends Person {
+	private String title;
+	private BigDecimal salary;
+	private Employee manager;
+	/**
+	 * @return Returns the title.
+	 */
+	public String getTitle() {
+		return title;
+	}
+	/**
+	 * @param title The title to set.
+	 */
+	public void setTitle(String title) {
+		this.title = title;
+	}
+	/**
+	 * @return Returns the manager.
+	 */
+	public Employee getManager() {
+		return manager;
+	}
+	/**
+	 * @param manager The manager to set.
+	 */
+	public void setManager(Employee manager) {
+		this.manager = manager;
+	}
+	/**
+	 * @return Returns the salary.
+	 */
+	public BigDecimal getSalary() {
+		return salary;
+	}
+	/**
+	 * @param salary The salary to set.
+	 */
+	public void setSalary(BigDecimal salary) {
+		this.salary = salary;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/discriminator/Employee.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/discriminator/Person.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/discriminator/Person.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/discriminator/Person.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,64 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+  This mapping demonstrates content-based discrimination for the
+  table-per-hierarchy mapping strategy, using a formula
+  discriminator.
+
+-->
+
+<hibernate-mapping 
+	package="org.hibernate.test.discriminator"
+	default-access="field">
+	
+	<class name="Person"
+		discriminator-value="P">
+		
+		<id name="id" 
+			column="person_id" 
+			unsaved-value="0">
+			<generator class="native"/>
+		</id>
+		
+				
+		<discriminator 
+			type="character"
+			formula="case when `title` is not null then 'E' when salesperson is not null then 'C' else 'P' end"/>
+
+		<property name="name" 
+			not-null="true"
+			length="80"/>
+			
+		<property name="sex" 
+			not-null="true"
+			update="false"/>
+		
+		<component name="address">
+			<property name="address"/>
+			<property name="zip"/>
+			<property name="country"/>
+		</component>
+		
+		<subclass name="Employee" 
+			discriminator-value="E">
+				<property name="title" column="`title`"
+					length="20"/>
+				<property name="salary"
+					length="0"/>
+				<many-to-one name="manager"/>
+		</subclass>
+		
+		<subclass name="Customer" 
+			discriminator-value="C">
+				<property name="comments"/>
+				<many-to-one name="salesperson"/>
+		</subclass>
+		
+	</class>
+	
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/discriminator/Person.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/discriminator/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/discriminator/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/discriminator/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,70 @@
+//$Id: Person.java 4373 2004-08-18 09:18:34Z oneovthafew $
+package org.hibernate.test.discriminator;
+
+
+/**
+ * @author Gavin King
+ */
+public class Person {
+	private long id;
+	private String name;
+	private char sex;
+	private Address address = new Address();
+	/**
+	 * @return Returns the address.
+	 */
+	public Address getAddress() {
+		return address;
+	}
+
+	public void setAddress(String string) {
+		this.address.address = string;
+	}
+
+	public void setZip(String string) {
+		this.address.zip = string;
+	}
+
+	public void setCountry(String string) {
+		this.address.country = string;
+	}
+
+	
+	/**
+	 * @return Returns the sex.
+	 */
+	public char getSex() {
+		return sex;
+	}
+	/**
+	 * @param sex The sex to set.
+	 */
+	public void setSex(char sex) {
+		this.sex = sex;
+	}
+	/**
+	 * @return Returns the id.
+	 */
+	public long getId() {
+		return id;
+	}
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(long id) {
+		this.id = id;
+	}
+	/**
+	 * @return Returns the identity.
+	 */
+	public String getName() {
+		return name;
+	}
+	/**
+	 * @param identity The identity to set.
+	 */
+	public void setName(String identity) {
+		this.name = identity;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/discriminator/Person.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/Address.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/Address.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/Address.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,18 @@
+package org.hibernate.test.dynamicentity;
+
+/**
+ * @author <a href="mailto:steve at hibernate.org">Steve Ebersole </a>
+ */
+public interface Address {
+	public Long getId();
+	public void setId(Long id);
+
+	public String getStreet();
+	public void setStreet(String street);
+
+	public String getCity();
+	public void setCity(String city);
+
+	public String getPostalCode();
+	public void setPostalCode(String postalCode);
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/Address.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/Company.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/Company.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/Company.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,11 @@
+package org.hibernate.test.dynamicentity;
+
+/**
+ * @author <a href="mailto:steve at hibernate.org">Steve Ebersole </a>
+ */
+public interface Company {
+	public Long getId();
+	public void setId(Long id);
+	public String getName();
+	public void setName(String name);
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/Company.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/Customer.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/Customer.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/Customer.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,9 @@
+package org.hibernate.test.dynamicentity;
+
+/**
+ * @author <a href="mailto:steve at hibernate.org">Steve Ebersole </a>
+ */
+public interface Customer extends Person {
+	public Company getCompany();
+	public void setCompany(Company company);
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/Customer.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/DataProxyHandler.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/DataProxyHandler.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/DataProxyHandler.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,52 @@
+package org.hibernate.test.dynamicentity;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.io.Serializable;
+
+/**
+ * A simple {@link InvocationHandler} to act as the handler for our generated
+ * {@link java.lang.reflect.Proxy}-based entity instances.
+ * <p/>
+ * This is a trivial impl which simply keeps the property values into
+ * a Map.
+ *
+ * @author <a href="mailto:steve at hibernate.org">Steve Ebersole </a>
+ */
+public final class DataProxyHandler implements InvocationHandler {
+	private String entityName;
+	private HashMap data = new HashMap();
+
+	public DataProxyHandler(String entityName, Serializable id) {
+		this.entityName = entityName;
+		data.put( "Id", id );
+	}
+
+	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+		String methodName = method.getName();
+		if ( methodName.startsWith( "set" ) ) {
+			String propertyName = methodName.substring( 3 );
+			data.put( propertyName, args[0] );
+		}
+		else if ( methodName.startsWith( "get" ) ) {
+			String propertyName = methodName.substring( 3 );
+			return data.get( propertyName );
+		}
+		else if ( "toString".equals( methodName ) ) {
+			return entityName + "#" + data.get( "Id" );
+		}
+		else if ( "hashCode".equals( methodName ) ) {
+			return new Integer( this.hashCode() );
+		}
+		return null;
+	}
+
+	public String getEntityName() {
+		return entityName;
+	}
+
+	public HashMap getData() {
+		return data;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/DataProxyHandler.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,17 @@
+package org.hibernate.test.dynamicentity;
+
+import java.util.Set;
+
+/**
+ * @author <a href="mailto:steve at hibernate.org">Steve Ebersole </a>
+ */
+public interface Person {
+	public Long getId();
+	public void setId(Long id);
+	public String getName();
+	public void setName(String name);
+	public Address getAddress();
+	public void setAddress(Address address);
+	public Set getFamily();
+	public void setFamily(Set family);
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/Person.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/ProxyHelper.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/ProxyHelper.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/ProxyHelper.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,73 @@
+package org.hibernate.test.dynamicentity;
+
+import java.io.Serializable;
+import java.lang.reflect.Proxy;
+import java.lang.reflect.InvocationHandler;
+
+/**
+ * @author <a href="mailto:steve at hibernate.org">Steve Ebersole </a>
+ */
+public class ProxyHelper {
+
+	public static Person newPersonProxy() {
+		return newPersonProxy( null );
+	}
+
+	public static Person newPersonProxy(Serializable id) {
+		return ( Person ) Proxy.newProxyInstance(
+				Person.class.getClassLoader(),
+		        new Class[] {Person.class},
+		        new DataProxyHandler( Person.class.getName(), id )
+		);
+	}
+
+	public static Customer newCustomerProxy() {
+		return newCustomerProxy( null );
+	}
+
+	public static Customer newCustomerProxy(Serializable id) {
+		return ( Customer ) Proxy.newProxyInstance(
+				Customer.class.getClassLoader(),
+		        new Class[] {Customer.class},
+		        new DataProxyHandler( Customer.class.getName(), id )
+		);
+	}
+
+	public static Company newCompanyProxy() {
+		return newCompanyProxy( null );
+	}
+
+	public static Company newCompanyProxy(Serializable id) {
+		return ( Company ) Proxy.newProxyInstance(
+				Company.class.getClassLoader(),
+		        new Class[] {Company.class},
+		        new DataProxyHandler( Company.class.getName(), id )
+		);
+	}
+
+	public static Address newAddressProxy() {
+		return newAddressProxy( null );
+	}
+
+	public static Address newAddressProxy(Serializable id) {
+		return ( Address ) Proxy.newProxyInstance(
+				Address.class.getClassLoader(),
+		        new Class[] {Address.class},
+		        new DataProxyHandler( Address.class.getName(), id )
+		);
+	}
+
+	public static String extractEntityName(Object object) {
+		// Our custom java.lang.reflect.Proxy instances actually bundle
+		// their appropriate entity name, so we simply extract it from there
+		// if this represents one of our proxies; otherwise, we return null
+		if ( Proxy.isProxyClass( object.getClass() ) ) {
+			InvocationHandler handler = Proxy.getInvocationHandler( object );
+			if ( DataProxyHandler.class.isAssignableFrom( handler.getClass() ) ) {
+				DataProxyHandler myHandler = ( DataProxyHandler ) handler;
+				return myHandler.getEntityName();
+			}
+		}
+		return null;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/ProxyHelper.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/interceptor/Customer.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/interceptor/Customer.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/interceptor/Customer.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,51 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.dynamicentity">
+
+    <!--
+        Mapping the Customer and Company interfaces.  Our custom Interceptor
+        will be responsible for: a) creating instances representing these
+        interfaces; b) determining the appropriate entity-name (i.e., which
+        entity mapping to use) given an instance of one of these proxies.
+    -->
+    <class name="Person" table="t_person" abstract="false">
+        <!-- <class name="Person" table="t_person" discriminator-value="person"> -->
+		<id name="id">
+            <generator class="native"/>
+        </id>
+        <discriminator column="t_person_dis" force="false"/>
+		<property name="name"/>
+
+        <many-to-one name="address" cascade="all" column="addr_id"/>
+
+        <set name="family" lazy="true" cascade="all">
+            <key column="pers_id"/>
+            <one-to-many class="Person"/>
+        </set>
+
+        <subclass name="Customer" discriminator-value="customer" abstract="false">
+    	    <many-to-one name="company" cascade="none" column="comp_id"/>
+    	</subclass>
+    </class>
+
+    <!-- Company interface mapping -->
+	<class name="Company" table="t_company" abstract="false">
+		<id name="id">
+            <generator class="native"/>
+        </id>
+		<property name="name"/>
+	</class>
+
+    <class name="Address" table="t_address" abstract="false">
+        <id name="id">
+            <generator class="native"/>
+        </id>
+        <property name="street"/>
+        <property name="city"/>
+        <property name="postalCode"/>
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/interceptor/Customer.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/interceptor/InterceptorDynamicEntityTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/interceptor/InterceptorDynamicEntityTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/interceptor/InterceptorDynamicEntityTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,112 @@
+package org.hibernate.test.dynamicentity.interceptor;
+
+import junit.framework.TestSuite;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.dynamicentity.Company;
+import org.hibernate.test.dynamicentity.Customer;
+import org.hibernate.test.dynamicentity.ProxyHelper;
+
+/**
+ * Demonstrates custom interpretation of entity-name through
+ * an Interceptor.
+ * <p/>
+ * Here, we are generating dynamic
+ * {@link java.lang.reflect.Proxy proxies} on the fly to represent
+ * our entities.  Because of this, Hibernate would not be able to
+ * determine the appropriate entity mapping to use given one of
+ * these proxies (they are named like $Proxy1, or such).  Thus, we
+ * plug a custom Interceptor into the session to perform this
+ * entity-name interpretation.
+ *
+ * @see ProxyInterceptor
+ *
+ * @author Steve Ebersole
+ */
+public class InterceptorDynamicEntityTest extends FunctionalTestCase {
+	public InterceptorDynamicEntityTest(String x) {
+		super( x );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "dynamicentity/interceptor/Customer.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setInterceptor( new ProxyInterceptor() );
+	}
+
+	public static TestSuite suite() {
+		return new FunctionalTestClassTestSuite( InterceptorDynamicEntityTest.class );
+	}
+
+	public void testIt() {
+		// Test saving these dyna-proxies
+		Session session = openSession();
+		session.beginTransaction();
+		Company company = ProxyHelper.newCompanyProxy();
+		company.setName( "acme" );
+		session.save( company );
+		Customer customer = ProxyHelper.newCustomerProxy();
+		customer.setName( "Steve" );
+		customer.setCompany( company );
+		session.save( customer );
+		session.getTransaction().commit();
+		session.close();
+
+		assertNotNull( "company id not assigned", company.getId() );
+		assertNotNull( "customer id not assigned", customer.getId() );
+
+		// Test loading these dyna-proxies, along with flush processing
+		session = openSession();
+		session.beginTransaction();
+		customer = ( Customer ) session.load( Customer.class, customer.getId() );
+		assertFalse( "should-be-proxy was initialized", Hibernate.isInitialized( customer ) );
+
+		customer.setName( "other" );
+		session.flush();
+		assertFalse( "should-be-proxy was initialized", Hibernate.isInitialized( customer.getCompany() ) );
+
+		session.refresh( customer );
+		assertEquals( "name not updated", "other", customer.getName() );
+		assertEquals( "company association not correct", "acme", customer.getCompany().getName() );
+
+		session.getTransaction().commit();
+		session.close();
+
+		// Test detached entity re-attachment with these dyna-proxies
+		customer.setName( "Steve" );
+		session = openSession();
+		session.beginTransaction();
+		session.update( customer );
+		session.flush();
+		session.refresh( customer );
+		assertEquals( "name not updated", "Steve", customer.getName() );
+		session.getTransaction().commit();
+		session.close();
+
+		// Test querying
+		session = openSession();
+		session.beginTransaction();
+		int count = session.createQuery( "from Customer" ).list().size();
+		assertEquals( "querying dynamic entity", 1, count );
+		session.clear();
+		count = session.createQuery( "from Person" ).list().size();
+		assertEquals( "querying dynamic entity", 1, count );
+		session.getTransaction().commit();
+		session.close();
+
+		// test deleteing
+		session = openSession();
+		session.beginTransaction();
+		session.delete( company );
+		session.delete( customer );
+		session.getTransaction().commit();
+		session.close();
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/interceptor/InterceptorDynamicEntityTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/interceptor/ProxyInterceptor.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/interceptor/ProxyInterceptor.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/interceptor/ProxyInterceptor.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,61 @@
+package org.hibernate.test.dynamicentity.interceptor;
+
+import org.hibernate.EmptyInterceptor;
+import org.hibernate.EntityMode;
+import org.hibernate.test.dynamicentity.Company;
+import org.hibernate.test.dynamicentity.Customer;
+import org.hibernate.test.dynamicentity.ProxyHelper;
+import org.hibernate.test.dynamicentity.DataProxyHandler;
+
+import java.io.Serializable;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Proxy;
+
+/**
+ * Our custom {@link org.hibernate.Interceptor} impl which performs the
+ * interpretation of entity-name -> proxy instance and vice-versa.
+ *
+ * @author <a href="mailto:steve at hibernate.org">Steve Ebersole </a>
+ */
+public class ProxyInterceptor extends EmptyInterceptor {
+
+	/**
+	 * The callback from Hibernate to determine the entity name given
+	 * a presumed entity instance.
+	 *
+	 * @param object The presumed entity instance.
+	 * @return The entity name (pointing to the proper entity mapping).
+	 */
+	public String getEntityName(Object object) {
+		String entityName = ProxyHelper.extractEntityName( object );
+		if ( entityName == null ) {
+			entityName = super.getEntityName( object );
+		}
+		return entityName;
+	}
+
+	/**
+	 * The callback from Hibernate in order to build an instance of the
+	 * entity represented by the given entity name.  Here, we build a
+	 * {@link Proxy} representing the entity.
+	 *
+	 * @param entityName The entity name for which to create an instance.  In our setup,
+	 * this is the interface name.
+	 * @param entityMode The entity mode in which to create an instance.  Here, we are only
+	 * interestes in custom behavior for the POJO entity mode.
+	 * @param id The identifier value for the given entity.
+	 * @return The instantiated instance.
+	 */
+	public Object instantiate(String entityName, EntityMode entityMode, Serializable id) {
+		if ( entityMode == EntityMode.POJO ) {
+			if ( Customer.class.getName().equals( entityName ) ) {
+				return ProxyHelper.newCustomerProxy( id );
+			}
+			else if ( Company.class.getName().equals( entityName ) ) {
+				return ProxyHelper.newCompanyProxy( id );
+			}
+		}
+		return super.instantiate( entityName, entityMode, id );
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/interceptor/ProxyInterceptor.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/package.html
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/package.html	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/package.html	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,29 @@
+<html>
+<head></head>
+
+<body>
+<p>
+	Demonstration of different ways to use Hibernate to represent your domain
+	model as a series of JDK dynamic proxies.  We map the interfaces and then
+	use one of two approaches to get Hibernate to recognize these proxies as
+	domain entities.  Really this is demonstrating various "entity representation"
+	capabilities built in to Hibernate3.
+</p>
+<p>
+	First we use an interceptor-based approach where we use a custom Interceptor
+	implementation for interpret incoming proxies (and resolve them to the correct
+	mappings) and to help Hibernate instantiate these proxy instances.  This is the
+	quick-and-dirty approach.  It is fully expected that this approach will
+	encounter certain limitations.
+</p>
+<p>
+	Next we explore the notion of a Tuplizer and plug in custom Tuplizers to
+	help achieve the same results.  Currently, Tuplizers do not have a chance
+	to influence the resolution of entity-name given a potential entity, so we
+	also use an Interceptor here and supply its getEntityName() impl.  This is
+	simply so we do not need to supply the entity name explicitly to the
+	Hibernate Session calls.
+</p>
+</body>
+
+</html>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/package.html
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer/Customer.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer/Customer.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer/Customer.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,54 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.dynamicentity">
+
+    <!--
+        Mapping the Customer and Company interfaces.  Our custom Interceptor
+        will be responsible for: a) creating instances representing these
+        interfaces; b) determining the appropriate entity-name (i.e., which
+        entity mapping to use) given an instance of one of these proxies.
+    -->
+    <class name="Person" table="t_person" discriminator-value="person" abstract="false">
+        <tuplizer class="org.hibernate.test.dynamicentity.tuplizer.MyEntityTuplizer" entity-mode="pojo"/>
+		<id name="id">
+            <generator class="native"/>
+        </id>
+        <discriminator column="t_person_dis" force="false"/>
+		<property name="name"/>
+
+        <many-to-one name="address" cascade="all" column="addr_id"/>
+
+        <set name="family" lazy="true" cascade="all">
+            <key column="pers_id"/>
+            <one-to-many class="Person"/>
+        </set>
+
+        <subclass name="Customer" discriminator-value="customer" abstract="false">
+            <tuplizer class="org.hibernate.test.dynamicentity.tuplizer.MyEntityTuplizer" entity-mode="pojo"/>
+            <many-to-one name="company" cascade="none" column="comp_id"/>
+    	</subclass>
+    </class>
+
+    <!-- Company interface mapping -->
+	<class name="Company" table="t_company" abstract="false">
+        <tuplizer class="org.hibernate.test.dynamicentity.tuplizer.MyEntityTuplizer" entity-mode="pojo"/>
+		<id name="id">
+            <generator class="native"/>
+        </id>
+		<property name="name"/>
+	</class>
+
+    <class name="Address" table="t_address" abstract="false">
+        <tuplizer class="org.hibernate.test.dynamicentity.tuplizer.MyEntityTuplizer" entity-mode="pojo"/>
+        <id name="id">
+            <generator class="native"/>
+        </id>
+        <property name="street"/>
+        <property name="city"/>
+        <property name="postalCode"/>
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer/Customer.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer/EntityNameInterceptor.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer/EntityNameInterceptor.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer/EntityNameInterceptor.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,24 @@
+package org.hibernate.test.dynamicentity.tuplizer;
+
+import org.hibernate.EmptyInterceptor;
+import org.hibernate.test.dynamicentity.ProxyHelper;
+
+/**
+ * @author <a href="mailto:steve at hibernate.org">Steve Ebersole </a>
+ */
+public class EntityNameInterceptor extends EmptyInterceptor {
+	/**
+	 * The callback from Hibernate to determine the entity name given
+	 * a presumed entity instance.
+	 *
+	 * @param object The presumed entity instance.
+	 * @return The entity name (pointing to the proper entity mapping).
+	 */
+	public String getEntityName(Object object) {
+		String entityName = ProxyHelper.extractEntityName( object );
+		if ( entityName == null ) {
+			entityName = super.getEntityName( object );
+		}
+		return entityName;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer/EntityNameInterceptor.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer/MyEntityInstantiator.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer/MyEntityInstantiator.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer/MyEntityInstantiator.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,67 @@
+package org.hibernate.test.dynamicentity.tuplizer;
+
+import org.hibernate.tuple.Instantiator;
+import org.hibernate.test.dynamicentity.Customer;
+import org.hibernate.test.dynamicentity.ProxyHelper;
+import org.hibernate.test.dynamicentity.Company;
+import org.hibernate.test.dynamicentity.DataProxyHandler;
+import org.hibernate.test.dynamicentity.Address;
+import org.hibernate.test.dynamicentity.Person;
+import org.hibernate.util.ReflectHelper;
+import org.hibernate.HibernateException;
+
+import java.io.Serializable;
+import java.lang.reflect.Proxy;
+import java.lang.reflect.InvocationHandler;
+
+/**
+ * @author <a href="mailto:steve at hibernate.org">Steve Ebersole </a>
+ */
+public class MyEntityInstantiator implements Instantiator {
+	private final String entityName;
+
+	public MyEntityInstantiator(String entityName) {
+		this.entityName = entityName;
+	}
+
+	public Object instantiate(Serializable id) {
+		if ( Person.class.getName().equals( entityName ) ) {
+			return ProxyHelper.newPersonProxy( id );
+		}
+		if ( Customer.class.getName().equals( entityName ) ) {
+			return ProxyHelper.newCustomerProxy( id );
+		}
+		else if ( Company.class.getName().equals( entityName ) ) {
+			return ProxyHelper.newCompanyProxy( id );
+		}
+		else if ( Address.class.getName().equals( entityName ) ) {
+			return ProxyHelper.newAddressProxy( id );
+		}
+		else {
+			throw new IllegalArgumentException( "unknown entity for instantiation [" + entityName + "]" );
+		}
+	}
+
+	public Object instantiate() {
+		return instantiate( null );
+	}
+
+	public boolean isInstance(Object object) {
+		String resolvedEntityName = null;
+		if ( Proxy.isProxyClass( object.getClass() ) ) {
+			InvocationHandler handler = Proxy.getInvocationHandler( object );
+			if ( DataProxyHandler.class.isAssignableFrom( handler.getClass() ) ) {
+				DataProxyHandler myHandler = ( DataProxyHandler ) handler;
+				resolvedEntityName = myHandler.getEntityName();
+			}
+		}
+		try {
+			return ReflectHelper.classForName( entityName ).isInstance( object );
+		}
+		catch( Throwable t ) {
+			throw new HibernateException( "could not get handle to entity-name as interface : " + t );
+		}
+
+//		return entityName.equals( resolvedEntityName );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer/MyEntityInstantiator.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer/MyEntityTuplizer.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer/MyEntityTuplizer.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer/MyEntityTuplizer.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,31 @@
+package org.hibernate.test.dynamicentity.tuplizer;
+
+import org.hibernate.tuple.entity.PojoEntityTuplizer;
+import org.hibernate.tuple.entity.EntityMetamodel;
+import org.hibernate.tuple.Instantiator;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.proxy.ProxyFactory;
+import org.hibernate.property.Getter;
+import org.hibernate.property.Setter;
+
+/**
+ * @author Steve Ebersole
+ */
+public class MyEntityTuplizer extends PojoEntityTuplizer {
+
+	public MyEntityTuplizer(EntityMetamodel entityMetamodel, PersistentClass mappedEntity) {
+		super( entityMetamodel, mappedEntity );
+	}
+
+	protected Instantiator buildInstantiator(PersistentClass persistentClass) {
+		return new MyEntityInstantiator( persistentClass.getEntityName() );
+	}
+
+	protected ProxyFactory buildProxyFactory(PersistentClass persistentClass, Getter idGetter, Setter idSetter) {
+		// allows defining a custom proxy factory, which is responsible for
+		// generating lazy proxies for a given entity.
+		//
+		// Here we simply use the default...
+		return super.buildProxyFactory( persistentClass, idGetter, idSetter );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer/MyEntityTuplizer.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer/TuplizerDynamicEntityTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer/TuplizerDynamicEntityTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer/TuplizerDynamicEntityTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,126 @@
+package org.hibernate.test.dynamicentity.tuplizer;
+
+import org.hibernate.test.dynamicentity.Company;
+import org.hibernate.test.dynamicentity.ProxyHelper;
+import org.hibernate.test.dynamicentity.Customer;
+import org.hibernate.test.dynamicentity.Address;
+import org.hibernate.test.dynamicentity.Person;
+import org.hibernate.Session;
+import org.hibernate.Hibernate;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+import junit.framework.TestSuite;
+
+import java.util.HashSet;
+
+/**
+ * Demonstrates use of Tuplizers to allow the use of JDK
+ * {@link java.lang.reflect.Proxy dynamic proxies} as our
+ * domain model.
+ * <p/>
+ * Here we plug a custom Interceptor into the session simply to
+ * allow us to not have to explicitly supply the appropriate entity
+ * name to the Session calls.
+ *
+ * @author Steve Ebersole
+ */
+public class TuplizerDynamicEntityTest extends FunctionalTestCase {
+	public TuplizerDynamicEntityTest(String x) {
+		super( x );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "dynamicentity/tuplizer/Customer.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		super.configure( cfg );
+		cfg.setInterceptor( new EntityNameInterceptor() );
+	}
+
+	public static TestSuite suite() {
+		return new FunctionalTestClassTestSuite( TuplizerDynamicEntityTest.class );
+	}
+
+	public void testIt() {
+		// Test saving these dyna-proxies
+		Session session = openSession();
+		session.beginTransaction();
+		Company company = ProxyHelper.newCompanyProxy();
+		company.setName( "acme" );
+		session.save( company );
+		Customer customer = ProxyHelper.newCustomerProxy();
+		customer.setName( "Steve" );
+		customer.setCompany( company );
+		Address address = ProxyHelper.newAddressProxy();
+		address.setStreet( "somewhere over the rainbow" );
+		address.setCity( "lawerence, kansas" );
+		address.setPostalCode( "toto");
+		customer.setAddress( address );
+		customer.setFamily( new HashSet() );
+		Person son = ProxyHelper.newPersonProxy();
+		son.setName( "son" );
+		customer.getFamily().add( son );
+		Person wife = ProxyHelper.newPersonProxy();
+		wife.setName( "wife" );
+		customer.getFamily().add( wife );
+		session.save( customer );
+		session.getTransaction().commit();
+		session.close();
+
+		assertNotNull( "company id not assigned", company.getId() );
+		assertNotNull( "customer id not assigned", customer.getId() );
+		assertNotNull( "address id not assigned", address.getId() );
+		assertNotNull( "son:Person id not assigned", son.getId() );
+		assertNotNull( "wife:Person id not assigned", wife.getId() );
+
+		// Test loading these dyna-proxies, along with flush processing
+		session = openSession();
+		session.beginTransaction();
+		customer = ( Customer ) session.load( Customer.class, customer.getId() );
+		assertFalse( "should-be-proxy was initialized", Hibernate.isInitialized( customer ) );
+
+		customer.setName( "other" );
+		session.flush();
+		assertFalse( "should-be-proxy was initialized", Hibernate.isInitialized( customer.getCompany() ) );
+
+		session.refresh( customer );
+		assertEquals( "name not updated", "other", customer.getName() );
+		assertEquals( "company association not correct", "acme", customer.getCompany().getName() );
+
+		session.getTransaction().commit();
+		session.close();
+
+		// Test detached entity re-attachment with these dyna-proxies
+		customer.setName( "Steve" );
+		session = openSession();
+		session.beginTransaction();
+		session.update( customer );
+		session.flush();
+		session.refresh( customer );
+		assertEquals( "name not updated", "Steve", customer.getName() );
+		session.getTransaction().commit();
+		session.close();
+
+		// Test querying
+		session = openSession();
+		session.beginTransaction();
+		int count = session.createQuery( "from Customer" ).list().size();
+		assertEquals( "querying dynamic entity", 1, count );
+		session.clear();
+		count = session.createQuery( "from Person" ).list().size();
+		assertEquals( "querying dynamic entity", 3, count );
+		session.getTransaction().commit();
+		session.close();
+
+		// test deleteing
+		session = openSession();
+		session.beginTransaction();
+		session.delete( company );
+		session.delete( customer );
+		session.getTransaction().commit();
+		session.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer/TuplizerDynamicEntityTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer2/Customer.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer2/Customer.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer2/Customer.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,68 @@
+<?xml version="1.0"?>
+<!--
+  ~ Hibernate, Relational Persistence for Idiomatic Java
+  ~
+  ~ Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+  ~ indicated by the @author tags or express copyright attribution
+  ~ statements applied by the authors.  All third-party contributions are
+  ~ distributed under license by Red Hat Middleware LLC.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, as published by the Free Software Foundation.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  ~ or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+  ~ for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public License
+  ~ along with this distribution; if not, write to:
+  ~ Free Software Foundation, Inc.
+  ~ 51 Franklin Street, Fifth Floor
+  ~ Boston, MA  02110-1301  USA
+  ~
+  -->
+
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.dynamicentity">
+
+    <class name="Person" table="t_person" discriminator-value="person" abstract="false">
+		<id name="id">
+            <generator class="native"/>
+        </id>
+        <discriminator column="t_person_dis" force="false"/>
+		<property name="name"/>
+
+        <many-to-one name="address" cascade="all" column="addr_id"/>
+
+        <set name="family" lazy="true" cascade="all">
+            <key column="pers_id"/>
+            <one-to-many class="Person"/>
+        </set>
+
+        <subclass name="Customer" discriminator-value="customer" abstract="false">
+            <many-to-one name="company" cascade="none" column="comp_id"/>
+    	</subclass>
+    </class>
+
+	<class name="Company" table="t_company" abstract="false">
+		<id name="id">
+            <generator class="native"/>
+        </id>
+		<property name="name"/>
+	</class>
+
+    <class name="Address" table="t_address" abstract="false">
+        <id name="id">
+            <generator class="native"/>
+        </id>
+        <property name="street"/>
+        <property name="city"/>
+        <property name="postalCode"/>
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer2/Customer.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer2/ImprovedTuplizerDynamicEntityTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer2/ImprovedTuplizerDynamicEntityTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer2/ImprovedTuplizerDynamicEntityTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,151 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.dynamicentity.tuplizer2;
+
+import org.hibernate.test.dynamicentity.Company;
+import org.hibernate.test.dynamicentity.ProxyHelper;
+import org.hibernate.test.dynamicentity.Customer;
+import org.hibernate.test.dynamicentity.Address;
+import org.hibernate.test.dynamicentity.Person;
+import org.hibernate.Session;
+import org.hibernate.Hibernate;
+import org.hibernate.EntityMode;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+import junit.framework.TestSuite;
+
+import java.util.HashSet;
+
+/**
+ * Demonstrates use of Tuplizers to allow the use of JDK
+ * {@link java.lang.reflect.Proxy dynamic proxies} as our
+ * domain model.
+ * <p/>
+ * Here we plug a custom Interceptor into the session simply to
+ * allow us to not have to explicitly supply the appropriate entity
+ * name to the Session calls.
+ *
+ * @author Steve Ebersole
+ */
+public class ImprovedTuplizerDynamicEntityTest extends FunctionalTestCase {
+	public ImprovedTuplizerDynamicEntityTest(String x) {
+		super( x );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "dynamicentity/tuplizer2/Customer.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		super.configure( cfg );
+		cfg.getEntityTuplizerFactory().registerDefaultTuplizerClass( EntityMode.POJO, MyEntityTuplizer.class );
+	}
+
+	public static TestSuite suite() {
+		return new FunctionalTestClassTestSuite( ImprovedTuplizerDynamicEntityTest.class );
+	}
+
+	public void testIt() {
+		// Test saving these dyna-proxies
+		Session session = openSession();
+		session.beginTransaction();
+		Company company = ProxyHelper.newCompanyProxy();
+		company.setName( "acme" );
+		session.save( company );
+		Customer customer = ProxyHelper.newCustomerProxy();
+		customer.setName( "Steve" );
+		customer.setCompany( company );
+		Address address = ProxyHelper.newAddressProxy();
+		address.setStreet( "somewhere over the rainbow" );
+		address.setCity( "lawerence, kansas" );
+		address.setPostalCode( "toto");
+		customer.setAddress( address );
+		customer.setFamily( new HashSet() );
+		Person son = ProxyHelper.newPersonProxy();
+		son.setName( "son" );
+		customer.getFamily().add( son );
+		Person wife = ProxyHelper.newPersonProxy();
+		wife.setName( "wife" );
+		customer.getFamily().add( wife );
+		session.save( customer );
+		session.getTransaction().commit();
+		session.close();
+
+		assertNotNull( "company id not assigned", company.getId() );
+		assertNotNull( "customer id not assigned", customer.getId() );
+		assertNotNull( "address id not assigned", address.getId() );
+		assertNotNull( "son:Person id not assigned", son.getId() );
+		assertNotNull( "wife:Person id not assigned", wife.getId() );
+
+		// Test loading these dyna-proxies, along with flush processing
+		session = openSession();
+		session.beginTransaction();
+		customer = ( Customer ) session.load( Customer.class, customer.getId() );
+		assertFalse( "should-be-proxy was initialized", Hibernate.isInitialized( customer ) );
+
+		customer.setName( "other" );
+		session.flush();
+		assertFalse( "should-be-proxy was initialized", Hibernate.isInitialized( customer.getCompany() ) );
+
+		session.refresh( customer );
+		assertEquals( "name not updated", "other", customer.getName() );
+		assertEquals( "company association not correct", "acme", customer.getCompany().getName() );
+
+		session.getTransaction().commit();
+		session.close();
+
+		// Test detached entity re-attachment with these dyna-proxies
+		customer.setName( "Steve" );
+		session = openSession();
+		session.beginTransaction();
+		session.update( customer );
+		session.flush();
+		session.refresh( customer );
+		assertEquals( "name not updated", "Steve", customer.getName() );
+		session.getTransaction().commit();
+		session.close();
+
+		// Test querying
+		session = openSession();
+		session.beginTransaction();
+		int count = session.createQuery( "from Customer" ).list().size();
+		assertEquals( "querying dynamic entity", 1, count );
+		session.clear();
+		count = session.createQuery( "from Person" ).list().size();
+		assertEquals( "querying dynamic entity", 3, count );
+		session.getTransaction().commit();
+		session.close();
+
+		// test deleteing
+		session = openSession();
+		session.beginTransaction();
+		session.delete( company );
+		session.delete( customer );
+		session.getTransaction().commit();
+		session.close();
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer2/ImprovedTuplizerDynamicEntityTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer2/MyEntityInstantiator.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer2/MyEntityInstantiator.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer2/MyEntityInstantiator.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,78 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.dynamicentity.tuplizer2;
+
+import org.hibernate.tuple.Instantiator;
+import org.hibernate.test.dynamicentity.Customer;
+import org.hibernate.test.dynamicentity.ProxyHelper;
+import org.hibernate.test.dynamicentity.Company;
+import org.hibernate.test.dynamicentity.Address;
+import org.hibernate.test.dynamicentity.Person;
+import org.hibernate.util.ReflectHelper;
+import org.hibernate.HibernateException;
+
+import java.io.Serializable;
+
+/**
+ * @author Steve Ebersole
+ */
+public class MyEntityInstantiator implements Instantiator {
+	private final String entityName;
+
+	public MyEntityInstantiator(String entityName) {
+		this.entityName = entityName;
+	}
+
+	public Object instantiate(Serializable id) {
+		if ( Person.class.getName().equals( entityName ) ) {
+			return ProxyHelper.newPersonProxy( id );
+		}
+		if ( Customer.class.getName().equals( entityName ) ) {
+			return ProxyHelper.newCustomerProxy( id );
+		}
+		else if ( Company.class.getName().equals( entityName ) ) {
+			return ProxyHelper.newCompanyProxy( id );
+		}
+		else if ( Address.class.getName().equals( entityName ) ) {
+			return ProxyHelper.newAddressProxy( id );
+		}
+		else {
+			throw new IllegalArgumentException( "unknown entity for instantiation [" + entityName + "]" );
+		}
+	}
+
+	public Object instantiate() {
+		return instantiate( null );
+	}
+
+	public boolean isInstance(Object object) {
+		try {
+			return ReflectHelper.classForName( entityName ).isInstance( object );
+		}
+		catch( Throwable t ) {
+			throw new HibernateException( "could not get handle to entity-name as interface : " + t );
+		}
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer2/MyEntityInstantiator.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer2/MyEntityTuplizer.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer2/MyEntityTuplizer.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer2/MyEntityTuplizer.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,87 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.dynamicentity.tuplizer2;
+
+import org.hibernate.tuple.entity.PojoEntityTuplizer;
+import org.hibernate.tuple.entity.EntityMetamodel;
+import org.hibernate.tuple.Instantiator;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.proxy.ProxyFactory;
+import org.hibernate.property.Getter;
+import org.hibernate.property.Setter;
+import org.hibernate.test.dynamicentity.tuplizer.MyEntityInstantiator;
+import org.hibernate.test.dynamicentity.ProxyHelper;
+import org.hibernate.engine.SessionFactoryImplementor;
+import org.hibernate.EntityNameResolver;
+
+/**
+ * @author Steve Ebersole
+ */
+public class MyEntityTuplizer extends PojoEntityTuplizer {
+
+	public MyEntityTuplizer(EntityMetamodel entityMetamodel, PersistentClass mappedEntity) {
+		super( entityMetamodel, mappedEntity );
+	}
+
+	public EntityNameResolver[] getEntityNameResolvers() {
+		return new EntityNameResolver[] { MyEntityNameResolver.INSTANCE };
+	}
+
+	protected Instantiator buildInstantiator(PersistentClass persistentClass) {
+		return new MyEntityInstantiator( persistentClass.getEntityName() );
+	}
+
+	public String determineConcreteSubclassEntityName(Object entityInstance, SessionFactoryImplementor factory) {
+		String entityName = ProxyHelper.extractEntityName( entityInstance );
+		if ( entityName == null ) {
+			entityName = super.determineConcreteSubclassEntityName( entityInstance, factory );
+		}
+		return entityName;
+	}
+
+	protected ProxyFactory buildProxyFactory(PersistentClass persistentClass, Getter idGetter, Setter idSetter) {
+		// allows defining a custom proxy factory, which is responsible for
+		// generating lazy proxies for a given entity.
+		//
+		// Here we simply use the default...
+		return super.buildProxyFactory( persistentClass, idGetter, idSetter );
+	}
+
+	public static class MyEntityNameResolver implements EntityNameResolver {
+		public static final MyEntityNameResolver INSTANCE = new MyEntityNameResolver();
+
+		public String resolveEntityName(Object entity) {
+			return ProxyHelper.extractEntityName( entity );
+		}
+
+		public boolean equals(Object obj) {
+			return getClass().equals( obj.getClass() );
+		}
+
+		public int hashCode() {
+			return getClass().hashCode();
+		}
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/dynamicentity/tuplizer2/MyEntityTuplizer.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ecid/Course.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ecid/Course.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ecid/Course.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,29 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping 
+	package="org.hibernate.test.ecid" 
+	default-access="field">
+
+<!-- 
+
+  This mapping demonstrates inheritance with embedded composite ids.
+     
+-->
+
+	<class name="Course" table="SchoolCourses"
+			discriminator-value="secondary/primary">
+		<composite-id>
+			<key-property name="courseCode"/>
+			<key-property name="org"/>
+		</composite-id>
+		<discriminator column="schoolLevel" length="20"/>
+		<property name="description" not-null="true"/>
+		<subclass name="UniversityCourse" discriminator-value="tertiary">
+			<property name="semester"/>
+		</subclass>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ecid/Course.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ecid/Course.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ecid/Course.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ecid/Course.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,38 @@
+//$Id: Course.java 6913 2005-05-25 17:37:51Z oneovthafew $
+package org.hibernate.test.ecid;
+
+import java.io.Serializable;
+
+/**
+ * @author Gavin King
+ */
+public class Course implements Serializable {
+	
+	private String courseCode;
+	private String org;
+	private String description;
+
+	Course() {}
+	Course(String courseCode, String org, String description) {
+		this.courseCode = courseCode;
+		this.org = org;
+		this.description = description;
+	}
+	
+	public String getDescription() {
+		return description;
+	}
+	
+	public void setDescription(String description) {
+		this.description = description;
+	}
+	
+	public String getCourseCode() {
+		return courseCode;
+	}
+	
+	public String getOrg() {
+		return org;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ecid/Course.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ecid/EmbeddedCompositeIdTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ecid/EmbeddedCompositeIdTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ecid/EmbeddedCompositeIdTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,162 @@
+//$Id: EmbeddedCompositeIdTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.ecid;
+
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.proxy.HibernateProxy;
+
+/**
+ * @author Gavin King
+ */
+public class EmbeddedCompositeIdTest extends FunctionalTestCase {
+	
+	public EmbeddedCompositeIdTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "ecid/Course.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( EmbeddedCompositeIdTest.class );
+	}
+	
+	public void testMerge() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Course uc =  new UniversityCourse("mat2000", "Monash", "second year maths", 0);
+		Course c =  new Course("eng5000", "BHS", "grade 5 english");
+		s.persist(uc);
+		s.persist(c);
+		t.commit();
+		s.close();
+		
+		c.setDescription("Grade 5 English");
+		uc.setDescription("Second year mathematics");
+		
+		s = openSession();
+		t = s.beginTransaction();
+		s.merge(c);
+		s.merge(uc);
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete(c);
+		s.delete(uc);
+		t.commit();
+		s.close();
+	}
+
+	public void testMerging() {
+		// Test HHH-799
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Course course = new Course( "EN-101", "BA", "preparatory english" );
+		s.persist( course );
+		t.commit();
+		s.close();
+
+		String newDesc = "basic preparatory english";
+		course.setDescription( newDesc );
+
+		s = openSession();
+		t = s.beginTransaction();
+		Course c = (Course) s.merge( course );
+		assertEquals( "description not merged", newDesc, c.getDescription() );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Course cid = new Course( "EN-101", "BA", null );
+		course = ( Course ) s.get( Course.class, cid );
+		assertEquals( "description not merged", newDesc, course.getDescription() );
+		s.delete( course );
+		t.commit();
+		s.close();
+	}
+
+	public void testPolymorphism() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Course uc =  new UniversityCourse("mat2000", "Monash", "second year maths", 0);
+		Course c =  new Course("eng5000", "BHS", "grade 5 english");
+		s.persist(uc);
+		s.persist(c);
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		Course ucid = new Course("mat2000", "Monash", null);
+		Course cid =  new Course("eng5000", "BHS", null);
+		Course luc = (Course) s.load(Course.class, ucid);
+		Course lc = (Course) s.load(Course.class, cid);
+		assertFalse( Hibernate.isInitialized(luc) );
+		assertFalse( Hibernate.isInitialized(lc) );
+		assertEquals( UniversityCourse.class, Hibernate.getClass(luc) );
+		assertEquals( Course.class, Hibernate.getClass(lc) );
+		assertSame( ( (HibernateProxy) lc ).getHibernateLazyInitializer().getImplementation(), cid );
+		assertEquals( c.getCourseCode(), "eng5000" );
+		assertEquals( uc.getCourseCode(), "mat2000" );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		ucid = new Course("mat2000", "Monash", null);
+		cid =  new Course("eng5000", "BHS", null);
+		luc = (Course) s.get(Course.class, ucid);
+		lc = (Course) s.get(Course.class, cid);
+		assertTrue( Hibernate.isInitialized(luc) );
+		assertTrue( Hibernate.isInitialized(lc) );
+		assertEquals( UniversityCourse.class, Hibernate.getClass(luc) );
+		assertEquals( Course.class, Hibernate.getClass(lc) );
+		assertSame( lc, cid );
+		assertEquals( c.getCourseCode(), "eng5000" );
+		assertEquals( uc.getCourseCode(), "mat2000" );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		List list = s.createQuery("from Course order by courseCode").list();
+		assertTrue( list.get(0) instanceof Course );
+		assertTrue( list.get(1) instanceof UniversityCourse );
+		c = (Course) list.get(0);
+		uc = (UniversityCourse) list.get(1);
+		assertEquals( c.getCourseCode(), "eng5000" );
+		assertEquals( uc.getCourseCode(), "mat2000" );
+		t.commit();
+		s.close();
+		
+		c.setDescription("Grade 5 English");
+		uc.setDescription("Second year mathematics");
+		
+		s = openSession();
+		t = s.beginTransaction();
+		s.saveOrUpdate(c);
+		s.saveOrUpdate(uc);
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete(c);
+		s.delete(uc);
+		t.commit();
+		s.close();
+		
+	}
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ecid/EmbeddedCompositeIdTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ecid/UniversityCourse.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ecid/UniversityCourse.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ecid/UniversityCourse.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,22 @@
+//$Id: UniversityCourse.java 6913 2005-05-25 17:37:51Z oneovthafew $
+package org.hibernate.test.ecid;
+
+/**
+ * @author Gavin King
+ */
+public class UniversityCourse extends Course {
+	
+	private int semester;
+
+	UniversityCourse() {}
+
+	public UniversityCourse(String courseCode, String org, String description, int semester) {
+		super( courseCode, org, description );
+		this.semester = semester;
+	}
+
+	public int getSemester() {
+		return semester;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ecid/UniversityCourse.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/accessors/Dom4jAccessorTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/accessors/Dom4jAccessorTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/accessors/Dom4jAccessorTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,166 @@
+// $Id: Dom4jAccessorTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.entitymode.dom4j.accessors;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import org.dom4j.DocumentFactory;
+import org.dom4j.Element;
+import org.dom4j.util.NodeComparator;
+
+import org.hibernate.EntityMode;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Mappings;
+import org.hibernate.engine.SessionFactoryImplementor;
+import org.hibernate.mapping.Property;
+import org.hibernate.mapping.SimpleValue;
+import org.hibernate.property.Getter;
+import org.hibernate.property.PropertyAccessorFactory;
+import org.hibernate.property.Setter;
+
+/**
+ * Unit test of dom4j-based accessors
+ *
+ * @author Steve Ebersole
+ */
+public class Dom4jAccessorTest extends TestCase {
+
+	public static final Element DOM = generateTestElement();
+
+	private Mappings mappings;
+
+	public Dom4jAccessorTest(String name) {
+		super( name );
+	}
+
+	@Override
+	protected void setUp() throws Exception {
+		mappings = new Configuration().createMappings();
+	}
+
+	public void testStringElementExtraction() throws Throwable {
+		Property property = generateNameProperty();
+		Getter getter = PropertyAccessorFactory.getPropertyAccessor( property, EntityMode.DOM4J )
+				.getGetter( null, null );
+		String name = ( String ) getter.get( DOM );
+		assertEquals( "Not equals", "JBoss", name );
+	}
+
+	public void testStringTextExtraction() throws Throwable {
+		Property property = generateTextProperty();
+		Getter getter = PropertyAccessorFactory.getPropertyAccessor( property, EntityMode.DOM4J )
+				.getGetter( null, null );
+		String name = ( String ) getter.get( DOM );
+		assertEquals( "Not equals", "description...", name );
+	}
+
+	public void testLongAttributeExtraction() throws Throwable {
+		Property property = generateIdProperty();
+		Getter getter = PropertyAccessorFactory.getPropertyAccessor( property, EntityMode.DOM4J )
+				.getGetter( null, null );
+		Long id = ( Long ) getter.get( DOM );
+		assertEquals( "Not equals", new Long( 123 ), id );
+	}
+
+	public void testLongElementAttributeExtraction() throws Throwable {
+		Property property = generateAccountIdProperty();
+		Getter getter = PropertyAccessorFactory.getPropertyAccessor( property, EntityMode.DOM4J )
+				.getGetter( null, null );
+		Long id = ( Long ) getter.get( DOM );
+		assertEquals( "Not equals", new Long( 456 ), id );
+	}
+
+	public void testCompanyElementGeneration() throws Throwable {
+		Setter idSetter = PropertyAccessorFactory.getPropertyAccessor( generateIdProperty(), EntityMode.DOM4J )
+				.getSetter( null, null );
+		Setter nameSetter = PropertyAccessorFactory.getPropertyAccessor( generateNameProperty(), EntityMode.DOM4J )
+				.getSetter( null, null );
+		Setter textSetter = PropertyAccessorFactory.getPropertyAccessor( generateTextProperty(), EntityMode.DOM4J )
+				.getSetter( null, null );
+		Setter accountIdSetter = PropertyAccessorFactory.getPropertyAccessor(
+				generateAccountIdProperty(), EntityMode.DOM4J
+		)
+				.getSetter( null, null );
+
+		Element root = generateRootTestElement();
+
+		idSetter.set( root, new Long( 123 ), getSFI() );
+		textSetter.set( root, "description...", getSFI() );
+		nameSetter.set( root, "JBoss", getSFI() );
+		accountIdSetter.set( root, new Long( 456 ), getSFI() );
+
+		assertTrue( "DOMs not equal", new NodeComparator().compare( DOM, root ) == 0 );
+	}
+
+	// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+	private static Element generateTestElement() {
+		Element company = generateRootTestElement();
+		company.addAttribute( "id", "123" );
+		company.setText( "description..." );
+		company.addElement( "name" ).setText( "JBoss" );
+		company.addElement( "account" ).addAttribute( "num", "456" );
+
+		return company;
+	}
+
+	private static Element generateRootTestElement() {
+		return DocumentFactory.getInstance().createElement( "company" );
+	}
+
+	public static Test suite() {
+		return new TestSuite( Dom4jAccessorTest.class );
+	}
+
+	private SessionFactoryImplementor getSFI() {
+		return null;
+	}
+
+	private Property generateIdProperty() {
+		SimpleValue value = new SimpleValue( mappings );
+		value.setTypeName( "long" );
+
+		Property property = new Property();
+		property.setName( "id" );
+		property.setNodeName( "@id" );
+		property.setValue( value );
+
+		return property;
+	}
+
+	private Property generateTextProperty() {
+		SimpleValue value = new SimpleValue(mappings);
+		value.setTypeName( "string" );
+
+		Property property = new Property();
+		property.setName( "text" );
+		property.setNodeName( "." );
+		property.setValue( value );
+
+		return property;
+	}
+
+	private Property generateAccountIdProperty() {
+		SimpleValue value = new SimpleValue(mappings);
+		value.setTypeName( "long" );
+
+		Property property = new Property();
+		property.setName( "number" );
+		property.setNodeName( "account/@num" );
+		property.setValue( value );
+
+		return property;
+	}
+
+	private Property generateNameProperty() {
+		SimpleValue value = new SimpleValue(mappings);
+		value.setTypeName( "string" );
+
+		Property property = new Property();
+		property.setName( "name" );
+		property.setNodeName( "name" );
+		property.setValue( value );
+
+		return property;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/accessors/Dom4jAccessorTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/basic/AB.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/basic/AB.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/basic/AB.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping >
+
+    <class entity-name="A" table="AX" node="a">
+        <id name="aId" type="int" column="aId" node="@id"/>
+        <property name="x"  type="string"/>
+        <set name="bs" node="." embed-xml="true" cascade="all" inverse="true">
+            <key column="aId"/>
+            <one-to-many class="B"/>
+        </set>
+    </class>
+
+
+    <class entity-name="B" table="BX" node="b">
+        <composite-id>
+            <key-property name="bId" column="bId" type="int" node="@bId"/>
+            <key-property name="aId" column="aId" type="int" node="@aId"/>
+        </composite-id>
+        <property name="y" type="string" node="."/>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/basic/AB.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/basic/Account.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/basic/Account.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/basic/Account.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,51 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping>
+
+    <class entity-name="Customer" node="customer">
+        <id name="customerId" type="string" node="@id"/>
+        <component name="name">
+            <property name="first" column="`first`" type="string"/>
+            <property name="last" type="string"/>
+        </component>
+        <property name="address" type="string" node="address"/>
+        <map name="stuff">
+            <key column="customerId"/>
+            <map-key type="string" column="bar" node="@bar"/>
+            <element type="string" node="foo" column="foo"/>
+        </map>
+        <bag name="morestuff" node=".">
+            <key column="customerId"/>
+            <element type="integer" node="amount" column="amount"/>
+        </bag>
+        <list name="accounts" cascade="all">
+            <key column="customerId2"/>
+            <list-index column="acctno" base="1"/>
+            <one-to-many entity-name="Account" node="account"/>
+        </list>
+        <many-to-one name="location" node="location/@id" entity-name="Location" embed-xml="false"/>
+        <property name="description" node="." type="string"/>
+        <set name="unembedded" embed-xml="false">
+            <key column="x"/>
+            <element type="string" column="y" not-null="true"/>
+        </set>
+    </class>
+
+    <class entity-name="Account" table="`Account`" node="account">
+        <id name="accountId" type="string" node="@id"/>
+        <many-to-one name="customer" column="customerId" entity-name="Customer" cascade="all" embed-xml="true" />
+        <!--not-null="true"-->
+        <property name="balance" type="big_decimal" node="balance" precision="10" scale="2" />
+    </class>
+
+    <class entity-name="Location" node="location">
+        <id name="id" node="@id" type="long">
+            <generator class="increment"/>
+        </id>
+        <property name="address" type="string"/>
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/basic/Account.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/basic/Dom4jTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/basic/Dom4jTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/basic/Dom4jTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,360 @@
+// $Id: Dom4jTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.entitymode.dom4j.basic;
+
+import java.util.Map;
+
+import junit.framework.Test;
+import org.dom4j.DocumentFactory;
+import org.dom4j.Element;
+
+import org.hibernate.EntityMode;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.criterion.Example;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.transform.Transformers;
+import org.hibernate.util.XMLHelper;
+
+/**
+ * @author Gavin King
+ */
+public class Dom4jTest extends FunctionalTestCase {
+
+	public Dom4jTest(String str) {
+		super( str );
+	}
+
+	public String[] getMappings() {
+		return new String[] {
+				"entitymode/dom4j/basic/Account.hbm.xml",
+				"entitymode/dom4j/basic/AB.hbm.xml",
+				"entitymode/dom4j/basic/Employer.hbm.xml"
+		};
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setProperty( Environment.DEFAULT_ENTITY_MODE, EntityMode.DOM4J.toString() );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( Dom4jTest.class );
+	}
+
+// TODO : still need to figure out inheritence support within the DOM4J entity-mode
+//
+//	public void testSubtyping() throws Exception {
+//		Element employer = DocumentFactory.getInstance().createElement( "employer" );
+//		employer.addAttribute( "name", "JBoss" );
+//		Element gavin = employer.addElement( "techie" );
+//		gavin.addAttribute( "name", "Gavin" );
+//		Element ben = employer.addElement( "sales-dude" );
+//		ben.addAttribute( "name", "Ben" );
+//		print( employer );
+//
+//		Session s = openSession();
+//		Transaction t = s.beginTransaction();
+//		s.persist( "Employer", employer );
+//		Long eid = new Long( employer.attributeValue( "id" ) );
+//		t.commit();
+//		s.close();
+//
+//		s = openSession();
+//		t = s.beginTransaction();
+//		employer = (Element) s.get( "Employer", eid );
+//		print( employer );
+//		s.delete( "Employer", employer );
+//		t.commit();
+//		s.close();
+//
+//		Element dept = DocumentFactory.getInstance().createElement( "department" );
+//		dept.addAttribute( "name", "engineering" );
+//		Element steve = dept.addElement( "manager" ).addElement( "techie" );
+//		steve.addAttribute( "name", "Steve" );
+//		print( dept );
+//
+//		s = openSession();
+//		t = s.beginTransaction();
+//		s.persist( "Department", dept );
+//		Long did = new Long( dept.attributeValue( "id" ) );
+//		t.commit();
+//		s.close();
+//
+//		s = openSession();
+//		t = s.beginTransaction();
+//		dept = ( Element ) s.load( "Department", did );
+//		print( dept );
+//		s.delete( "Department", dept );
+//		t.commit();
+//		s.close();
+//	}
+	
+	public void testCompositeId() throws Exception {
+		Element a = DocumentFactory.getInstance().createElement( "a" );
+		a.addAttribute("id", "1");
+		a.addElement("x").setText("foo bar");
+		//Element bs = a.addElement("bs");
+		Element b = a.addElement("b");
+		//b.addElement("bId").setText("1");
+		//b.addElement("aId").setText("1");
+		b.addAttribute("bId", "1");
+		b.addAttribute("aId", "1");
+		b.setText("foo foo");
+		b = a.addElement("b");
+		//b.addElement("bId").setText("2");
+		//b.addElement("aId").setText("1");
+		b.addAttribute("bId", "2");
+		b.addAttribute("aId", "1");
+		b.setText("bar bar");
+		
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist("A", a);
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		a = (Element) s.createCriteria("A").uniqueResult();
+		assertEquals( a.elements("b").size(), 2 );
+		print(a);
+		s.delete("A", a);
+		t.commit();
+		s.close();
+	}
+
+	public void testDom4j() throws Exception {
+		Element acct = DocumentFactory.getInstance().createElement( "account" );
+		acct.addAttribute( "id", "abc123" );
+		acct.addElement( "balance" ).setText( "123.45" );
+		Element cust = acct.addElement( "customer" );
+		cust.addAttribute( "id", "xyz123" );
+		Element foo1 = cust.addElement( "stuff" ).addElement( "foo" );
+		foo1.setText( "foo" );
+		foo1.addAttribute("bar", "x");
+		Element foo2 = cust.element( "stuff" ).addElement( "foo" );
+		foo2.setText( "bar" );
+		foo2.addAttribute("bar", "y");
+		cust.addElement( "amount" ).setText( "45" );
+		cust.setText( "An example customer" );
+		Element name = cust.addElement( "name" );
+		name.addElement( "first" ).setText( "Gavin" );
+		name.addElement( "last" ).setText( "King" );
+
+		Element loc = DocumentFactory.getInstance().createElement( "location" );
+		loc.addElement( "address" ).setText( "Karbarook Avenue" );
+
+		print( acct );
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist( "Location", loc );
+		cust.addElement( "location" ).addAttribute( "id", loc.attributeValue( "id" ) );
+		s.persist( "Account", acct );
+		t.commit();
+		s.close();
+
+		print( loc );
+
+		s = openSession();
+		t = s.beginTransaction();
+		cust = (Element) s.get( "Customer", "xyz123" );
+		print( cust );
+		acct = (Element) s.get( "Account", "abc123" );
+		print( acct );
+		assertEquals( acct.element( "customer" ), cust );
+		cust.element( "name" ).element( "first" ).setText( "Gavin A" );
+		Element foo3 = cust.element("stuff").addElement("foo");
+		foo3.setText("baz");
+		foo3.addAttribute("bar", "z");
+		cust.element("amount").setText("3");
+		cust.addElement("amount").setText("56");
+		t.commit();
+		s.close();
+
+		System.out.println();
+
+		acct.element( "balance" ).setText( "3456.12" );
+		cust.addElement( "address" ).setText( "Karbarook Ave" );
+
+		assertEquals( acct.element( "customer" ), cust );
+
+		cust.setText( "Still the same example!" );
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.saveOrUpdate( "Account", acct );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		cust = (Element) s.get( "Customer", "xyz123" );
+		print( cust );
+		acct = (Element) s.get( "Account", "abc123" );
+		print( acct );
+		assertEquals( acct.element( "customer" ), cust );
+		t.commit();
+		s.close();
+
+		System.out.println();
+
+		s = openSession();
+		t = s.beginTransaction();
+		cust = (Element) s.createCriteria( "Customer" )
+				.add( Example.create( cust ) )
+				.uniqueResult();
+		print( cust );
+		t.commit();
+		s.close();
+
+		System.out.println();
+
+		s = openSession();
+		t = s.beginTransaction();
+		acct = (Element) s.createQuery( "from Account a left join fetch a.customer" )
+				.uniqueResult();
+		print( acct );
+		t.commit();
+		s.close();
+
+		System.out.println();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Map m = (Map) s.createQuery( "select a as acc from Account a left join fetch a.customer" )
+			.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).uniqueResult();
+		acct = (Element)m.get("acc"); 
+		print( acct );
+		t.commit();
+		s.close();
+
+		System.out.println();
+
+		s = openSession();
+		t = s.beginTransaction();
+		acct = (Element) s.createQuery( "from Account" ).uniqueResult();
+		print( acct );
+		t.commit();
+		s.close();
+
+		System.out.println();
+
+		s = openSession();
+		t = s.beginTransaction();
+		cust = (Element) s.createQuery( "from Customer c left join fetch c.stuff" ).uniqueResult();
+		print( cust );
+		t.commit();
+		s.close();
+
+		System.out.println();
+
+		s = openSession();
+		t = s.beginTransaction();
+		cust = (Element) s.createQuery( "from Customer c left join fetch c.morestuff" ).uniqueResult();
+		print( cust );
+		t.commit();
+		s.close();
+
+		System.out.println();
+
+		s = openSession();
+		t = s.beginTransaction();
+		cust = (Element) s.createQuery( "from Customer c left join fetch c.morestuff" ).uniqueResult();
+		print( cust );
+		cust = (Element) s.createQuery( "from Customer c left join fetch c.stuff" ).uniqueResult();
+		print( cust );
+		t.commit();
+		s.close();
+
+		System.out.println();
+
+		s = openSession();
+		t = s.beginTransaction();
+		cust = (Element) s.createQuery( "from Customer c left join fetch c.accounts" ).uniqueResult();
+		Element a1 = cust.element( "accounts" ).addElement( "account" );
+		a1.addElement( "balance" ).setText( "12.67" );
+		a1.addAttribute( "id", "lkj345" );
+		a1.addAttribute("acnum", "0");
+		Element a2 = cust.element( "accounts" ).addElement( "account" );
+		a2.addElement( "balance" ).setText( "10000.00" );
+		a2.addAttribute( "id", "hsh987" );
+		a2.addAttribute("acnum", "1");
+		print( cust );
+		t.commit();
+		s.close();
+
+		System.out.println();
+
+		s = openSession();
+		t = s.beginTransaction();
+		cust = (Element) s.createQuery( "from Customer c left join fetch c.accounts" ).uniqueResult();
+		print( cust );
+		t.commit();
+		s.close();
+
+		// clean up
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete( "Account", acct );
+		s.delete( "Location", loc );
+		s.createQuery( "delete from Account" ).executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	public void testMapIndexEmision() throws Throwable {
+		Element acct = DocumentFactory.getInstance().createElement( "account" );
+		acct.addAttribute( "id", "abc123" );
+		acct.addElement( "balance" ).setText( "123.45" );
+		Element cust = acct.addElement( "customer" );
+		cust.addAttribute( "id", "xyz123" );
+		Element foo1 = cust.addElement( "stuff" ).addElement( "foo" );
+		foo1.setText( "foo" );
+		foo1.addAttribute("bar", "x");
+		Element foo2 = cust.element( "stuff" ).addElement( "foo" );
+		foo2.setText( "bar" );
+		foo2.addAttribute("bar", "y");
+		cust.addElement( "amount" ).setText( "45" );
+		cust.setText( "An example customer" );
+		Element name = cust.addElement( "name" );
+		name.addElement( "first" ).setText( "Gavin" );
+		name.addElement( "last" ).setText( "King" );
+
+		print( acct );
+
+		Element loc = DocumentFactory.getInstance().createElement( "location" );
+		loc.addElement( "address" ).setText( "Karbarook Avenue" );
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist( "Location", loc );
+		cust.addElement( "location" ).addAttribute( "id", loc.attributeValue( "id" ) );
+		s.persist( "Account", acct );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		cust = ( Element ) s.get( "Customer", "xyz123" );
+		print( cust );
+		assertEquals( "Incorrect stuff-map size", 2, cust.element( "stuff" ).elements( "foo" ).size() );
+		Element stuffElement = ( Element ) cust.element( "stuff" ).elements(  "foo" ).get( 0 );
+		assertNotNull( "No map-key value present", stuffElement.attribute( "bar" ) );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete( "Account", acct );
+		s.delete( "Location", loc );
+		t.commit();
+		s.close();
+	}
+
+	public static void print(Element elt) throws Exception {
+		XMLHelper.dump( elt );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/basic/Dom4jTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/basic/Employer.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/basic/Employer.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/basic/Employer.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping>
+
+	<class entity-name="Employer" node="employer">
+		<id name="id" node="@id" type="long">
+			<generator class="increment"/>
+		</id>
+		<property name="name" node="@name" type="string"/>
+		<set name="employees" node="." cascade="all,delete-orphan" fetch="join" lazy="false">
+			<key not-null="true" column="employerId"/>
+			<one-to-many entity-name="Employee" />
+		</set>
+	</class>
+
+	<class entity-name="Employee" node="employee">
+		<id name="id" node="@id" type="long">
+			<generator class="increment"/>
+		</id>
+		<discriminator column="`role`" type="string" length="10"/>
+		<property name="name" node="@name" type="string"/>
+		<subclass entity-name="Techie" node="techie" />
+		<subclass entity-name="Salesdude" node="sales-dude"/>
+	</class>
+
+    <class entity-name="Department" node="department">
+		<id name="id" node="@id" type="long">
+			<generator class="increment"/>
+		</id>
+        <property name="name" node="@name" type="string"/>
+        <many-to-one name="manager" entity-name="Employee" cascade="all" fetch="join" lazy="false" embed-xml="true" node="manager" />
+    </class>
+	
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/basic/Employer.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/component/Component.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/component/Component.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/component/Component.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,49 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.entitymode.dom4j.component;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class Component {
+	private ComponentReference reference;
+
+	public Component() {
+	}
+
+	public Component(ComponentReference reference) {
+		this.reference = reference;
+	}
+
+	public ComponentReference getReference() {
+		return reference;
+	}
+
+	public void setReference(ComponentReference reference) {
+		this.reference = reference;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/component/Component.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/component/ComponentOwner.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/component/ComponentOwner.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/component/ComponentOwner.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,58 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.entitymode.dom4j.component;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class ComponentOwner {
+	private Long id;
+	private Component component;
+
+	public ComponentOwner() {
+	}
+
+	public ComponentOwner(Component component) {
+		this.component = component;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Component getComponent() {
+		return component;
+	}
+
+	public void setComponent(Component component) {
+		this.component = component;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/component/ComponentOwner.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/component/ComponentReference.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/component/ComponentReference.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/component/ComponentReference.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,45 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.entitymode.dom4j.component;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class ComponentReference {
+	private Long id;
+
+	public ComponentReference() {
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/component/ComponentReference.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/component/Dom4jComponentTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/component/Dom4jComponentTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/component/Dom4jComponentTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,79 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.entitymode.dom4j.component;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.Session;
+import org.hibernate.EntityMode;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class Dom4jComponentTest extends FunctionalTestCase {
+	public Dom4jComponentTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "entitymode/dom4j/component/Mapping.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setProperty( Environment.DEFAULT_ENTITY_MODE, EntityMode.DOM4J.toString() );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( Dom4jComponentTest.class );
+	}
+	
+	public void testSetAccessorsFailureExpected() {
+		// An example of part of the issue discussed in HHH-1907
+		Session session = openSession();
+		session.beginTransaction();
+		session.getSession( EntityMode.POJO ).save( new ComponentOwner( new Component( new ComponentReference() ) ) );
+		session.getTransaction().commit();
+		session.close();
+
+		session = openSession();
+		session.beginTransaction();
+		session.createQuery( "from ComponentOwner" ).list();
+		session.getTransaction().commit();
+		session.close();
+
+		session = openSession();
+		session.beginTransaction();
+		session.createQuery( "delete ComponentOwner" ).executeUpdate();
+		session.createQuery( "delete ComponentReference" ).executeUpdate();
+		session.getTransaction().commit();
+		session.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/component/Dom4jComponentTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/component/Mapping.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/component/Mapping.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/component/Mapping.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,49 @@
+<?xml version="1.0"?>
+
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+  ~ Hibernate, Relational Persistence for Idiomatic Java
+  ~
+  ~ Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+  ~ indicated by the @author tags or express copyright attribution
+  ~ statements applied by the authors.  All third-party contributions are
+  ~ distributed under license by Red Hat Middleware LLC.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, as published by the Free Software Foundation.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  ~ or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+  ~ for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public License
+  ~ along with this distribution; if not, write to:
+  ~ Free Software Foundation, Inc.
+  ~ 51 Franklin Street, Fifth Floor
+  ~ Boston, MA  02110-1301  USA
+  ~
+  -->
+
+<hibernate-mapping package="org.hibernate.test.entitymode.dom4j.component">
+
+    <class name="ComponentOwner">
+        <id name="id" type="long" node="@id">
+            <generator class="increment"/>
+        </id>
+        <component name="component" class="Component">
+            <many-to-one name="reference" class="ComponentReference" embed-xml="false" cascade="all"/>
+        </component>
+    </class>
+
+    <class name="ComponentReference">
+        <id name="id" type="long" node="@id">
+            <generator class="increment"/>
+        </id>
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/component/Mapping.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/many2one/Car.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/many2one/Car.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/many2one/Car.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+	
+<hibernate-mapping package="org.hibernate.test.entitymode.dom4j.many2one">
+
+	<class name="Car" lazy="false" node="car">
+		<id name="id" node="@id" type="long">
+			<generator class="increment"/>
+		</id>
+		<property name="model"  type="string" node="model"/>
+		<many-to-one name="carType" node="carType" class="CarType"/>
+		<set name="carParts" node="." cascade="all">
+			<key column="car" not-null="true"/>
+			<one-to-many class="CarPart" node="carPart" embed-xml="false"/>
+		</set>
+	</class>
+	
+	<class name="CarType" lazy="true" node="carType">
+		<id name="id" node="@id" type="long">
+			<generator class="increment"/>
+		</id>
+		<property name="typeName" type="string" node="typeName"/>
+	</class>
+	
+	<class name="CarPart" node="carPart">
+		<id name="id" node="@id" type="long">
+			<generator class="increment"/>
+		</id>
+		<property name="partName" type="string" node="partName"/>
+	</class>
+	
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/many2one/Car.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/many2one/Car.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/many2one/Car.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/many2one/Car.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,58 @@
+package org.hibernate.test.entitymode.dom4j.many2one;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author Paco Hernández
+ */
+public class Car implements java.io.Serializable {
+
+	private long id;
+	private String model;
+	private CarType carType;
+	private Set carParts = new HashSet();
+	
+	/**
+	 * @return Returns the carType.
+	 */
+	public CarType getCarType() {
+		return carType;
+	}
+	/**
+	 * @param carType The carType to set.
+	 */
+	public void setCarType(CarType carType) {
+		this.carType = carType;
+	}
+	/**
+	 * @return Returns the id.
+	 */
+	public long getId() {
+		return id;
+	}
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(long id) {
+		this.id = id;
+	}
+	/**
+	 * @return Returns the model.
+	 */
+	public String getModel() {
+		return model;
+	}
+	/**
+	 * @param model The model to set.
+	 */
+	public void setModel(String model) {
+		this.model = model;
+	}
+	public Set getCarParts() {
+		return carParts;
+	}
+	public void setCarParts(Set carParts) {
+		this.carParts = carParts;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/many2one/Car.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/many2one/CarPart.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/many2one/CarPart.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/many2one/CarPart.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,35 @@
+package org.hibernate.test.entitymode.dom4j.many2one;
+
+/**
+ * @author Paco Hernández
+ */
+public class CarPart implements java.io.Serializable {
+
+	private long id;
+	private String partName;
+
+	/**
+	 * @return Returns the id.
+	 */
+	public long getId() {
+		return id;
+	}
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(long id) {
+		this.id = id;
+	}
+	/**
+	 * @return Returns the typeName.
+	 */
+	public String getPartName() {
+		return partName;
+	}
+	/**
+	 * @param typeName The typeName to set.
+	 */
+	public void setPartName(String typeName) {
+		this.partName = typeName;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/many2one/CarPart.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/many2one/CarType.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/many2one/CarType.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/many2one/CarType.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,35 @@
+package org.hibernate.test.entitymode.dom4j.many2one;
+
+/**
+ * @author Paco Hernández
+ */
+public class CarType implements java.io.Serializable {
+
+	private long id;
+	private String typeName;
+
+	/**
+	 * @return Returns the id.
+	 */
+	public long getId() {
+		return id;
+	}
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(long id) {
+		this.id = id;
+	}
+	/**
+	 * @return Returns the typeName.
+	 */
+	public String getTypeName() {
+		return typeName;
+	}
+	/**
+	 * @param typeName The typeName to set.
+	 */
+	public void setTypeName(String typeName) {
+		this.typeName = typeName;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/many2one/CarType.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/many2one/Dom4jManyToOneTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/many2one/Dom4jManyToOneTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/many2one/Dom4jManyToOneTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,141 @@
+package org.hibernate.test.entitymode.dom4j.many2one;
+
+import java.util.List;
+
+import junit.framework.Test;
+import org.dom4j.Element;
+import org.dom4j.io.OutputFormat;
+import org.dom4j.io.XMLWriter;
+
+import org.hibernate.EntityMode;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Paco Hern�ndez
+ */
+public class Dom4jManyToOneTest extends FunctionalTestCase {
+
+	public Dom4jManyToOneTest(String str) {
+		super( str );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "entitymode/dom4j/many2one/Car.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( Dom4jManyToOneTest.class );
+	}
+	
+	public void testDom4jOneToMany() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		CarType carType = new CarType();
+		carType.setTypeName("Type 1");
+		s.save(carType);
+
+		Car car = new Car();
+		car.setCarType(carType);
+		car.setModel("Model 1");
+		s.save(car);
+		
+		CarPart carPart1 = new CarPart();
+		carPart1.setPartName("chassis");
+		car.getCarParts().add(carPart1);
+		
+		t.commit();
+		s.close();
+
+		s = openSession();
+		Session dom4jSession = s.getSession( EntityMode.DOM4J );
+		t = s.beginTransaction();
+
+		Element element = (Element) dom4jSession.createQuery( "from Car c join fetch c.carParts" ).uniqueResult();
+
+		String expectedResult = "<car id=\"" + 
+			car.getId() + 
+			"\"><carPart>" + 
+			carPart1.getId() +
+			"</carPart><model>Model 1</model><carType id=\"" +
+			carType.getId() +
+			"\"><typeName>Type 1</typeName></carType></car>";
+				
+		print(element);
+		assertTrue(element.asXML().equals(expectedResult));
+		
+		s.createQuery("delete from CarPart").executeUpdate();
+		s.createQuery("delete from Car").executeUpdate();
+		s.createQuery("delete from CarType").executeUpdate();
+		
+		t.commit();
+		s.close();
+	}
+
+	public void testDom4jManyToOne() throws Exception {
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		CarType carType = new CarType();
+		carType.setTypeName("Type 1");
+		s.save(carType);
+
+		Car car1 = new Car();
+		car1.setCarType(carType);
+		car1.setModel("Model 1");
+		s.save(car1);
+		
+		Car car2 = new Car();
+		car2.setCarType(carType);
+		car2.setModel("Model 2");
+		s.save(car2);
+		
+		t.commit();
+		s.close();
+
+		s = openSession();
+		Session dom4jSession = s.getSession( EntityMode.DOM4J );
+		t = s.beginTransaction();
+
+		List list = dom4jSession.createQuery( "from Car c join fetch c.carType order by c.model asc" ).list();
+
+		String[] expectedResults = new String[] {
+				"<car id=\"" + 
+				car1.getId() +
+				"\"><model>Model 1</model><carType id=\"" + 
+				carType.getId() +
+				"\"><typeName>Type 1</typeName></carType></car>",
+				"<car id=\"" + 
+				car2.getId() +
+				"\"><model>Model 2</model><carType id=\"" +
+				carType.getId() +
+				"\"><typeName>Type 1</typeName></carType></car>"
+		};
+				
+		for (int i = 0; i < list.size(); i++) {
+			Element element = (Element) list.get(i);
+
+			print(element);
+			assertTrue(element.asXML().equals(expectedResults[i]));
+		}
+		
+		s.createQuery("delete from Car").executeUpdate();
+		s.createQuery("delete from CarType").executeUpdate();
+		
+		t.commit();
+		s.close();
+	}
+
+	public static void print(Element elt) throws Exception {
+		OutputFormat outformat = OutputFormat.createPrettyPrint();
+		// outformat.setEncoding(aEncodingScheme);
+		XMLWriter writer = new XMLWriter( System.out, outformat );
+		writer.write( elt );
+		writer.flush();
+		// System.out.println( elt.asXML() );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/dom4j/many2one/Dom4jManyToOneTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/map/basic/DynamicClassTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/map/basic/DynamicClassTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/map/basic/DynamicClassTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,109 @@
+//$Id: DynamicClassTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.entitymode.map.basic;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.Test;
+
+import org.hibernate.EntityMode;
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class DynamicClassTest extends FunctionalTestCase {
+	
+	public DynamicClassTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "entitymode/map/basic/ProductLine.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setProperty(Environment.DEFAULT_ENTITY_MODE, EntityMode.MAP.toString());
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( DynamicClassTest.class );
+	}
+
+	public void testLazyDynamicClass() {
+		Session s = openSession();
+		assertTrue( "Incorrectly handled default_entity_mode", s.getEntityMode() == EntityMode.MAP );
+		Session other = s.getSession( EntityMode.MAP );
+		assertEquals( "openSession() using same entity-mode returned new session", s, other );
+
+		other = s.getSession( EntityMode.POJO );
+		other.close();
+		assertTrue( !other.isOpen() );
+// this is no longer allowed since the session does much more up-front closed checking
+//		assertTrue( other.isConnected() );  // because it is linked to the "root" session's connection
+
+		s.close();
+
+		s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Map cars = new HashMap();
+		cars.put("description", "Cars");
+		Map monaro = new HashMap();
+		monaro.put("productLine", cars);
+		monaro.put("name", "monaro");
+		monaro.put("description", "Holden Monaro");
+		Map hsv = new HashMap();
+		hsv.put("productLine", cars);
+		hsv.put("name", "hsv");
+		hsv.put("description", "Holden Commodore HSV");
+		List models = new ArrayList();
+		cars.put("models", models);
+		models.add(hsv);
+		models.add(monaro);
+		s.save("ProductLine", cars);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		
+		cars = (Map) s.createQuery("from ProductLine pl order by pl.description").uniqueResult();
+		models = (List) cars.get("models");
+		assertFalse( Hibernate.isInitialized(models) );
+		assertEquals( models.size(), 2);
+		assertTrue( Hibernate.isInitialized(models) );
+		
+		s.clear();
+		
+		List list = s.createQuery("from Model m").list();
+		for ( Iterator i=list.iterator(); i.hasNext(); ) {
+			assertFalse( Hibernate.isInitialized( ( (Map) i.next() ).get("productLine") ) );
+		}
+		Map model = (Map) list.get(0);
+		assertTrue( ( (List) ( (Map) model.get("productLine") ).get("models") ).contains(model) );
+		s.clear();
+		
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		cars = (Map) s.createQuery("from ProductLine pl order by pl.description").uniqueResult();
+		s.delete(cars);
+		t.commit();
+		s.close();
+	}
+
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/map/basic/DynamicClassTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/map/basic/ProductLine.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/map/basic/ProductLine.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/map/basic/ProductLine.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,38 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping>
+
+<!-- 
+    This mapping demonstrates "dynamic" entities.
+-->
+
+	<class entity-name="ProductLine">
+    	<id name="id" column="productId" length="32" type="string">
+    		<generator class="uuid.hex"/>
+    	</id>
+
+    	<property name="description" not-null="true" length="200" type="string"/>
+
+    	<!-- don't use sets for associations, unless you want stack overflows! -->
+    	<bag name="models" cascade="all" inverse="true">
+            <key column="productId"/>
+    		<one-to-many class="Model"/>
+    	</bag>
+
+	</class>
+
+    <class entity-name="Model">
+    	<id name="id" column="modelId" length="32" type="string">
+    		<generator class="uuid.hex"/>
+    	</id>
+    	
+    	<property name="name" not-null="true" length="25" type="string"/>
+    	<property name="description" not-null="true" length="200" type="string"/>
+    	<many-to-one name="productLine" column="productId" not-null="true" class="ProductLine"/>
+    	
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/map/basic/ProductLine.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/map/subclass/Mappings.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/map/subclass/Mappings.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/map/subclass/Mappings.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,42 @@
+<?xml version="1.0"?>
+
+<!--
+  ~ Hibernate, Relational Persistence for Idiomatic Java
+  ~
+  ~ Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+  ~ indicated by the @author tags or express copyright attribution
+  ~ statements applied by the authors.  All third-party contributions are
+  ~ distributed under license by Red Hat Middleware LLC.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, as published by the Free Software Foundation.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  ~ or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+  ~ for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public License
+  ~ along with this distribution; if not, write to:
+  ~ Free Software Foundation, Inc.
+  ~ 51 Franklin Street, Fifth Floor
+  ~ Boston, MA  02110-1301  USA
+  -->
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping>
+
+    <class entity-name="Superclass" discriminator-value="A">
+        <id name="id" type="integer"><generator class="native"/></id>
+        <discriminator column="DISC" type="string" />
+        <property name="dataA" type="string"/>
+
+        <subclass entity-name="Subclass" discriminator-value="B">
+            <property name="dataB" type="string"/>
+        </subclass>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/map/subclass/Mappings.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/map/subclass/SubclassDynamicMapTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/map/subclass/SubclassDynamicMapTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/map/subclass/SubclassDynamicMapTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,58 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.entitymode.map.subclass;
+
+import java.util.HashMap;
+
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.Session;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class SubclassDynamicMapTest extends FunctionalTestCase {
+	public SubclassDynamicMapTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "entitymode/map/subclass/Mappings.hbm.xml" };
+	}
+
+	public void testConcreateSubclassDeterminationOnEmptyDynamicMap() {
+		Session s = openSession();
+		s.beginTransaction();
+		s.persist( "Superclass", new HashMap() );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.createQuery( "delete Superclass" ).executeUpdate();
+		s.getTransaction().commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/map/subclass/SubclassDynamicMapTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/multi/MultiRepresentationTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/multi/MultiRepresentationTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/multi/MultiRepresentationTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,193 @@
+// $Id: MultiRepresentationTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.entitymode.multi;
+
+import java.sql.Date;
+import java.util.Iterator;
+import java.util.List;
+
+import junit.framework.Test;
+import org.dom4j.DocumentFactory;
+import org.dom4j.Element;
+import org.dom4j.io.OutputFormat;
+import org.dom4j.io.XMLWriter;
+
+import org.hibernate.EntityMode;
+import org.hibernate.Transaction;
+import org.hibernate.classic.Session;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Implementation of MultiRepresentationTest.
+ *
+ * @author Steve Ebersole
+ */
+public class MultiRepresentationTest extends FunctionalTestCase {
+
+
+	public MultiRepresentationTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "entitymode/multi/Stock.hbm.xml", "entitymode/multi/Valuation.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( MultiRepresentationTest.class );
+	}
+
+	public void testPojoRetreival() {
+		TestData testData = new TestData();
+		testData.create();
+
+		Session session = openSession();
+		Transaction txn = session.beginTransaction();
+
+		Stock stock = ( Stock ) session.get( Stock.class, new Long( 1 ) );
+		assertEquals( "Something wrong!", new Long( 1 ), stock.getId() );
+
+		txn.commit();
+		session.close();
+
+		testData.destroy();
+	}
+
+	public void testDom4jRetreival() {
+		TestData testData = new TestData();
+		testData.create();
+
+		Session session = openSession();
+		Transaction txn = session.beginTransaction();
+		org.hibernate.Session dom4j = session.getSession( EntityMode.DOM4J );
+
+		Object rtn = dom4j.get( Stock.class.getName(), testData.stockId );
+		Element element = ( Element ) rtn;
+
+		assertEquals( "Something wrong!", testData.stockId, Long.valueOf( element.attributeValue( "id" ) ) );
+
+		System.out.println( "**** XML: ****************************************************" );
+		prettyPrint( element );
+		System.out.println( "**************************************************************" );
+
+		Element currVal = element.element( "currentValuation" );
+
+		System.out.println( "**** XML: ****************************************************" );
+		prettyPrint( currVal );
+		System.out.println( "**************************************************************" );
+
+		txn.rollback();
+		session.close();
+
+		testData.destroy();
+	}
+
+	public void testDom4jSave() {
+		TestData testData = new TestData();
+		testData.create();
+
+		Session pojos = openSession();
+		Transaction txn = pojos.beginTransaction();
+		org.hibernate.Session dom4j = pojos.getSession( EntityMode.DOM4J );
+
+		Element stock = DocumentFactory.getInstance().createElement( "stock" );
+		stock.addElement( "tradeSymbol" ).setText( "IBM" );
+
+		Element val = stock.addElement( "currentValuation" ).addElement( "valuation" );
+		val.appendContent( stock );
+		val.addElement( "valuationDate" ).setText( new java.util.Date().toString() );
+		val.addElement( "value" ).setText( "121.00" );
+
+		dom4j.save( Stock.class.getName(), stock );
+		dom4j.flush();
+
+		txn.rollback();
+		pojos.close();
+
+		assertTrue( !pojos.isOpen() );
+		assertTrue( !dom4j.isOpen() );
+
+		prettyPrint( stock );
+
+		testData.destroy();
+	}
+
+	public void testDom4jHQL() {
+		TestData testData = new TestData();
+		testData.create();
+
+		Session session = openSession();
+		Transaction txn = session.beginTransaction();
+		org.hibernate.Session dom4j = session.getSession( EntityMode.DOM4J );
+
+		List result = dom4j.createQuery( "from Stock" ).list();
+
+		assertEquals( "Incorrect result size", 1, result.size() );
+		Element element = ( Element ) result.get( 0 );
+		assertEquals( "Something wrong!", testData.stockId, Long.valueOf( element.attributeValue( "id" ) ) );
+
+		System.out.println( "**** XML: ****************************************************" );
+		prettyPrint( element );
+		System.out.println( "**************************************************************" );
+
+		txn.rollback();
+		session.close();
+
+		testData.destroy();
+	}
+
+	private class TestData {
+		private Long stockId;
+
+		private void create() {
+			Session session = getSessions().openSession();
+			session.beginTransaction();
+			Stock stock = new Stock();
+			stock.setTradeSymbol( "JBOSS" );
+			Valuation valuation = new Valuation();
+			valuation.setStock( stock );
+			valuation.setValuationDate( new Date( new java.util.Date().getTime() ) );
+			valuation.setValue( new Double( 200.0 ) );
+			stock.setCurrentValuation( valuation );
+			stock.getValuations().add( valuation );
+
+			session.save( stock );
+			session.save( valuation );
+
+			session.getTransaction().commit();
+			session.close();
+
+			stockId = stock.getId();
+		}
+
+		private void destroy() {
+			Session session = getSessions().openSession();
+			session.beginTransaction();
+			Iterator stocks = session.createQuery( "from Stock" ).list().iterator();
+			while ( stocks.hasNext() ) {
+				final Stock stock = ( Stock ) stocks.next();
+				stock.setCurrentValuation( null );
+				session.flush();
+				Iterator valuations = stock.getValuations().iterator();
+				while ( valuations.hasNext() ) {
+					session.delete( valuations.next() );
+				}
+				session.delete( stock );
+			}
+			session.getTransaction().commit();
+			session.close();
+		}
+	}
+
+	private void prettyPrint(Element element) {
+		//System.out.println( element.asXML() );
+		try {
+			OutputFormat format = OutputFormat.createPrettyPrint();
+			new XMLWriter( System.out, format ).write( element );
+			System.out.println();
+		}
+		catch ( Throwable t ) {
+			System.err.println( "Unable to pretty print element : " + t );
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/multi/MultiRepresentationTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/multi/Stock.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/multi/Stock.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/multi/Stock.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping
+        SYSTEM
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<hibernate-mapping package="org.hibernate.test.entitymode.multi">
+
+	<class table="STOCK" name="Stock" node="stock">
+
+		<id name="id" column="STOCK_ID" node="@id">
+			<generator class="increment"/>
+		</id>
+
+		<property name="tradeSymbol" type="string" column="SYMBOL"/>
+
+		<many-to-one name="currentValuation" class="Valuation" column="CURR_VAL_ID" cascade="all" />
+
+		<set name="valuations" cascade="all" lazy="true">
+			<key column="STOCK_ID"/>
+			<one-to-many class="Valuation"/>
+		</set>
+	</class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/multi/Stock.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/multi/Stock.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/multi/Stock.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/multi/Stock.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,49 @@
+// $Id: Stock.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.entitymode.multi;
+
+import java.util.Set;
+import java.util.HashSet;
+
+/**
+ * POJO implementation of Stock entity.
+ *
+ * @author Steve Ebersole
+ */
+public class Stock {
+	private Long id;
+	private String tradeSymbol;
+	private Valuation currentValuation;
+	private Set valuations = new HashSet();
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getTradeSymbol() {
+		return tradeSymbol;
+	}
+
+	public void setTradeSymbol(String tradeSymbol) {
+		this.tradeSymbol = tradeSymbol;
+	}
+
+	public Valuation getCurrentValuation() {
+		return currentValuation;
+	}
+
+	public void setCurrentValuation(Valuation currentValuation) {
+		this.currentValuation = currentValuation;
+	}
+
+	public Set getValuations() {
+		return valuations;
+	}
+
+	public void setValuations(Set valuations) {
+		this.valuations = valuations;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/multi/Stock.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/multi/Valuation.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/multi/Valuation.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/multi/Valuation.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping
+        SYSTEM
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<hibernate-mapping package="org.hibernate.test.entitymode.multi">
+
+	<class table="STOCK_VAL" name="Valuation" node="valuation">
+
+		<id name="id" column="VAL_ID" node="@id">
+			<generator class="increment"/>
+		</id>
+
+		<many-to-one name="stock" embed-xml="false"
+			class="Stock" column="STOCK_ID" cascade="none" />
+
+		<property name="valuationDate" type="date" column="DT"/>
+		<property name="value" type="double" column="VAL"/>
+
+	</class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/multi/Valuation.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/multi/Valuation.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/multi/Valuation.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/multi/Valuation.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,48 @@
+// $Id: Valuation.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.entitymode.multi;
+
+import java.util.Date;
+
+/**
+ * Implementation of Valuation.
+ *
+ * @author Steve Ebersole
+ */
+public class Valuation {
+	private Long id;
+	private Stock stock;
+	private Date valuationDate;
+	private Double value;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Stock getStock() {
+		return stock;
+	}
+
+	public void setStock(Stock stock) {
+		this.stock = stock;
+	}
+
+	public Date getValuationDate() {
+		return valuationDate;
+	}
+
+	public void setValuationDate(Date valuationDate) {
+		this.valuationDate = valuationDate;
+	}
+
+	public Double getValue() {
+		return value;
+	}
+
+	public void setValue(Double value) {
+		this.value = value;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/entitymode/multi/Valuation.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/AbstractCollectionEventTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/AbstractCollectionEventTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/AbstractCollectionEventTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,783 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution statements
+ * applied by the authors.
+ * 
+ * All third-party contributions are distributed under license by Red Hat
+ * Middleware LLC.  This copyrighted material is made available to anyone
+ * wishing to use, modify, copy, or redistribute it subject to the terms
+ * and conditions of the GNU Lesser General Public License, as published by
+ * the Free Software Foundation.  This program is distributed in the hope
+ * that it will be useful, but WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * See the GNU Lesser General Public License for more details.  You should
+ * have received a copy of the GNU Lesser General Public License along with
+ * this distribution; if not, write to: Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.event.collection;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.collection.PersistentCollection;
+import org.hibernate.collection.PersistentSet;
+import org.hibernate.event.AbstractCollectionEvent;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.test.event.collection.association.bidirectional.manytomany.ChildWithBidirectionalManyToMany;
+
+/**
+ *
+ * @author Gail Badner
+ */
+public abstract class AbstractCollectionEventTest extends FunctionalTestCase {
+
+	public AbstractCollectionEventTest(String string) {
+		super( string );
+	}
+
+	public abstract String[] getMappings();
+
+	public abstract ParentWithCollection createParent(String name);
+
+	public abstract Collection createCollection();
+
+	protected void cleanupTest() {
+		ParentWithCollection dummyParent = createParent( "dummyParent" );
+		dummyParent.newChildren( createCollection() );
+		Child dummyChild = dummyParent.addChild( "dummyChild" );
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		List children = s.createCriteria( dummyChild.getClass() ).list();
+		List parents = s.createCriteria( dummyParent.getClass() ).list();
+		for ( Iterator it = parents.iterator(); it.hasNext(); ) {
+			ParentWithCollection parent = ( ParentWithCollection ) it.next();
+			parent.clearChildren();
+			s.delete( parent );
+		}
+		for ( Iterator it = children.iterator(); it.hasNext(); ) {
+			s.delete( it.next() );
+		}
+		tx.commit();
+		s.close();
+	}
+
+	public void testSaveParentEmptyChildren() {
+		CollectionListeners listeners = new CollectionListeners( getSessions() );
+		ParentWithCollection parent = createParentWithNoChildren( "parent" );
+		assertEquals( 0, parent.getChildren().size() );
+		int index = 0;
+		checkResult( listeners, listeners.getPreCollectionRecreateListener(), parent, index++ );
+		checkResult( listeners, listeners.getPostCollectionRecreateListener(), parent, index++ );
+		checkNumberOfResults( listeners, index );
+		listeners.clear();
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		parent = ( ParentWithCollection ) s.get( parent.getClass(), parent.getId() );
+		tx.commit();
+		s.close();
+		assertNotNull( parent.getChildren() );
+		checkNumberOfResults( listeners, 0 );
+	}
+
+	public void testSaveParentOneChild() {
+		CollectionListeners listeners = new CollectionListeners( getSessions() );
+		ParentWithCollection parent = createParentWithOneChild( "parent", "child" );
+		int index = 0;
+		checkResult( listeners, listeners.getPreCollectionRecreateListener(), parent, index++ );
+		checkResult( listeners, listeners.getPostCollectionRecreateListener(), parent, index++ );
+		Child child = ( Child ) parent.getChildren().iterator().next();
+		if ( child instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getPreCollectionRecreateListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
+			checkResult( listeners, listeners.getPostCollectionRecreateListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
+		}
+		checkNumberOfResults( listeners, index );
+	}
+
+	public void testUpdateParentNullToOneChild() {
+		CollectionListeners listeners = new CollectionListeners( getSessions() );
+		ParentWithCollection parent = createParentWithNullChildren( "parent" );
+		listeners.clear();
+		assertNull( parent.getChildren() );
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		parent = ( ParentWithCollection ) s.get( parent.getClass(), parent.getId() );
+		assertNotNull( parent.getChildren() );
+		Child newChild = parent.addChild( "new" );
+		tx.commit();
+		s.close();
+		int index = 0;
+		if ( ( ( PersistentCollection ) parent.getChildren() ).wasInitialized() ) {
+			checkResult( listeners, listeners.getInitializeCollectionListener(), parent, index++ );
+		}
+		checkResult( listeners, listeners.getPreCollectionUpdateListener(), parent, index++ );
+		checkResult( listeners, listeners.getPostCollectionUpdateListener(), parent, index++ );
+		if ( newChild instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getPreCollectionRecreateListener(), ( ChildWithBidirectionalManyToMany ) newChild, index++ );
+			checkResult( listeners, listeners.getPostCollectionRecreateListener(), ( ChildWithBidirectionalManyToMany ) newChild, index++ );
+		}
+		checkNumberOfResults( listeners, index );
+	}
+
+	public void testUpdateParentNoneToOneChild() {
+		CollectionListeners listeners = new CollectionListeners( getSessions() );
+		ParentWithCollection parent = createParentWithNoChildren( "parent" );
+		listeners.clear();
+		assertEquals( 0, parent.getChildren().size() );
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		parent = ( ParentWithCollection ) s.get( parent.getClass(), parent.getId() );
+		Child newChild = parent.addChild( "new" );
+		tx.commit();
+		s.close();
+		int index = 0;
+		if ( ( ( PersistentCollection ) parent.getChildren() ).wasInitialized() ) {
+			checkResult( listeners, listeners.getInitializeCollectionListener(), parent, index++ );
+		}
+		checkResult( listeners, listeners.getPreCollectionUpdateListener(), parent, index++ );
+		checkResult( listeners, listeners.getPostCollectionUpdateListener(), parent, index++ );
+		if ( newChild instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getPreCollectionRecreateListener(), ( ChildWithBidirectionalManyToMany ) newChild, index++ );
+			checkResult( listeners, listeners.getPostCollectionRecreateListener(), ( ChildWithBidirectionalManyToMany ) newChild, index++ );
+		}
+		checkNumberOfResults( listeners, index );
+	}
+
+	public void testUpdateParentOneToTwoChildren() {
+		CollectionListeners listeners = new CollectionListeners( getSessions() );
+		ParentWithCollection parent = createParentWithOneChild( "parent", "child" );
+		assertEquals( 1, parent.getChildren().size() );
+		listeners.clear();
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		parent = ( ParentWithCollection ) s.get( parent.getClass(), parent.getId() );
+		Child newChild = parent.addChild( "new2" );
+		tx.commit();
+		s.close();
+		int index = 0;
+		if ( ( ( PersistentCollection ) parent.getChildren() ).wasInitialized() ) {
+			checkResult( listeners, listeners.getInitializeCollectionListener(), parent, index++ );
+		}
+		checkResult( listeners, listeners.getPreCollectionUpdateListener(), parent, index++ );
+		checkResult( listeners, listeners.getPostCollectionUpdateListener(), parent, index++ );
+		if ( newChild instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getPreCollectionRecreateListener(), ( ChildWithBidirectionalManyToMany ) newChild, index++ );
+			checkResult( listeners, listeners.getPostCollectionRecreateListener(), ( ChildWithBidirectionalManyToMany ) newChild, index++ );
+		}
+		checkNumberOfResults( listeners, index );
+	}
+
+	public void testUpdateParentOneToTwoSameChildren() {
+		CollectionListeners listeners = new CollectionListeners( getSessions() );
+		ParentWithCollection parent = createParentWithOneChild( "parent", "child" );
+		Child child = ( Child ) parent.getChildren().iterator().next();
+		assertEquals( 1, parent.getChildren().size() );
+		listeners.clear();
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		parent = ( ParentWithCollection ) s.get( parent.getClass(), parent.getId() );
+		if ( child instanceof Entity ) {
+			child = ( Child ) s.get( child.getClass(), ( ( Entity ) child ).getId() );
+		}
+		parent.addChild( child );
+		tx.commit();
+		s.close();
+		int index = 0;
+		if ( ( ( PersistentCollection ) parent.getChildren() ).wasInitialized() ) {
+			checkResult( listeners, listeners.getInitializeCollectionListener(), parent, index++ );
+		}
+		ChildWithBidirectionalManyToMany childWithManyToMany = null;
+		if ( child instanceof ChildWithBidirectionalManyToMany ) {
+			childWithManyToMany = ( ChildWithBidirectionalManyToMany ) child;
+			if ( ( ( PersistentCollection ) childWithManyToMany.getParents() ).wasInitialized() ) {
+				checkResult( listeners, listeners.getInitializeCollectionListener(), childWithManyToMany, index++ );
+			}
+		}
+		if ( !( parent.getChildren() instanceof PersistentSet ) ) {
+			checkResult( listeners, listeners.getPreCollectionUpdateListener(), parent, index++ );
+			checkResult( listeners, listeners.getPostCollectionUpdateListener(), parent, index++ );
+		}
+		if ( childWithManyToMany != null && !( childWithManyToMany.getParents() instanceof PersistentSet ) ) {
+			checkResult( listeners, listeners.getPreCollectionUpdateListener(), childWithManyToMany, index++ );
+			checkResult( listeners, listeners.getPostCollectionUpdateListener(), childWithManyToMany, index++ );
+		}
+		checkNumberOfResults( listeners, index );
+	}
+
+	public void testUpdateParentNullToOneChildDiffCollection() {
+		CollectionListeners listeners = new CollectionListeners( getSessions() );
+		ParentWithCollection parent = createParentWithNullChildren( "parent" );
+		listeners.clear();
+		assertNull( parent.getChildren() );
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		parent = ( ParentWithCollection ) s.get( parent.getClass(), parent.getId() );
+		Collection collectionOrig = parent.getChildren();
+		parent.newChildren( createCollection() );
+		Child newChild = parent.addChild( "new" );
+		tx.commit();
+		s.close();
+		int index = 0;
+		if ( ( ( PersistentCollection ) collectionOrig ).wasInitialized() ) {
+			checkResult( listeners, listeners.getInitializeCollectionListener(), parent, collectionOrig, index++ );
+		}
+		checkResult( listeners, listeners.getPreCollectionRemoveListener(), parent, collectionOrig, index++ );
+		checkResult( listeners, listeners.getPostCollectionRemoveListener(), parent, collectionOrig, index++ );
+		if ( newChild instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getPreCollectionRecreateListener(), ( ChildWithBidirectionalManyToMany ) newChild, index++ );
+			checkResult( listeners, listeners.getPostCollectionRecreateListener(), ( ChildWithBidirectionalManyToMany ) newChild, index++ );
+		}
+		checkResult( listeners, listeners.getPreCollectionRecreateListener(), parent, index++ );
+		checkResult( listeners, listeners.getPostCollectionRecreateListener(), parent, index++ );
+		checkNumberOfResults( listeners, index );
+	}
+
+	public void testUpdateParentNoneToOneChildDiffCollection() {
+		CollectionListeners listeners = new CollectionListeners( getSessions() );
+		ParentWithCollection parent = createParentWithNoChildren( "parent" );
+		listeners.clear();
+		assertEquals( 0, parent.getChildren().size() );
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		parent = ( ParentWithCollection ) s.get( parent.getClass(), parent.getId() );
+		Collection oldCollection = parent.getChildren();
+		parent.newChildren( createCollection() );
+		Child newChild = parent.addChild( "new" );
+		tx.commit();
+		s.close();
+		int index = 0;
+		if ( ( ( PersistentCollection ) oldCollection ).wasInitialized() ) {
+			checkResult( listeners, listeners.getInitializeCollectionListener(), parent, oldCollection, index++ );
+		}
+		checkResult( listeners, listeners.getPreCollectionRemoveListener(), parent, oldCollection, index++ );
+		checkResult( listeners, listeners.getPostCollectionRemoveListener(), parent, oldCollection, index++ );
+		if ( newChild instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getPreCollectionRecreateListener(), ( ChildWithBidirectionalManyToMany ) newChild, index++ );
+			checkResult( listeners, listeners.getPostCollectionRecreateListener(), ( ChildWithBidirectionalManyToMany ) newChild, index++ );
+		}
+		checkResult( listeners, listeners.getPreCollectionRecreateListener(), parent, index++ );
+		checkResult( listeners, listeners.getPostCollectionRecreateListener(), parent, index++ );
+		checkNumberOfResults( listeners, index );
+	}
+
+	public void testUpdateParentOneChildDiffCollectionSameChild() {
+		CollectionListeners listeners = new CollectionListeners( getSessions() );
+		ParentWithCollection parent = createParentWithOneChild( "parent", "child" );
+		Child child = ( Child ) parent.getChildren().iterator().next();
+		listeners.clear();
+		assertEquals( 1, parent.getChildren().size() );
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		parent = ( ParentWithCollection ) s.get( parent.getClass(), parent.getId() );
+		if ( child instanceof Entity ) {
+			child = ( Child ) s.get( child.getClass(), ( ( Entity ) child).getId() );
+		}
+		Collection oldCollection = parent.getChildren();
+		parent.newChildren( createCollection() );
+		parent.addChild( child );
+		tx.commit();
+		s.close();
+		int index = 0;
+		if ( ( ( PersistentCollection ) oldCollection ).wasInitialized() ) {
+			checkResult( listeners, listeners.getInitializeCollectionListener(), parent, oldCollection, index++ );
+		}
+		if ( child instanceof ChildWithBidirectionalManyToMany ) {
+			ChildWithBidirectionalManyToMany childWithManyToMany = ( ChildWithBidirectionalManyToMany ) child;
+			if ( ( ( PersistentCollection ) childWithManyToMany.getParents() ).wasInitialized() ) {
+				checkResult( listeners, listeners.getInitializeCollectionListener(), childWithManyToMany, index++ );
+			}
+		}
+		checkResult( listeners, listeners.getPreCollectionRemoveListener(), parent, oldCollection, index++ );
+		checkResult( listeners, listeners.getPostCollectionRemoveListener(), parent, oldCollection, index++ );
+		if ( child instanceof ChildWithBidirectionalManyToMany ) {
+			// hmmm, the same parent was removed and re-added to the child's collection;
+			// should this be considered an update?
+			checkResult( listeners, listeners.getPreCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
+			checkResult( listeners, listeners.getPostCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
+		}
+		checkResult( listeners, listeners.getPreCollectionRecreateListener(), parent, index++ );
+		checkResult( listeners, listeners.getPostCollectionRecreateListener(), parent, index++ );
+		checkNumberOfResults( listeners, index );
+	}
+
+	public void testUpdateParentOneChildDiffCollectionDiffChild() {
+		CollectionListeners listeners = new CollectionListeners( getSessions() );
+		ParentWithCollection parent = createParentWithOneChild( "parent", "child" );
+		Child oldChild = ( Child ) parent.getChildren().iterator().next();
+		listeners.clear();
+		assertEquals( 1, parent.getChildren().size() );
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		parent = ( ParentWithCollection ) s.get( parent.getClass(), parent.getId() );
+		if ( oldChild instanceof Entity ) {
+			oldChild = ( Child ) s.get( oldChild.getClass(), ( ( Entity ) oldChild).getId() );
+		}
+		Collection oldCollection = parent.getChildren();
+		parent.newChildren( createCollection() );
+		Child newChild = parent.addChild( "new1" );
+		tx.commit();
+		s.close();
+		int index = 0;
+		if ( ( ( PersistentCollection ) oldCollection ).wasInitialized() ) {
+			checkResult( listeners, listeners.getInitializeCollectionListener(), parent, oldCollection, index++ );
+		}
+		if ( oldChild instanceof ChildWithBidirectionalManyToMany ) {
+			ChildWithBidirectionalManyToMany oldChildWithManyToMany = ( ChildWithBidirectionalManyToMany ) oldChild;
+			if ( ( ( PersistentCollection ) oldChildWithManyToMany.getParents() ).wasInitialized() ) {
+				checkResult( listeners, listeners.getInitializeCollectionListener(), oldChildWithManyToMany, index++ );
+			}
+		}
+		checkResult( listeners, listeners.getPreCollectionRemoveListener(), parent, oldCollection, index++ );
+		checkResult( listeners, listeners.getPostCollectionRemoveListener(), parent, oldCollection, index++ );
+		if ( oldChild instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getPreCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) oldChild, index++ );
+			checkResult( listeners, listeners.getPostCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) oldChild, index++ );
+			checkResult( listeners, listeners.getPreCollectionRecreateListener(), ( ChildWithBidirectionalManyToMany ) newChild, index++ );
+			checkResult( listeners, listeners.getPostCollectionRecreateListener(), ( ChildWithBidirectionalManyToMany ) newChild, index++ );
+		}
+		checkResult( listeners, listeners.getPreCollectionRecreateListener(), parent, index++ );
+		checkResult( listeners, listeners.getPostCollectionRecreateListener(), parent, index++ );
+		checkNumberOfResults( listeners, index );
+	}
+
+	public void testUpdateParentOneChildToNoneByRemove() {
+		CollectionListeners listeners = new CollectionListeners( getSessions() );
+		ParentWithCollection parent = createParentWithOneChild( "parent", "child" );
+		assertEquals( 1, parent.getChildren().size() );
+		Child child = ( Child ) parent.getChildren().iterator().next();
+		listeners.clear();
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		parent = ( ParentWithCollection ) s.get( parent.getClass(), parent.getId() );
+		if ( child instanceof Entity ) {
+			child = ( Child ) s.get( child.getClass(), ( ( Entity ) child ).getId() );
+		}
+		parent.removeChild( child );
+		tx.commit();
+		s.close();
+		int index = 0;
+		if ( ( ( PersistentCollection ) parent.getChildren() ).wasInitialized() ) {
+			checkResult( listeners, listeners.getInitializeCollectionListener(), parent, index++ );
+		}
+		if ( child instanceof ChildWithBidirectionalManyToMany ) {
+			ChildWithBidirectionalManyToMany childWithManyToMany = ( ChildWithBidirectionalManyToMany ) child;
+			if ( ( ( PersistentCollection ) childWithManyToMany.getParents( ) ).wasInitialized() ) {
+				checkResult( listeners, listeners.getInitializeCollectionListener(), childWithManyToMany, index++ );
+			}
+		}
+		checkResult( listeners, listeners.getPreCollectionUpdateListener(), parent, index++ );
+		checkResult( listeners, listeners.getPostCollectionUpdateListener(), parent, index++ );
+		if ( child instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getPreCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
+			checkResult( listeners, listeners.getPostCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
+		}
+		checkNumberOfResults( listeners, index );
+	}
+
+	public void testUpdateParentOneChildToNoneByClear() {
+		CollectionListeners listeners = new CollectionListeners( getSessions() );
+		ParentWithCollection parent = createParentWithOneChild( "parent", "child" );
+		assertEquals( 1, parent.getChildren().size() );
+		Child child = ( Child ) parent.getChildren().iterator().next();
+		listeners.clear();
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		parent = ( ParentWithCollection ) s.get( parent.getClass(), parent.getId() );
+		if ( child instanceof Entity ) {
+			child = ( Child ) s.get( child.getClass(), ( ( Entity ) child ).getId() );
+		}
+		parent.clearChildren();
+		tx.commit();
+		s.close();
+		int index = 0;
+		if ( ( ( PersistentCollection ) parent.getChildren() ).wasInitialized() ) {
+			checkResult( listeners, listeners.getInitializeCollectionListener(), parent, index++ );
+		}
+		if ( child instanceof ChildWithBidirectionalManyToMany ) {
+			ChildWithBidirectionalManyToMany childWithManyToMany = ( ChildWithBidirectionalManyToMany ) child;
+			if ( ( ( PersistentCollection ) childWithManyToMany.getParents() ).wasInitialized() ) {
+				checkResult( listeners, listeners.getInitializeCollectionListener(), childWithManyToMany, index++ );
+			}
+		}
+		checkResult( listeners, listeners.getPreCollectionUpdateListener(), parent, index++ );
+		checkResult( listeners, listeners.getPostCollectionUpdateListener(), parent, index++ );
+		if ( child instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getPreCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
+			checkResult( listeners, listeners.getPostCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
+		}
+		checkNumberOfResults( listeners, index );
+	}
+
+	public void testUpdateParentTwoChildrenToOne() {
+		CollectionListeners listeners = new CollectionListeners( getSessions() );
+		ParentWithCollection parent = createParentWithOneChild( "parent", "child" );
+		assertEquals( 1, parent.getChildren().size() );
+		Child oldChild = ( Child ) parent.getChildren().iterator().next();
+		listeners.clear();
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		parent = ( ParentWithCollection ) s.get( parent.getClass(), parent.getId() );
+		parent.addChild( "new" );
+		tx.commit();
+		s.close();
+		listeners.clear();
+		s = openSession();
+		tx = s.beginTransaction();
+		parent = ( ParentWithCollection ) s.get( parent.getClass(), parent.getId() );
+		if ( oldChild instanceof Entity ) {
+			oldChild = ( Child ) s.get( oldChild.getClass(), ( ( Entity ) oldChild ).getId() );
+		}
+		parent.removeChild( oldChild );
+		tx.commit();
+		s.close();
+		int index = 0;
+		if ( ( ( PersistentCollection ) parent.getChildren() ).wasInitialized() ) {
+			checkResult( listeners, listeners.getInitializeCollectionListener(), parent, index++ );
+		}
+		if ( oldChild instanceof ChildWithBidirectionalManyToMany ) {
+			ChildWithBidirectionalManyToMany oldChildWithManyToMany = ( ChildWithBidirectionalManyToMany ) oldChild;
+			if ( ( ( PersistentCollection ) oldChildWithManyToMany.getParents() ).wasInitialized() ) {
+				checkResult( listeners, listeners.getInitializeCollectionListener(), oldChildWithManyToMany, index++ );
+			}
+		}
+		checkResult( listeners, listeners.getPreCollectionUpdateListener(), parent, index++ );
+		checkResult( listeners, listeners.getPostCollectionUpdateListener(), parent, index++ );
+		if ( oldChild instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getPreCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) oldChild, index++ );
+			checkResult( listeners, listeners.getPostCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) oldChild, index++ );
+		}
+		checkNumberOfResults( listeners, index );
+	}
+
+	public void testDeleteParentWithNullChildren() {
+		CollectionListeners listeners = new CollectionListeners( getSessions() );
+		ParentWithCollection parent = createParentWithNullChildren( "parent" );
+		listeners.clear();
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		parent = ( ParentWithCollection ) s.get( parent.getClass(), parent.getId() );
+		s.delete( parent );
+		tx.commit();
+		s.close();
+		int index = 0;
+		checkResult( listeners, listeners.getInitializeCollectionListener(), parent, index++ );
+		checkResult( listeners, listeners.getPreCollectionRemoveListener(), parent, index++ );
+		checkResult( listeners, listeners.getPostCollectionRemoveListener(), parent, index++ );
+		checkNumberOfResults( listeners, index );
+	}
+
+	public void testDeleteParentWithNoChildren() {
+		CollectionListeners listeners = new CollectionListeners( getSessions() );
+		ParentWithCollection parent = createParentWithNoChildren( "parent" );
+		listeners.clear();
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		parent = ( ParentWithCollection ) s.get( parent.getClass(), parent.getId() );
+		s.delete( parent );
+		tx.commit();
+		s.close();
+		int index = 0;
+		checkResult( listeners, listeners.getInitializeCollectionListener(), parent, index++ );
+		checkResult( listeners, listeners.getPreCollectionRemoveListener(), parent, index++ );
+		checkResult( listeners, listeners.getPostCollectionRemoveListener(), parent, index++ );
+		checkNumberOfResults( listeners, index );
+	}
+
+	public void testDeleteParentAndChild() {
+		CollectionListeners listeners = new CollectionListeners( getSessions() );
+		ParentWithCollection parent = createParentWithOneChild( "parent", "child" );
+		Child child = ( Child ) parent.getChildren().iterator().next();
+		listeners.clear();
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		parent = ( ParentWithCollection ) s.get( parent.getClass(), parent.getId() );
+		if ( child instanceof Entity ) {
+			child = ( Child ) s.get( child.getClass(), ( ( Entity ) child ).getId() );
+		}
+		parent.removeChild( child );
+		if ( child instanceof Entity ) {
+			s.delete( child );
+		}
+		s.delete( parent );
+		tx.commit();
+		s.close();
+		int index = 0;
+		checkResult( listeners, listeners.getInitializeCollectionListener(), parent, index++ );
+		if ( child instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getInitializeCollectionListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
+		}
+		checkResult( listeners, listeners.getPreCollectionRemoveListener(), parent, index++ );
+		checkResult( listeners, listeners.getPostCollectionRemoveListener(), parent, index++ );
+		if ( child instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getPreCollectionRemoveListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
+			checkResult( listeners, listeners.getPostCollectionRemoveListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
+		}
+		checkNumberOfResults( listeners, index );
+	}
+
+	public void testMoveChildToDifferentParent() {
+		CollectionListeners listeners = new CollectionListeners( getSessions() );
+		ParentWithCollection parent = createParentWithOneChild( "parent", "child" );
+		ParentWithCollection otherParent = createParentWithOneChild( "otherParent", "otherChild" );
+		Child child = ( Child ) parent.getChildren().iterator().next();
+		listeners.clear();
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		parent = ( ParentWithCollection ) s.get( parent.getClass(), parent.getId() );
+		otherParent = ( ParentWithCollection ) s.get( otherParent.getClass(), otherParent.getId() );
+		if ( child instanceof Entity ) {
+			child = ( Child ) s.get( child.getClass(), ( ( Entity ) child ).getId() );
+		}
+		parent.removeChild( child );
+		otherParent.addChild( child );
+		tx.commit();
+		s.close();
+		int index = 0;
+		if ( ( ( PersistentCollection ) parent.getChildren() ).wasInitialized() ) {
+			checkResult( listeners, listeners.getInitializeCollectionListener(), parent, index++ );
+		}
+		if ( child instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getInitializeCollectionListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
+		}
+		if ( ( ( PersistentCollection ) otherParent.getChildren() ).wasInitialized() ) {
+			checkResult( listeners, listeners.getInitializeCollectionListener(), otherParent, index++ );
+		}
+		checkResult( listeners, listeners.getPreCollectionUpdateListener(), parent, index++ );
+		checkResult( listeners, listeners.getPostCollectionUpdateListener(), parent, index++ );
+		checkResult( listeners, listeners.getPreCollectionUpdateListener(), otherParent, index++ );
+		checkResult( listeners, listeners.getPostCollectionUpdateListener(), otherParent, index++ );
+		if ( child instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getPreCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
+			checkResult( listeners, listeners.getPostCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
+		}
+		checkNumberOfResults( listeners, index );
+	}
+
+	public void testMoveAllChildrenToDifferentParent() {
+		CollectionListeners listeners = new CollectionListeners( getSessions() );
+		ParentWithCollection parent = createParentWithOneChild( "parent", "child" );
+		ParentWithCollection otherParent = createParentWithOneChild( "otherParent", "otherChild" );
+		Child child = ( Child ) parent.getChildren().iterator().next();
+		listeners.clear();
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		parent = ( ParentWithCollection ) s.get( parent.getClass(), parent.getId() );
+		otherParent = ( ParentWithCollection ) s.get( otherParent.getClass(), otherParent.getId() );
+		if ( child instanceof Entity ) {
+			child = ( Child ) s.get( child.getClass(), ( ( Entity ) child ).getId() );
+		}
+		otherParent.addAllChildren( parent.getChildren() );
+		parent.clearChildren();
+		tx.commit();
+		s.close();
+		int index = 0;
+		if ( ( ( PersistentCollection ) parent.getChildren() ).wasInitialized() ) {
+			checkResult( listeners, listeners.getInitializeCollectionListener(), parent, index++ );
+		}
+		if ( ( ( PersistentCollection ) otherParent.getChildren() ).wasInitialized() ) {
+			checkResult( listeners, listeners.getInitializeCollectionListener(), otherParent, index++ );
+		}
+		if ( child instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getInitializeCollectionListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
+		}
+		checkResult( listeners, listeners.getPreCollectionUpdateListener(), parent, index++ );
+		checkResult( listeners, listeners.getPostCollectionUpdateListener(), parent, index++ );
+		checkResult( listeners, listeners.getPreCollectionUpdateListener(), otherParent, index++ );
+		checkResult( listeners, listeners.getPostCollectionUpdateListener(), otherParent, index++ );
+		if ( child instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getPreCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
+			checkResult( listeners, listeners.getPostCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
+		}
+		checkNumberOfResults( listeners, index );
+	}
+
+	public void testMoveCollectionToDifferentParent() {
+		CollectionListeners listeners = new CollectionListeners( getSessions() );
+		ParentWithCollection parent = createParentWithOneChild( "parent", "child" );
+		ParentWithCollection otherParent = createParentWithOneChild( "otherParent", "otherChild" );
+		listeners.clear();
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		parent = ( ParentWithCollection ) s.get( parent.getClass(), parent.getId() );
+		otherParent = ( ParentWithCollection ) s.get( otherParent.getClass(), otherParent.getId() );
+		Collection otherCollectionOrig = otherParent.getChildren();
+		otherParent.newChildren( parent.getChildren() );
+		parent.newChildren( null );
+		tx.commit();
+		s.close();
+		int index = 0;
+		Child otherChildOrig = null;
+		if ( ( ( PersistentCollection ) otherCollectionOrig ).wasInitialized() ) {
+			checkResult( listeners, listeners.getInitializeCollectionListener(), otherParent, otherCollectionOrig, index++ );
+			otherChildOrig = ( Child ) otherCollectionOrig.iterator().next();
+			if ( otherChildOrig instanceof ChildWithBidirectionalManyToMany ) {
+				checkResult( listeners, listeners.getInitializeCollectionListener(), ( ChildWithBidirectionalManyToMany ) otherChildOrig, index++ );
+			}
+		}
+		checkResult( listeners, listeners.getInitializeCollectionListener(), parent, otherParent.getChildren(), index++ );
+		Child otherChild = ( Child ) otherParent.getChildren().iterator().next();
+		if ( otherChild instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getInitializeCollectionListener(), ( ChildWithBidirectionalManyToMany ) otherChild, index++ );
+		}
+		checkResult( listeners, listeners.getPreCollectionRemoveListener(), parent, otherParent.getChildren(), index++ );
+		checkResult( listeners, listeners.getPostCollectionRemoveListener(), parent, otherParent.getChildren(), index++ );
+		checkResult( listeners, listeners.getPreCollectionRemoveListener(), otherParent, otherCollectionOrig, index++ );
+		checkResult( listeners, listeners.getPostCollectionRemoveListener(), otherParent, otherCollectionOrig, index++ );
+		if ( otherChild instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getPreCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) otherChildOrig, index++ );
+			checkResult( listeners, listeners.getPostCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) otherChildOrig, index++ );
+			checkResult( listeners, listeners.getPreCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) otherChild, index++ );
+			checkResult( listeners, listeners.getPostCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) otherChild, index++ );
+		}
+		checkResult( listeners, listeners.getPreCollectionRecreateListener(), otherParent, index++ );
+		checkResult( listeners, listeners.getPostCollectionRecreateListener(), otherParent, index++ );
+		// there should also be pre- and post-recreate collection events for parent, but thats broken now;
+		// this is covered in BrokenCollectionEventTest
+		checkNumberOfResults( listeners, index );
+	}
+
+	public void testMoveCollectionToDifferentParentFlushMoveToDifferentParent() {
+		CollectionListeners listeners = new CollectionListeners( getSessions() );
+		ParentWithCollection parent = createParentWithOneChild( "parent", "child" );
+		ParentWithCollection otherParent = createParentWithOneChild( "otherParent", "otherChild" );
+		ParentWithCollection otherOtherParent = createParentWithNoChildren( "otherParent" );
+		listeners.clear();
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		parent = ( ParentWithCollection ) s.get( parent.getClass(), parent.getId() );
+		otherParent = ( ParentWithCollection ) s.get( otherParent.getClass(), otherParent.getId() );
+		otherOtherParent = ( ParentWithCollection ) s.get( otherOtherParent.getClass(), otherOtherParent.getId() );
+		Collection otherCollectionOrig = otherParent.getChildren();
+		Collection otherOtherCollectionOrig = otherOtherParent.getChildren();
+		otherParent.newChildren( parent.getChildren() );
+		parent.newChildren( null );
+		s.flush();
+		otherOtherParent.newChildren( otherParent.getChildren() );
+		otherParent.newChildren( null );
+		tx.commit();
+		s.close();
+		int index = 0;
+		Child otherChildOrig = null;
+		if ( ( ( PersistentCollection ) otherCollectionOrig ).wasInitialized() ) {
+			checkResult( listeners, listeners.getInitializeCollectionListener(), otherParent, otherCollectionOrig, index++ );
+			otherChildOrig = ( Child ) otherCollectionOrig.iterator().next();
+			if ( otherChildOrig instanceof ChildWithBidirectionalManyToMany ) {
+				checkResult( listeners, listeners.getInitializeCollectionListener(), ( ChildWithBidirectionalManyToMany ) otherChildOrig, index++ );
+			}
+		}
+		checkResult( listeners, listeners.getInitializeCollectionListener(), parent, otherOtherParent.getChildren(), index++ );
+		Child otherOtherChild = ( Child ) otherOtherParent.getChildren().iterator().next();
+		if ( otherOtherChild instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getInitializeCollectionListener(), ( ChildWithBidirectionalManyToMany ) otherOtherChild, index++ );
+		}
+		checkResult( listeners, listeners.getPreCollectionRemoveListener(), parent, otherOtherParent.getChildren(), index++ );
+		checkResult( listeners, listeners.getPostCollectionRemoveListener(), parent, otherOtherParent.getChildren(), index++ );
+		checkResult( listeners, listeners.getPreCollectionRemoveListener(), otherParent, otherCollectionOrig, index++ );
+		checkResult( listeners, listeners.getPostCollectionRemoveListener(), otherParent, otherCollectionOrig, index++ );
+		if ( otherOtherChild instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getPreCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) otherChildOrig, index++ );
+			checkResult( listeners, listeners.getPostCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) otherChildOrig, index++ );
+			checkResult( listeners, listeners.getPreCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) otherOtherChild, index++ );
+			checkResult( listeners, listeners.getPostCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) otherOtherChild, index++ );
+		}
+		checkResult( listeners, listeners.getPreCollectionRecreateListener(), otherParent, otherOtherParent.getChildren(), index++ );
+		checkResult( listeners, listeners.getPostCollectionRecreateListener(), otherParent, otherOtherParent.getChildren(), index++ );
+		if ( ( ( PersistentCollection ) otherOtherCollectionOrig ).wasInitialized() ) {
+			checkResult( listeners, listeners.getInitializeCollectionListener(), otherOtherParent, otherOtherCollectionOrig, index++ );
+		}
+		checkResult( listeners, listeners.getPreCollectionRemoveListener(), otherParent, otherOtherParent.getChildren(), index++ );
+		checkResult( listeners, listeners.getPostCollectionRemoveListener(), otherParent, otherOtherParent.getChildren(), index++ );
+		checkResult( listeners, listeners.getPreCollectionRemoveListener(), otherOtherParent, otherOtherCollectionOrig, index++ );
+		checkResult( listeners, listeners.getPostCollectionRemoveListener(), otherOtherParent, otherOtherCollectionOrig, index++ );
+		if ( otherOtherChild instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getPreCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) otherOtherChild, index++ );
+			checkResult( listeners, listeners.getPostCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) otherOtherChild, index++ );
+		}
+		checkResult( listeners, listeners.getPreCollectionRecreateListener(), otherOtherParent, index++ );
+		checkResult( listeners, listeners.getPostCollectionRecreateListener(), otherOtherParent, index++ );
+		// there should also be pre- and post-recreate collection events for parent, and otherParent
+		// but thats broken now; this is covered in BrokenCollectionEventTest
+		checkNumberOfResults( listeners, index );
+	}
+
+	protected ParentWithCollection createParentWithNullChildren(String parentName) {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		ParentWithCollection parent = createParent( parentName );
+		s.save( parent );
+		tx.commit();
+		s.close();
+		return parent;
+	}
+
+	protected ParentWithCollection createParentWithNoChildren(String parentName) {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		ParentWithCollection parent = createParent( parentName );
+		parent.newChildren( createCollection() );
+		s.save( parent );
+		tx.commit();
+		s.close();
+		return parent;
+	}
+
+	protected ParentWithCollection createParentWithOneChild(String parentName, String ChildName) {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		ParentWithCollection parent = createParent( parentName );
+		parent.newChildren( createCollection() );
+		parent.addChild( ChildName );
+		s.save( parent );
+		tx.commit();
+		s.close();
+		return parent;
+	}
+
+	protected void checkResult(CollectionListeners listeners,
+							 CollectionListeners.Listener listenerExpected,
+							 ParentWithCollection parent,
+							 int index) {
+		checkResult( listeners, listenerExpected, parent, parent.getChildren(), index );
+	}
+	protected void checkResult(CollectionListeners listeners,
+							 CollectionListeners.Listener listenerExpected,
+							 ChildWithBidirectionalManyToMany child,
+							 int index) {
+		checkResult( listeners, listenerExpected, child, child.getParents(), index );
+	}
+
+	protected void checkResult(CollectionListeners listeners,
+							 CollectionListeners.Listener listenerExpected,
+							 Entity ownerExpected,
+							 Collection collExpected,
+							 int index) {
+		assertSame( listenerExpected, listeners.getListenersCalled().get( index ) );
+		assertSame(
+				ownerExpected,
+				( ( AbstractCollectionEvent ) listeners.getEvents().get( index ) ).getAffectedOwnerOrNull()
+		);
+		assertEquals(
+				ownerExpected.getId(),
+				( ( AbstractCollectionEvent ) listeners.getEvents().get( index ) ).getAffectedOwnerIdOrNull()
+		);
+		assertEquals(
+				ownerExpected.getClass().getName(),
+				( ( AbstractCollectionEvent ) listeners.getEvents().get( index ) ).getAffectedOwnerEntityName()
+		);
+		assertSame(
+				collExpected, ( ( AbstractCollectionEvent ) listeners.getEvents().get( index ) ).getCollection()
+		);
+	}
+
+	protected void checkNumberOfResults(CollectionListeners listeners, int nEventsExpected) {
+		assertEquals( nEventsExpected, listeners.getListenersCalled().size() );
+		assertEquals( nEventsExpected, listeners.getEvents().size() );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/AbstractCollectionEventTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/AbstractParentWithCollection.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/AbstractParentWithCollection.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/AbstractParentWithCollection.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,100 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution statements
+ * applied by the authors.
+ *
+ * All third-party contributions are distributed under license by Red Hat
+ * Middleware LLC.  This copyrighted material is made available to anyone
+ * wishing to use, modify, copy, or redistribute it subject to the terms
+ * and conditions of the GNU Lesser General Public License, as published by
+ * the Free Software Foundation.  This program is distributed in the hope
+ * that it will be useful, but WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * See the GNU Lesser General Public License for more details.  You should
+ * have received a copy of the GNU Lesser General Public License along with
+ * this distribution; if not, write to: Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.event.collection;
+
+import java.util.Collection;
+
+/**
+ *
+ * @author Gail Badner
+ */
+public abstract class AbstractParentWithCollection implements ParentWithCollection {
+	private Long id;
+	private String name;
+	           
+	private Collection children;
+
+	public AbstractParentWithCollection() {
+	}
+
+	public AbstractParentWithCollection(String name) {
+		this.name = name;
+	}
+
+	public void newChildren(Collection collection) {
+		setChildren( collection );
+	}
+
+	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 getChildren() {
+		return children;
+	}
+
+	public void setChildren(Collection children) {
+		this.children = children;
+	}
+
+	public Child addChild(String name) {
+		Child child = createChild( name );
+		addChild( child );
+		return child;
+	}
+
+	public void addChild(Child child) {
+		if ( child != null ) {
+			children.add( child );
+		}
+	}
+
+	public void addAllChildren(Collection children) {
+		this.children.addAll( children );
+	}
+
+	public void removeChild(Child child) {
+		children.remove( child );
+	}
+
+	public void removeAllChildren(Collection children) {
+		children.removeAll( children );
+	}
+
+	public void clearChildren() {
+		if ( children != null && !children.isEmpty() ) {
+			this.children.clear();
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/AbstractParentWithCollection.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/BrokenCollectionEventTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/BrokenCollectionEventTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/BrokenCollectionEventTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,333 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution statements
+ * applied by the authors.
+ * 
+ * All third-party contributions are distributed under license by Red Hat
+ * Middleware LLC.  This copyrighted material is made available to anyone
+ * wishing to use, modify, copy, or redistribute it subject to the terms
+ * and conditions of the GNU Lesser General Public License, as published by
+ * the Free Software Foundation.  This program is distributed in the hope
+ * that it will be useful, but WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * See the GNU Lesser General Public License for more details.  You should
+ * have received a copy of the GNU Lesser General Public License along with
+ * this distribution; if not, write to: Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.event.collection;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.collection.PersistentCollection;
+import org.hibernate.event.AbstractCollectionEvent;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.event.collection.association.bidirectional.manytomany.ChildWithBidirectionalManyToMany;
+import org.hibernate.test.event.collection.association.unidirectional.ParentWithCollectionOfEntities;
+
+/**
+ *
+ * @author Gail Badner
+ *
+ * These tests are known to fail. When the functionality is corrected, the
+ * corresponding method will be moved into AbstractCollectionEventTest.
+ */
+public class BrokenCollectionEventTest extends FunctionalTestCase {
+
+	public BrokenCollectionEventTest(String string) {
+		super( string );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( BrokenCollectionEventTest.class );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "event/collection/association/unidirectional/onetomany/UnidirectionalOneToManySetMapping.hbm.xml" };
+	}
+
+	public ParentWithCollection createParent(String name) {
+		return new ParentWithCollectionOfEntities( name );
+	}
+
+	public Collection createCollection() {
+		return new HashSet();
+	}
+
+	protected void cleanupTest() {
+		ParentWithCollection dummyParent = createParent( "dummyParent" );
+		dummyParent.setChildren( createCollection() );
+		Child dummyChild = dummyParent.addChild( "dummyChild" );
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		List children = s.createCriteria( dummyChild.getClass() ).list();
+		List parents = s.createCriteria( dummyParent.getClass() ).list();
+		for ( Iterator it = parents.iterator(); it.hasNext(); ) {
+			ParentWithCollection parent = ( ParentWithCollection ) it.next();
+			parent.clearChildren();
+			s.delete( parent );
+		}
+		for ( Iterator it = children.iterator(); it.hasNext(); ) {
+			s.delete( it.next() );
+		}
+		tx.commit();
+		s.close();
+	}
+
+	public void testUpdateDetachedParentNoChildrenToNullFailureExpected() {
+		CollectionListeners listeners = new CollectionListeners( getSessions() );
+		ParentWithCollection parent = createParentWithNoChildren( "parent" );
+		listeners.clear();
+		assertEquals( 0, parent.getChildren().size() );
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Collection oldCollection = parent.getChildren();
+		parent.newChildren( null );
+		s.update( parent );
+		tx.commit();
+		s.close();
+		int index = 0;
+		checkResult( listeners, listeners.getPreCollectionRemoveListener(), parent, oldCollection, index++ );
+		checkResult( listeners, listeners.getPostCollectionRemoveListener(), parent, oldCollection, index++ );
+		// pre- and post- collection recreate events should be created when updating an entity with a "null" collection
+		checkResult( listeners, listeners.getPreCollectionRecreateListener(), parent, index++ );
+		checkResult( listeners, listeners.getPostCollectionRecreateListener(), parent, index++ );
+		checkNumberOfResults( listeners, index );
+	}
+
+	// The following fails for the same reason as testUpdateDetachedParentNoChildrenToNullFailureExpected
+	// When that issue is fixed, this one should also be fixed and moved into AbstractCollectionEventTest.
+	/*
+	public void testUpdateDetachedParentOneChildToNullFailureExpected() {
+		CollectionListeners listeners = new CollectionListeners( getSessions() );
+		ParentWithCollection parent = createParentWithOneChild( "parent", "child" );
+		Child oldChild = ( Child ) parent.getChildren().iterator().next();
+		assertEquals( 1, parent.getChildren().size() );
+		listeners.clear();
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Collection oldCollection = parent.getChildren();
+		parent.newChildren( null );
+		s.update( parent );
+		tx.commit();
+		s.close();
+		int index = 0;
+		checkResult( listeners, listeners.getPreCollectionRemoveListener(), parent, oldCollection, index++ );
+		checkResult( listeners, listeners.getPostCollectionRemoveListener(), parent, oldCollection, index++ );
+		if ( oldChild instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getPreCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) oldChild, index++ );
+			checkResult( listeners, listeners.getPostCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) oldChild, index++ );
+		}
+		// pre- and post- collection recreate events should be created when updating an entity with a "null" collection
+		checkResult( listeners, listeners.getPreCollectionRecreateListener(), parent, index++ );
+		checkResult( listeners, listeners.getPostCollectionRecreateListener(), parent, index++ );
+		checkNumberOfResults( listeners, index );
+	}
+	*/
+
+	public void testSaveParentNullChildrenFailureExpected() {
+		CollectionListeners listeners = new CollectionListeners( getSessions() );
+		ParentWithCollection parent = createParentWithNullChildren( "parent" );
+		assertNull( parent.getChildren() );
+		int index = 0;
+		// pre- and post- collection recreate events should be created when creating an entity with a "null" collection
+		checkResult( listeners, listeners.getPreCollectionRecreateListener(), parent, index++ );
+		checkResult( listeners, listeners.getPostCollectionRecreateListener(), parent, index++ );
+		checkNumberOfResults( listeners, index );
+		listeners.clear();
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		parent = ( ParentWithCollection ) s.get( parent.getClass(), parent.getId() );
+		tx.commit();
+		s.close();
+		assertNotNull( parent.getChildren() );
+		checkNumberOfResults( listeners, 0 );
+	}
+
+	public void testUpdateParentNoChildrenToNullFailureExpected() {
+		CollectionListeners listeners = new CollectionListeners( getSessions() );
+		ParentWithCollection parent = createParentWithNoChildren( "parent" );
+		listeners.clear();
+		assertEquals( 0, parent.getChildren().size() );
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		parent = ( ParentWithCollection ) s.get( parent.getClass(), parent.getId() );
+		Collection oldCollection = parent.getChildren();
+		parent.newChildren( null );
+		tx.commit();
+		s.close();
+		int index = 0;
+		if ( ( ( PersistentCollection ) oldCollection ).wasInitialized() ) {
+			checkResult( listeners, listeners.getInitializeCollectionListener(), parent, oldCollection, index++ );
+		}
+		checkResult( listeners, listeners.getPreCollectionRemoveListener(), parent, oldCollection, index++ );
+		checkResult( listeners, listeners.getPostCollectionRemoveListener(), parent, oldCollection, index++ );
+		// pre- and post- collection recreate events should be created when updating an entity with a "null" collection
+		checkResult( listeners, listeners.getPreCollectionRecreateListener(), parent, index++ );
+		checkResult( listeners, listeners.getPostCollectionRecreateListener(), parent, index++ );
+		checkNumberOfResults( listeners, index );
+	}
+
+
+	// The following two tests fail for the same reason as testUpdateParentNoChildrenToNullFailureExpected
+	// When that issue is fixed, this one should also be fixed and moved into AbstractCollectionEventTest.
+	/*
+	public void testUpdateParentOneChildToNullFailureExpected() {
+		CollectionListeners listeners = new CollectionListeners( getSessions() );
+		ParentWithCollection parent = createParentWithOneChild( "parent", "child" );
+		Child oldChild = ( Child ) parent.getChildren().iterator().next();
+		assertEquals( 1, parent.getChildren().size() );
+		listeners.clear();
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		parent = ( AbstractParentWithCollection ) s.get( parent.getClass(), parent.getId() );
+		if ( oldChild instanceof ChildEntity ) {
+			oldChild = ( Child ) s.get( oldChild.getClass(), ( ( ChildEntity ) oldChild ).getId() );
+		}
+		Collection oldCollection = parent.getChildren();
+		parent.newChildren( null );
+		tx.commit();
+		s.close();
+		int index = 0;
+		if ( ( ( PersistentCollection ) oldCollection ).wasInitialized() ) {
+			checkResult( listeners, listeners.getInitializeCollectionListener(), parent, oldCollection, index++ );
+		}
+		ChildWithBidirectionalManyToMany oldChildWithManyToMany = null;
+		if ( oldChild instanceof ChildWithBidirectionalManyToMany ) {
+			oldChildWithManyToMany = ( ChildWithBidirectionalManyToMany ) oldChild;
+			if ( ( ( PersistentCollection ) oldChildWithManyToMany.getParents() ).wasInitialized() ) {
+				checkResult( listeners, listeners.getInitializeCollectionListener(), oldChildWithManyToMany, index++ );
+			}
+		}
+		checkResult( listeners, listeners.getPreCollectionRemoveListener(), parent, oldCollection, index++ );
+		checkResult( listeners, listeners.getPostCollectionRemoveListener(), parent, oldCollection, index++ );
+		if ( oldChildWithManyToMany != null ) {
+			checkResult( listeners, listeners.getPreCollectionUpdateListener(), oldChildWithManyToMany, index++ );
+			checkResult( listeners, listeners.getPostCollectionUpdateListener(), oldChildWithManyToMany, index++ );
+		}
+		// pre- and post- collection recreate events should be created when updating an entity with a "null" collection
+		checkResult( listeners, listeners.getPreCollectionRecreateListener(), parent, index++ );
+		checkResult( listeners, listeners.getPostCollectionRecreateListener(), parent, index++ );
+		checkNumberOfResults( listeners, index );
+	}
+
+	public void testUpdateMergedParentOneChildToNullFailureExpected() {
+		CollectionListeners listeners = new CollectionListeners( getSessions() );
+		ParentWithCollection parent = createParentWithOneChild( "parent", "child" );
+		assertEquals( 1, parent.getChildren().size() );
+		listeners.clear();
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		parent = ( AbstractParentWithCollection ) s.merge( parent );
+		Collection oldCollection = parent.getChildren();
+		parent.newChildren( null );
+		tx.commit();
+		s.close();
+		int index = 0;
+		Child oldChild = ( Child ) oldCollection.iterator().next();
+		ChildWithBidirectionalManyToMany oldChildWithManyToMany = null;
+		if ( oldChild instanceof ChildWithBidirectionalManyToMany ) {
+			oldChildWithManyToMany = ( ChildWithBidirectionalManyToMany ) oldChild;
+			if ( ( ( PersistentCollection ) oldChildWithManyToMany.getParents() ).wasInitialized() ) {
+		}
+			checkResult( listeners, listeners.getInitializeCollectionListener(), oldChildWithManyToMany, index++ );
+		}
+		checkResult( listeners, listeners.getPreCollectionRemoveListener(), parent, oldCollection, index++ );
+		checkResult( listeners, listeners.getPostCollectionRemoveListener(), parent, oldCollection, index++ );
+		if ( oldChildWithManyToMany != null ) {
+			checkResult( listeners, listeners.getPreCollectionUpdateListener(), oldChildWithManyToMany, index++ );
+			checkResult( listeners, listeners.getPostCollectionUpdateListener(), oldChildWithManyToMany, index++ );
+		}
+		// pre- and post- collection recreate events should be created when updating an entity with a "null" collection
+		checkResult( listeners, listeners.getPreCollectionRecreateListener(), parent, index++ );
+		checkResult( listeners, listeners.getPostCollectionRecreateListener(), parent, index++ );
+		checkNumberOfResults( listeners, index );
+	}	
+	*/
+
+	private ParentWithCollection createParentWithNullChildren(String parentName) {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		ParentWithCollection parent = createParent( parentName );
+		s.save( parent );
+		tx.commit();
+		s.close();
+		return parent;
+	}
+
+	private ParentWithCollection createParentWithNoChildren(String parentName) {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		ParentWithCollection parent = createParent( parentName );
+		parent.setChildren( createCollection() );
+		s.save( parent );
+		tx.commit();
+		s.close();
+		return parent;
+	}
+
+	private ParentWithCollection createParentWithOneChild(String parentName, String ChildName) {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		ParentWithCollection parent = createParent( parentName );
+		parent.setChildren( createCollection() );
+		parent.addChild( ChildName );
+		s.save( parent );
+		tx.commit();
+		s.close();
+		return parent;
+	}
+
+	protected void checkResult(CollectionListeners listeners,
+							 CollectionListeners.Listener listenerExpected,
+							 ParentWithCollection parent,
+							 int index) {
+		checkResult( listeners, listenerExpected, parent, parent.getChildren(), index );
+	}
+	protected void checkResult(CollectionListeners listeners,
+							 CollectionListeners.Listener listenerExpected,
+							 ChildWithBidirectionalManyToMany child,
+							 int index) {
+		checkResult( listeners, listenerExpected, child, child.getParents(), index );
+	}
+
+	protected void checkResult(CollectionListeners listeners,
+							 CollectionListeners.Listener listenerExpected,
+							 Entity ownerExpected,
+							 Collection collExpected,
+							 int index) {
+		assertSame( listenerExpected, listeners.getListenersCalled().get( index ) );
+		assertSame(
+				ownerExpected,
+				( ( AbstractCollectionEvent ) listeners.getEvents().get( index ) ).getAffectedOwnerOrNull()
+		);
+		assertEquals(
+				ownerExpected.getId(),
+				( ( AbstractCollectionEvent ) listeners.getEvents().get( index ) ).getAffectedOwnerIdOrNull()
+		);
+		assertEquals(
+				ownerExpected.getClass().getName(),
+				( ( AbstractCollectionEvent ) listeners.getEvents().get( index ) ).getAffectedOwnerEntityName()
+		);
+		assertSame(
+				collExpected, ( ( AbstractCollectionEvent ) listeners.getEvents().get( index ) ).getCollection()
+		);
+	}
+
+	private void checkNumberOfResults(CollectionListeners listeners, int nEventsExpected) {
+		assertEquals( nEventsExpected, listeners.getListenersCalled().size() );
+		assertEquals( nEventsExpected, listeners.getEvents().size() );
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/BrokenCollectionEventTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/Child.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/Child.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/Child.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,33 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution statements
+ * applied by the authors.
+ *
+ * All third-party contributions are distributed under license by Red Hat
+ * Middleware LLC.  This copyrighted material is made available to anyone
+ * wishing to use, modify, copy, or redistribute it subject to the terms
+ * and conditions of the GNU Lesser General Public License, as published by
+ * the Free Software Foundation.  This program is distributed in the hope
+ * that it will be useful, but WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * See the GNU Lesser General Public License for more details.  You should
+ * have received a copy of the GNU Lesser General Public License along with
+ * this distribution; if not, write to: Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.event.collection;
+
+/**
+ *
+ * @author Gail Badner
+ */
+public interface Child {
+
+	String getName();
+
+	void setName(String name);
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/Child.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/ChildEntity.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/ChildEntity.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/ChildEntity.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,47 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution statements
+ * applied by the authors.
+ *
+ * All third-party contributions are distributed under license by Red Hat
+ * Middleware LLC.  This copyrighted material is made available to anyone
+ * wishing to use, modify, copy, or redistribute it subject to the terms
+ * and conditions of the GNU Lesser General Public License, as published by
+ * the Free Software Foundation.  This program is distributed in the hope
+ * that it will be useful, but WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * See the GNU Lesser General Public License for more details.  You should
+ * have received a copy of the GNU Lesser General Public License along with
+ * this distribution; if not, write to: Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.event.collection;
+
+/**
+ *
+ * @author Gail Badner
+ */
+public class ChildEntity extends ChildValue implements Entity {
+	private Long id;
+
+	public ChildEntity() {
+		super();
+	}
+
+	public ChildEntity(String name) {
+		super( name );
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/ChildEntity.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/ChildValue.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/ChildValue.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/ChildValue.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,59 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution statements
+ * applied by the authors.
+ *
+ * All third-party contributions are distributed under license by Red Hat
+ * Middleware LLC.  This copyrighted material is made available to anyone
+ * wishing to use, modify, copy, or redistribute it subject to the terms
+ * and conditions of the GNU Lesser General Public License, as published by
+ * the Free Software Foundation.  This program is distributed in the hope
+ * that it will be useful, but WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * See the GNU Lesser General Public License for more details.  You should
+ * have received a copy of the GNU Lesser General Public License along with
+ * this distribution; if not, write to: Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.event.collection;
+
+/**
+ *
+ * @author Gail Badner
+ */
+public class ChildValue implements Child {
+	private String name;
+
+	public ChildValue() {
+	}
+
+	public ChildValue(String name) {
+		this.name = name;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public boolean equals(Object otherChild) {
+		if ( this == otherChild ) {
+			return true;
+		}
+		if ( !( otherChild instanceof ChildValue ) ) {
+			return false;
+		}
+		return name.equals( ( ( ChildValue ) otherChild ).name );
+	}
+
+	public int hashCode() {
+		return name.hashCode();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/ChildValue.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/CollectionListeners.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/CollectionListeners.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/CollectionListeners.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,214 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution statements
+ * applied by the authors.
+ *
+ * All third-party contributions are distributed under license by Red Hat
+ * Middleware LLC.  This copyrighted material is made available to anyone
+ * wishing to use, modify, copy, or redistribute it subject to the terms
+ * and conditions of the GNU Lesser General Public License, as published by
+ * the Free Software Foundation.  This program is distributed in the hope
+ * that it will be useful, but WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * See the GNU Lesser General Public License for more details.  You should
+ * have received a copy of the GNU Lesser General Public License along with
+ * this distribution; if not, write to: Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.event.collection;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.hibernate.SessionFactory;
+import org.hibernate.event.AbstractCollectionEvent;
+import org.hibernate.event.InitializeCollectionEvent;
+import org.hibernate.event.InitializeCollectionEventListener;
+import org.hibernate.event.PostCollectionRecreateEvent;
+import org.hibernate.event.PostCollectionRecreateEventListener;
+import org.hibernate.event.PostCollectionRemoveEvent;
+import org.hibernate.event.PostCollectionRemoveEventListener;
+import org.hibernate.event.PostCollectionUpdateEvent;
+import org.hibernate.event.PostCollectionUpdateEventListener;
+import org.hibernate.event.PreCollectionRecreateEvent;
+import org.hibernate.event.PreCollectionRecreateEventListener;
+import org.hibernate.event.PreCollectionRemoveEvent;
+import org.hibernate.event.PreCollectionRemoveEventListener;
+import org.hibernate.event.PreCollectionUpdateEvent;
+import org.hibernate.event.PreCollectionUpdateEventListener;
+import org.hibernate.event.def.DefaultInitializeCollectionEventListener;
+import org.hibernate.impl.SessionFactoryImpl;
+
+/**
+ * Author: Gail Badner
+ */
+public class CollectionListeners {
+
+
+	public interface Listener extends Serializable {
+		void addEvent(AbstractCollectionEvent event, Listener listener);
+	}
+
+	public static abstract class AbstractListener implements Listener {
+
+		private final CollectionListeners listeners;
+
+		protected AbstractListener( CollectionListeners listeners ) {
+			this.listeners = listeners;
+		}
+
+		public void addEvent(AbstractCollectionEvent event, Listener listener) {
+			listeners.addEvent( event, listener );
+		}
+	}
+
+	public static class InitializeCollectionListener
+			extends DefaultInitializeCollectionEventListener
+			implements Listener {
+		private final CollectionListeners listeners;
+		private InitializeCollectionListener(CollectionListeners listeners) {
+			this.listeners = listeners;
+		}
+		public void onInitializeCollection(InitializeCollectionEvent event) {
+			super.onInitializeCollection( event );
+			addEvent( event, this );
+		}
+		public void addEvent(AbstractCollectionEvent event, Listener listener) {
+			listeners.addEvent( event, listener );
+		}
+	}
+
+	public static class PreCollectionRecreateListener extends AbstractListener
+			implements PreCollectionRecreateEventListener {
+		private PreCollectionRecreateListener(CollectionListeners listeners) {
+			super( listeners );
+		}
+		public void onPreRecreateCollection(PreCollectionRecreateEvent event) {
+			addEvent( event, this );
+		}
+	}
+
+	public static class PostCollectionRecreateListener extends AbstractListener
+			implements PostCollectionRecreateEventListener {
+		private PostCollectionRecreateListener(CollectionListeners listeners) {
+			super( listeners );
+		}
+		public void onPostRecreateCollection(PostCollectionRecreateEvent event) {
+			addEvent( event, this );
+		}
+	}
+
+	public static class PreCollectionRemoveListener extends AbstractListener
+			implements PreCollectionRemoveEventListener {
+		private PreCollectionRemoveListener(CollectionListeners listeners) {
+			super( listeners );
+		}
+		public void onPreRemoveCollection(PreCollectionRemoveEvent event) {
+			addEvent( event, this );
+		}
+	}
+
+	public static class PostCollectionRemoveListener extends AbstractListener
+			implements PostCollectionRemoveEventListener {
+		private PostCollectionRemoveListener(CollectionListeners listeners) {
+			super( listeners );
+		}
+		public void onPostRemoveCollection(PostCollectionRemoveEvent event) {
+			addEvent( event, this );
+		}
+	}
+
+	public static class PreCollectionUpdateListener extends AbstractListener
+			implements PreCollectionUpdateEventListener {
+		private PreCollectionUpdateListener(CollectionListeners listeners) {
+			super( listeners );
+		}
+		public void onPreUpdateCollection(PreCollectionUpdateEvent event) {
+			addEvent( event, this );
+		}
+	}
+
+	public static class PostCollectionUpdateListener extends AbstractListener
+			implements PostCollectionUpdateEventListener {
+		private PostCollectionUpdateListener(CollectionListeners listeners) {
+			super( listeners );
+		}
+		public void onPostUpdateCollection(PostCollectionUpdateEvent event) {
+			addEvent( event, this );
+		}
+	}
+
+	private final PreCollectionRecreateListener preCollectionRecreateListener;
+	private final InitializeCollectionListener initializeCollectionListener;
+	private final PreCollectionRemoveListener preCollectionRemoveListener;
+	private final PreCollectionUpdateListener preCollectionUpdateListener;
+	private final PostCollectionRecreateListener postCollectionRecreateListener;
+	private final PostCollectionRemoveListener postCollectionRemoveListener;
+	private final PostCollectionUpdateListener postCollectionUpdateListener;
+
+	private List listenersCalled = new ArrayList();
+	private List events = new ArrayList();
+
+	public CollectionListeners( SessionFactory sf) {
+		preCollectionRecreateListener = new PreCollectionRecreateListener( this );
+		initializeCollectionListener = new InitializeCollectionListener( this );
+		preCollectionRemoveListener = new PreCollectionRemoveListener( this );
+		preCollectionUpdateListener = new PreCollectionUpdateListener( this );
+		postCollectionRecreateListener = new PostCollectionRecreateListener( this );
+		postCollectionRemoveListener = new PostCollectionRemoveListener( this );
+		postCollectionUpdateListener = new PostCollectionUpdateListener( this );
+		SessionFactoryImpl impl = ( SessionFactoryImpl ) sf;
+		impl.getEventListeners().setInitializeCollectionEventListeners(
+				new InitializeCollectionEventListener[] { initializeCollectionListener }
+		);
+		impl.getEventListeners().setPreCollectionRecreateEventListeners(
+				new PreCollectionRecreateEventListener[] { preCollectionRecreateListener }
+		);
+		impl.getEventListeners().setPostCollectionRecreateEventListeners(
+				new PostCollectionRecreateEventListener[] { postCollectionRecreateListener }
+		);
+		impl.getEventListeners().setPreCollectionRemoveEventListeners(
+				new PreCollectionRemoveEventListener[] { preCollectionRemoveListener }
+		);
+		impl.getEventListeners().setPostCollectionRemoveEventListeners(
+				new PostCollectionRemoveEventListener[] { postCollectionRemoveListener }
+		);
+		impl.getEventListeners().setPreCollectionUpdateEventListeners(
+				new PreCollectionUpdateEventListener[] { preCollectionUpdateListener }
+		);
+		impl.getEventListeners().setPostCollectionUpdateEventListeners(
+				new PostCollectionUpdateEventListener[] { postCollectionUpdateListener }
+		);
+	}
+
+	public void addEvent(AbstractCollectionEvent event, Listener listener) {
+		listenersCalled.add( listener );
+		events.add( event );
+	}
+
+	public List getListenersCalled() {
+		return listenersCalled;
+	}
+
+	public List getEvents() {
+		return events;
+	}
+
+	public void clear() {
+		listenersCalled.clear();
+		events.clear();
+	}
+
+	public PreCollectionRecreateListener getPreCollectionRecreateListener() { return preCollectionRecreateListener; }
+	public InitializeCollectionListener getInitializeCollectionListener() { return initializeCollectionListener; }
+	public PreCollectionRemoveListener getPreCollectionRemoveListener() { return preCollectionRemoveListener; }
+	public PreCollectionUpdateListener getPreCollectionUpdateListener() { return preCollectionUpdateListener; }
+	public PostCollectionRecreateListener getPostCollectionRecreateListener() { return postCollectionRecreateListener; }
+	public PostCollectionRemoveListener getPostCollectionRemoveListener() { return postCollectionRemoveListener; }
+	public PostCollectionUpdateListener getPostCollectionUpdateListener() { return postCollectionUpdateListener; }
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/CollectionListeners.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/Entity.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/Entity.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/Entity.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,14 @@
+package org.hibernate.test.event.collection;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: gbadner
+ * Date: Jan 30, 2008
+ * Time: 2:39:37 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public interface Entity {
+	Long getId();
+
+	void setId(Long id);
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/Entity.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/ParentWithCollection.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/ParentWithCollection.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/ParentWithCollection.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,58 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution statements
+ * applied by the authors.
+ *
+ * All third-party contributions are distributed under license by Red Hat
+ * Middleware LLC.  This copyrighted material is made available to anyone
+ * wishing to use, modify, copy, or redistribute it subject to the terms
+ * and conditions of the GNU Lesser General Public License, as published by
+ * the Free Software Foundation.  This program is distributed in the hope
+ * that it will be useful, but WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * See the GNU Lesser General Public License for more details.  You should
+ * have received a copy of the GNU Lesser General Public License along with
+ * this distribution; if not, write to: Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.event.collection;
+
+import java.util.Collection;
+
+/**
+ *
+ * @author Gail Badner
+ */
+public interface ParentWithCollection extends Entity {
+	void newChildren(Collection collection);
+
+	Child createChild(String name);
+
+	Long getId();
+
+	void setId(Long id);
+
+	String getName();
+
+	void setName(String name);
+
+	Collection getChildren();
+
+	void setChildren(Collection children);
+
+	Child addChild(String name);
+
+	void addChild(Child child);
+
+	void addAllChildren(Collection children);
+
+	void removeChild(Child child);
+
+	void removeAllChildren(Collection children);
+
+	void clearChildren();
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/ParentWithCollection.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/AbstractAssociationCollectionEventTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/AbstractAssociationCollectionEventTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/AbstractAssociationCollectionEventTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,67 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution statements
+ * applied by the authors.
+ *
+ * All third-party contributions are distributed under license by Red Hat
+ * Middleware LLC.  This copyrighted material is made available to anyone
+ * wishing to use, modify, copy, or redistribute it subject to the terms
+ * and conditions of the GNU Lesser General Public License, as published by
+ * the Free Software Foundation.  This program is distributed in the hope
+ * that it will be useful, but WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * See the GNU Lesser General Public License for more details.  You should
+ * have received a copy of the GNU Lesser General Public License along with
+ * this distribution; if not, write to: Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.event.collection.association;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.event.collection.AbstractCollectionEventTest;
+import org.hibernate.test.event.collection.ChildEntity;
+import org.hibernate.test.event.collection.CollectionListeners;
+import org.hibernate.test.event.collection.ParentWithCollection;
+import org.hibernate.test.event.collection.association.bidirectional.manytomany.ChildWithBidirectionalManyToMany;
+
+/**
+ *
+ * @author Gail Badner
+ */
+public abstract class AbstractAssociationCollectionEventTest extends AbstractCollectionEventTest {
+	public AbstractAssociationCollectionEventTest(String string) {
+		super( string );
+	}
+
+	public void testDeleteParentButNotChild() {
+		CollectionListeners listeners = new CollectionListeners( getSessions() );
+		ParentWithCollection parent = createParentWithOneChild( "parent", "child" );
+		ChildEntity child = ( ChildEntity ) parent.getChildren().iterator().next();
+		listeners.clear();
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		parent = ( ParentWithCollection ) s.get( parent.getClass(), parent.getId() );
+		child = ( ChildEntity ) s.get( child.getClass(), child.getId() );
+		parent.removeChild( child );
+		s.delete( parent );
+		tx.commit();
+		s.close();
+		int index = 0;
+		checkResult( listeners, listeners.getInitializeCollectionListener(), parent, index++ );
+		if ( child instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getInitializeCollectionListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
+		}
+		checkResult( listeners, listeners.getPreCollectionRemoveListener(), parent, index++ );
+		checkResult( listeners, listeners.getPostCollectionRemoveListener(), parent, index++ );
+		if ( child instanceof ChildWithBidirectionalManyToMany ) {
+			checkResult( listeners, listeners.getPreCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
+			checkResult( listeners, listeners.getPostCollectionUpdateListener(), ( ChildWithBidirectionalManyToMany ) child, index++ );
+		}
+		checkNumberOfResults( listeners, index );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/AbstractAssociationCollectionEventTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/manytomany/BidirectionalManyToManyBagToSetCollectionEventTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/manytomany/BidirectionalManyToManyBagToSetCollectionEventTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/manytomany/BidirectionalManyToManyBagToSetCollectionEventTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,58 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution statements
+ * applied by the authors.
+ *
+ * All third-party contributions are distributed under license by Red Hat
+ * Middleware LLC.  This copyrighted material is made available to anyone
+ * wishing to use, modify, copy, or redistribute it subject to the terms
+ * and conditions of the GNU Lesser General Public License, as published by
+ * the Free Software Foundation.  This program is distributed in the hope
+ * that it will be useful, but WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * See the GNU Lesser General Public License for more details.  You should
+ * have received a copy of the GNU Lesser General Public License along with
+ * this distribution; if not, write to: Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.event.collection.association.bidirectional.manytomany;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.event.collection.ParentWithCollection;
+import org.hibernate.test.event.collection.association.AbstractAssociationCollectionEventTest;
+
+/**
+ *
+ * @author Gail Badner
+ */
+public class BidirectionalManyToManyBagToSetCollectionEventTest extends AbstractAssociationCollectionEventTest {
+
+	public BidirectionalManyToManyBagToSetCollectionEventTest(String string) {
+		super( string );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( BidirectionalManyToManyBagToSetCollectionEventTest.class );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "event/collection/association/bidirectional/manytomany/BidirectionalManyToManyBagToSetMapping.hbm.xml" };
+	}
+
+	public ParentWithCollection createParent(String name) {
+		return new ParentWithBidirectionalManyToMany( name );
+	}
+
+	public Collection createCollection() {
+		return new ArrayList();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/manytomany/BidirectionalManyToManyBagToSetCollectionEventTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/manytomany/BidirectionalManyToManyBagToSetMapping.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/manytomany/BidirectionalManyToManyBagToSetMapping.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/manytomany/BidirectionalManyToManyBagToSetMapping.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.event.collection.association.bidirectional.manytomany">
+
+    <class name="ParentWithBidirectionalManyToMany" table="PARENT">
+        <id name="id" column="ID" type="long">
+            <generator class="native"/>
+        </id>
+        <bag name="children" table="PARENT_CHILD"
+             inverse="false" cascade="all">
+            <key column="parent_id"/>
+            <many-to-many column="child_id" class="ChildWithBidirectionalManyToMany"/>
+        </bag>
+    </class>
+
+    <class name="ChildWithBidirectionalManyToMany" table="CHILD">
+        <id name="id" column="ID" type="long">
+            <generator class="native"/>
+        </id>
+        <property name="name" column="NAME" type="string"/>
+        <set name="parents" table="PARENT_CHILD"
+             inverse="true">
+            <key column="child_id"/>
+            <many-to-many column="parent_id" class="ParentWithBidirectionalManyToMany"/>
+        </set>
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/manytomany/BidirectionalManyToManyBagToSetMapping.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/manytomany/BidirectionalManyToManySetToSetCollectionEventTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/manytomany/BidirectionalManyToManySetToSetCollectionEventTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/manytomany/BidirectionalManyToManySetToSetCollectionEventTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,58 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution statements
+ * applied by the authors.
+ *
+ * All third-party contributions are distributed under license by Red Hat
+ * Middleware LLC.  This copyrighted material is made available to anyone
+ * wishing to use, modify, copy, or redistribute it subject to the terms
+ * and conditions of the GNU Lesser General Public License, as published by
+ * the Free Software Foundation.  This program is distributed in the hope
+ * that it will be useful, but WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * See the GNU Lesser General Public License for more details.  You should
+ * have received a copy of the GNU Lesser General Public License along with
+ * this distribution; if not, write to: Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.event.collection.association.bidirectional.manytomany;
+
+import java.util.Collection;
+import java.util.HashSet;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.event.collection.ParentWithCollection;
+import org.hibernate.test.event.collection.association.AbstractAssociationCollectionEventTest;
+
+/**
+ *
+ * @author Gail Badner
+ */
+public class BidirectionalManyToManySetToSetCollectionEventTest extends AbstractAssociationCollectionEventTest {
+
+	public BidirectionalManyToManySetToSetCollectionEventTest(String string) {
+		super( string );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( BidirectionalManyToManySetToSetCollectionEventTest.class );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "event/collection/association/bidirectional/manytomany/BidirectionalManyToManySetToSetMapping.hbm.xml" };
+	}
+
+	public ParentWithCollection createParent(String name) {
+		return new ParentWithBidirectionalManyToMany( name );
+	}
+
+	public Collection createCollection() {
+		return new HashSet();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/manytomany/BidirectionalManyToManySetToSetCollectionEventTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/manytomany/BidirectionalManyToManySetToSetMapping.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/manytomany/BidirectionalManyToManySetToSetMapping.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/manytomany/BidirectionalManyToManySetToSetMapping.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.event.collection.association.bidirectional.manytomany">
+
+    <class name="ParentWithBidirectionalManyToMany" table="PARENT">
+        <id name="id" column="ID" type="long">
+            <generator class="native"/>
+        </id>
+        <set name="children" table="PARENT_CHILD"
+             inverse="false" cascade="all">
+            <key column="parent_id"/>
+            <many-to-many column="child_id" class="ChildWithBidirectionalManyToMany"/>
+        </set>
+    </class>
+
+    <class name="ChildWithBidirectionalManyToMany" table="CHILD">
+        <id name="id" column="ID" type="long">
+            <generator class="native"/>
+        </id>
+        <property name="name" column="NAME" type="string"/>
+        <set name="parents" table="PARENT_CHILD"
+             inverse="true">
+            <key column="child_id"/>
+            <many-to-many column="parent_id" class="ParentWithBidirectionalManyToMany"/>
+        </set>
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/manytomany/BidirectionalManyToManySetToSetMapping.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/manytomany/ChildWithBidirectionalManyToMany.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/manytomany/ChildWithBidirectionalManyToMany.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/manytomany/ChildWithBidirectionalManyToMany.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,62 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution statements
+ * applied by the authors.
+ *
+ * All third-party contributions are distributed under license by Red Hat
+ * Middleware LLC.  This copyrighted material is made available to anyone
+ * wishing to use, modify, copy, or redistribute it subject to the terms
+ * and conditions of the GNU Lesser General Public License, as published by
+ * the Free Software Foundation.  This program is distributed in the hope
+ * that it will be useful, but WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * See the GNU Lesser General Public License for more details.  You should
+ * have received a copy of the GNU Lesser General Public License along with
+ * this distribution; if not, write to: Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.event.collection.association.bidirectional.manytomany;
+
+import java.util.Collection;
+
+import org.hibernate.test.event.collection.ChildEntity;
+
+/**
+ *
+ * @author Gail Badner
+ */
+public class ChildWithBidirectionalManyToMany extends ChildEntity {
+	private Collection parents;
+
+	public ChildWithBidirectionalManyToMany() {
+	}
+
+	public ChildWithBidirectionalManyToMany(String name, Collection parents) {
+		super( name );
+		this.parents = parents;
+	}
+
+	public Collection getParents() {
+		return parents;
+	}
+
+	public void setParents(Collection parents) {
+		this.parents = parents;
+	}
+
+	public void addParent(ParentWithBidirectionalManyToMany parent) {
+		if ( parent != null ) {
+			parents.add( parent );
+		}
+	}
+
+	public void removeParent(ParentWithBidirectionalManyToMany parent) {
+		if ( parent != null ) {
+			parents.remove( parent );
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/manytomany/ChildWithBidirectionalManyToMany.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/manytomany/ParentWithBidirectionalManyToMany.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/manytomany/ParentWithBidirectionalManyToMany.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/manytomany/ParentWithBidirectionalManyToMany.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,105 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution statements
+ * applied by the authors.
+ *
+ * All third-party contributions are distributed under license by Red Hat
+ * Middleware LLC.  This copyrighted material is made available to anyone
+ * wishing to use, modify, copy, or redistribute it subject to the terms
+ * and conditions of the GNU Lesser General Public License, as published by
+ * the Free Software Foundation.  This program is distributed in the hope
+ * that it will be useful, but WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * See the GNU Lesser General Public License for more details.  You should
+ * have received a copy of the GNU Lesser General Public License along with
+ * this distribution; if not, write to: Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.event.collection.association.bidirectional.manytomany;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+
+import org.hibernate.test.event.collection.Child;
+import org.hibernate.test.event.collection.AbstractParentWithCollection;
+
+/**
+ *
+ * @author Gail Badner
+ */
+public class ParentWithBidirectionalManyToMany extends AbstractParentWithCollection {
+	public ParentWithBidirectionalManyToMany() {
+	}
+
+	public ParentWithBidirectionalManyToMany(String name) {
+		super( name );
+	}
+
+	public void newChildren(Collection children) {
+		if ( children == getChildren() ) {
+			return;
+		}
+		if ( getChildren() != null ) {
+			for ( Iterator it = getChildren().iterator(); it.hasNext(); ) {
+				ChildWithBidirectionalManyToMany child = ( ChildWithBidirectionalManyToMany ) it.next();
+				child.removeParent( this );
+			}
+		}
+		if ( children != null ) {
+			for ( Iterator it = children.iterator(); it.hasNext(); ) {
+				ChildWithBidirectionalManyToMany child = ( ChildWithBidirectionalManyToMany ) it.next();
+				child.addParent( this );
+			}
+		}
+		super.newChildren( children );
+	}
+
+	public Child createChild(String name) {
+		return new ChildWithBidirectionalManyToMany( name, new HashSet() );
+	}
+
+	public void addChild(Child child) {
+		super.addChild( child );
+		( ( ChildWithBidirectionalManyToMany ) child ).addParent( this );
+	}
+
+	public void addAllChildren(Collection children) {
+		super.addAllChildren( children );
+		for ( Iterator it = children.iterator(); it.hasNext(); ) {
+			ChildWithBidirectionalManyToMany child = ( ChildWithBidirectionalManyToMany ) it.next();
+			child.addParent( this );
+		}
+	}
+
+	public void removeChild(Child child) {
+		// Note: if the collection is a bag, the same child can be in the collection more than once
+		super.removeChild( child );
+		// only remove the parent from the child's set if child is no longer in the collection
+		if ( ! getChildren().contains( child ) ) {
+			( ( ChildWithBidirectionalManyToMany ) child ).removeParent( this );
+		}
+	}
+
+	public void removeAllChildren(Collection children) {
+		super.removeAllChildren( children );
+		for ( Iterator it = children.iterator(); it.hasNext(); ) {
+			ChildWithBidirectionalManyToMany child = ( ChildWithBidirectionalManyToMany ) it.next();
+			child.removeParent( this );
+		}
+	}
+
+	public void clearChildren() {
+		if ( getChildren() != null ) {
+			for ( Iterator it = getChildren().iterator(); it.hasNext(); ) {
+				ChildWithBidirectionalManyToMany child = ( ChildWithBidirectionalManyToMany ) it.next();
+				child.removeParent( this );
+			}
+		}
+		super.clearChildren();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/manytomany/ParentWithBidirectionalManyToMany.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManyBagCollectionEventTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManyBagCollectionEventTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManyBagCollectionEventTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,63 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution statements
+ * applied by the authors.
+ *
+ * All third-party contributions are distributed under license by Red Hat
+ * Middleware LLC.  This copyrighted material is made available to anyone
+ * wishing to use, modify, copy, or redistribute it subject to the terms
+ * and conditions of the GNU Lesser General Public License, as published by
+ * the Free Software Foundation.  This program is distributed in the hope
+ * that it will be useful, but WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * See the GNU Lesser General Public License for more details.  You should
+ * have received a copy of the GNU Lesser General Public License along with
+ * this distribution; if not, write to: Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.event.collection.association.bidirectional.onetomany;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.event.collection.Child;
+import org.hibernate.test.event.collection.ParentWithCollection;
+import org.hibernate.test.event.collection.association.AbstractAssociationCollectionEventTest;
+
+/**
+ *
+ * @author Gail Badner
+ */
+public class BidirectionalOneToManyBagCollectionEventTest extends AbstractAssociationCollectionEventTest {
+
+	public BidirectionalOneToManyBagCollectionEventTest(String string) {
+		super( string );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( BidirectionalOneToManyBagCollectionEventTest.class );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "event/collection/association/bidirectional/onetomany/BidirectionalOneToManyBagMapping.hbm.xml" };
+	}
+
+	public ParentWithCollection createParent(String name) {
+		return new ParentWithBidirectionalOneToMany( name );
+	}
+
+	public Collection createCollection() {
+		return new ArrayList();
+	}
+
+	public Child createChild(String name) {
+		return new ChildWithManyToOne( name );
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManyBagCollectionEventTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManyBagMapping.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManyBagMapping.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManyBagMapping.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.event.collection.association.bidirectional.onetomany">
+
+    <class name="ParentWithBidirectionalOneToMany" table="PARENT">
+        <id name="id" column="ID" type="long">
+            <generator class="native"/>
+        </id>
+        <bag name="children"
+             inverse="true"
+             cascade="all">
+            <key column="parent_id"/>
+            <one-to-many class="ChildWithManyToOne"/>
+        </bag>
+    </class>
+
+    <class name="ChildWithManyToOne" table="CHILD">
+        <id name="id" column="ID" type="long">
+            <generator class="native"/>
+        </id>
+        <property name="name" column="NAME" type="string"/>
+        <many-to-one name="parent" column="parent_id" class="ParentWithBidirectionalOneToMany" cascade="none"/>
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManyBagMapping.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManyBagSubclassCollectionEventTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManyBagSubclassCollectionEventTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManyBagSubclassCollectionEventTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,50 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution statements
+ * applied by the authors.
+ *
+ * All third-party contributions are distributed under license by Red Hat
+ * Middleware LLC.  This copyrighted material is made available to anyone
+ * wishing to use, modify, copy, or redistribute it subject to the terms
+ * and conditions of the GNU Lesser General Public License, as published by
+ * the Free Software Foundation.  This program is distributed in the hope
+ * that it will be useful, but WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * See the GNU Lesser General Public License for more details.  You should
+ * have received a copy of the GNU Lesser General Public License along with
+ * this distribution; if not, write to: Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.event.collection.association.bidirectional.onetomany;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.event.collection.ParentWithCollection;
+
+/**
+ *
+ * @author Gail Badner
+ */
+public class BidirectionalOneToManyBagSubclassCollectionEventTest extends BidirectionalOneToManyBagCollectionEventTest {
+
+	public BidirectionalOneToManyBagSubclassCollectionEventTest(String string) {
+		super( string );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( BidirectionalOneToManyBagSubclassCollectionEventTest.class );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "event/collection/association/bidirectional/onetomany/BidirectionalOneToManyBagSubclassMapping.hbm.xml" };
+	}
+
+	public ParentWithCollection createParent(String name) {
+		return new ParentWithBidirectionalOneToManySubclass( name );
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManyBagSubclassCollectionEventTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManyBagSubclassMapping.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManyBagSubclassMapping.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManyBagSubclassMapping.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,39 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.event.collection.association.bidirectional.onetomany">
+
+    <class name="ParentWithBidirectionalOneToMany" table="PARENT" discriminator-value="P">
+        <id name="id" column="ID" type="long">
+            <generator class="native"/>
+        </id>
+
+        <discriminator column="`TYPE`" type="string" length="1"/>
+
+        <bag name="children"
+             inverse="true"
+             cascade="all">
+            <key column="parent_id"/>
+            <one-to-many class="ChildWithManyToOne"/>
+        </bag>
+
+        <subclass name="ParentWithBidirectionalOneToManySubclass"
+            discriminator-value="S">
+        </subclass>
+    </class>
+
+    <class name="ChildWithManyToOne" table="CHILD">
+        <id name="id" column="ID" type="long">
+            <generator class="native"/>
+        </id>
+        <property name="name" column="NAME" type="string"/>
+        <many-to-one name="parent" column="parent_id" class="ParentWithBidirectionalOneToMany" cascade="none"/>
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManyBagSubclassMapping.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManySetCollectionEventTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManySetCollectionEventTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManySetCollectionEventTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,63 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution statements
+ * applied by the authors.
+ *
+ * All third-party contributions are distributed under license by Red Hat
+ * Middleware LLC.  This copyrighted material is made available to anyone
+ * wishing to use, modify, copy, or redistribute it subject to the terms
+ * and conditions of the GNU Lesser General Public License, as published by
+ * the Free Software Foundation.  This program is distributed in the hope
+ * that it will be useful, but WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * See the GNU Lesser General Public License for more details.  You should
+ * have received a copy of the GNU Lesser General Public License along with
+ * this distribution; if not, write to: Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.event.collection.association.bidirectional.onetomany;
+
+import java.util.Collection;
+import java.util.HashSet;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.event.collection.Child;
+import org.hibernate.test.event.collection.ParentWithCollection;
+import org.hibernate.test.event.collection.association.AbstractAssociationCollectionEventTest;
+
+/**
+ *
+ * @author Gail Badner
+ */
+public class BidirectionalOneToManySetCollectionEventTest extends AbstractAssociationCollectionEventTest {
+
+	public BidirectionalOneToManySetCollectionEventTest(String string) {
+		super( string );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( BidirectionalOneToManySetCollectionEventTest.class );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "event/collection/association/bidirectional/onetomany/BidirectionalOneToManySetMapping.hbm.xml" };
+	}
+
+	public ParentWithCollection createParent(String name) {
+		return new ParentWithBidirectionalOneToMany( name );
+	}
+
+	public Collection createCollection() {
+		return new HashSet();
+	}
+
+	public Child createChild(String name) {
+		return new ChildWithManyToOne( name );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManySetCollectionEventTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManySetMapping.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManySetMapping.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManySetMapping.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.event.collection.association.bidirectional.onetomany">
+
+    <class name="ParentWithBidirectionalOneToMany" table="PARENT">
+        <id name="id" column="ID" type="long">
+            <generator class="native"/>
+        </id>
+        <set name="children"
+             inverse="true"
+             cascade="all">
+            <key column="parent_id"/>
+            <one-to-many class="ChildWithManyToOne"/>
+        </set>
+    </class>
+
+    <class name="ChildWithManyToOne" table="CHILD">
+        <id name="id" column="ID" type="long">
+            <generator class="native"/>
+        </id>
+        <property name="name" column="NAME" type="string"/>
+        <many-to-one name="parent" column="parent_id" class="ParentWithBidirectionalOneToMany" cascade="none"/>
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/BidirectionalOneToManySetMapping.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/ChildWithManyToOne.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/ChildWithManyToOne.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/ChildWithManyToOne.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,47 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution statements
+ * applied by the authors.
+ *
+ * All third-party contributions are distributed under license by Red Hat
+ * Middleware LLC.  This copyrighted material is made available to anyone
+ * wishing to use, modify, copy, or redistribute it subject to the terms
+ * and conditions of the GNU Lesser General Public License, as published by
+ * the Free Software Foundation.  This program is distributed in the hope
+ * that it will be useful, but WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * See the GNU Lesser General Public License for more details.  You should
+ * have received a copy of the GNU Lesser General Public License along with
+ * this distribution; if not, write to: Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.event.collection.association.bidirectional.onetomany;
+
+import org.hibernate.test.event.collection.ChildEntity;
+import org.hibernate.test.event.collection.ParentWithCollection;
+
+/**
+ * @author Gail Badner
+ */
+public class ChildWithManyToOne extends ChildEntity {
+	private ParentWithCollection parent;
+
+	public ChildWithManyToOne() {
+	}
+
+	public ChildWithManyToOne(String name) {
+		super( name );
+	}
+
+	public ParentWithCollection getParent() {
+		return parent;
+	}
+
+	public void setParent(ParentWithCollection parent) {
+		this.parent = parent;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/ChildWithManyToOne.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/ParentWithBidirectionalOneToMany.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/ParentWithBidirectionalOneToMany.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/ParentWithBidirectionalOneToMany.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,85 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution statements
+ * applied by the authors.
+ *
+ * All third-party contributions are distributed under license by Red Hat
+ * Middleware LLC.  This copyrighted material is made available to anyone
+ * wishing to use, modify, copy, or redistribute it subject to the terms
+ * and conditions of the GNU Lesser General Public License, as published by
+ * the Free Software Foundation.  This program is distributed in the hope
+ * that it will be useful, but WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * See the GNU Lesser General Public License for more details.  You should
+ * have received a copy of the GNU Lesser General Public License along with
+ * this distribution; if not, write to: Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.event.collection.association.bidirectional.onetomany;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.hibernate.test.event.collection.Child;
+import org.hibernate.test.event.collection.AbstractParentWithCollection;
+
+/**
+ *
+ * @author Gail Badner
+ */
+public class ParentWithBidirectionalOneToMany extends AbstractParentWithCollection {
+	public ParentWithBidirectionalOneToMany() {
+	}
+
+	public ParentWithBidirectionalOneToMany(String name) {
+		super( name );
+	}
+
+	public Child createChild( String name ) {
+		return new ChildWithManyToOne( name );
+	}
+
+	public Child addChild(String name) {
+		Child child = createChild( name );
+		addChild( child );
+		return child;
+	}
+
+	public void addChild(Child child) {
+		super.addChild( child );
+		( ( ChildWithManyToOne ) child ).setParent( this );
+	}
+
+	public void newChildren(Collection children) {
+		if ( children == getChildren() ) {
+			return;
+		}
+		if ( getChildren() != null ) {
+			for ( Iterator it = getChildren().iterator(); it.hasNext(); ) {
+				ChildWithManyToOne child =  ( ChildWithManyToOne ) it.next();
+				child.setParent( null );
+			}
+		}
+		if ( children != null ) {
+			for ( Iterator it = children.iterator(); it.hasNext(); ) {
+				ChildWithManyToOne child = ( ChildWithManyToOne ) it.next();
+				child.setParent( this );
+			}
+		}
+		super.newChildren( children );
+	}
+
+	public void removeChild(Child child) {
+		// Note: there can be more than one child in the collection
+		super.removeChild( child );
+		// only set the parent to null if child is no longer in the bag
+		if ( ! getChildren().contains( child ) ) {
+			( ( ChildWithManyToOne ) child ).setParent( null );
+		}
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/ParentWithBidirectionalOneToMany.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/ParentWithBidirectionalOneToManySubclass.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/ParentWithBidirectionalOneToManySubclass.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/ParentWithBidirectionalOneToManySubclass.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,42 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution statements
+ * applied by the authors.
+ *
+ * All third-party contributions are distributed under license by Red Hat
+ * Middleware LLC.  This copyrighted material is made available to anyone
+ * wishing to use, modify, copy, or redistribute it subject to the terms
+ * and conditions of the GNU Lesser General Public License, as published by
+ * the Free Software Foundation.  This program is distributed in the hope
+ * that it will be useful, but WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * See the GNU Lesser General Public License for more details.  You should
+ * have received a copy of the GNU Lesser General Public License along with
+ * this distribution; if not, write to: Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.event.collection.association.bidirectional.onetomany;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.hibernate.test.event.collection.Child;
+import org.hibernate.test.event.collection.AbstractParentWithCollection;
+
+/**
+ *
+ * @author Gail Badner
+ */
+public class ParentWithBidirectionalOneToManySubclass extends ParentWithBidirectionalOneToMany {
+	public ParentWithBidirectionalOneToManySubclass() {
+	}
+
+	public ParentWithBidirectionalOneToManySubclass(String name) {
+		super( name );
+	}
+
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/bidirectional/onetomany/ParentWithBidirectionalOneToManySubclass.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/ParentWithCollectionOfEntities.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/ParentWithCollectionOfEntities.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/ParentWithCollectionOfEntities.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,43 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution statements
+ * applied by the authors.
+ *
+ * All third-party contributions are distributed under license by Red Hat
+ * Middleware LLC.  This copyrighted material is made available to anyone
+ * wishing to use, modify, copy, or redistribute it subject to the terms
+ * and conditions of the GNU Lesser General Public License, as published by
+ * the Free Software Foundation.  This program is distributed in the hope
+ * that it will be useful, but WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * See the GNU Lesser General Public License for more details.  You should
+ * have received a copy of the GNU Lesser General Public License along with
+ * this distribution; if not, write to: Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.event.collection.association.unidirectional;
+
+import org.hibernate.test.event.collection.AbstractParentWithCollection;
+import org.hibernate.test.event.collection.Child;
+import org.hibernate.test.event.collection.ChildEntity;
+
+/**
+ * @author Gail Badner
+ */
+public class ParentWithCollectionOfEntities extends AbstractParentWithCollection {
+
+	public ParentWithCollectionOfEntities() {
+	}
+
+	public ParentWithCollectionOfEntities(String name) {
+		super( name );
+	}
+
+	public Child createChild(String name) {
+		return new ChildEntity( name );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/ParentWithCollectionOfEntities.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/manytomany/UnidirectionalManyToManyBagCollectionEventTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/manytomany/UnidirectionalManyToManyBagCollectionEventTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/manytomany/UnidirectionalManyToManyBagCollectionEventTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,65 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution statements
+ * applied by the authors.
+ *
+ * All third-party contributions are distributed under license by Red Hat
+ * Middleware LLC.  This copyrighted material is made available to anyone
+ * wishing to use, modify, copy, or redistribute it subject to the terms
+ * and conditions of the GNU Lesser General Public License, as published by
+ * the Free Software Foundation.  This program is distributed in the hope
+ * that it will be useful, but WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * See the GNU Lesser General Public License for more details.  You should
+ * have received a copy of the GNU Lesser General Public License along with
+ * this distribution; if not, write to: Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.event.collection.association.unidirectional.manytomany;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.event.collection.Child;
+import org.hibernate.test.event.collection.ChildEntity;
+import org.hibernate.test.event.collection.ParentWithCollection;
+import org.hibernate.test.event.collection.association.AbstractAssociationCollectionEventTest;
+import org.hibernate.test.event.collection.association.unidirectional.ParentWithCollectionOfEntities;
+
+/**
+ *
+ * @author Gail Badner
+ */
+public class UnidirectionalManyToManyBagCollectionEventTest extends AbstractAssociationCollectionEventTest {
+
+	public UnidirectionalManyToManyBagCollectionEventTest(String string) {
+		super( string );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( UnidirectionalManyToManyBagCollectionEventTest.class );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "event/collection/association/unidirectional/manytomany/UnidirectionalManyToManyBagMapping.hbm.xml" };
+	}
+
+	public ParentWithCollection createParent(String name) {
+		return new ParentWithCollectionOfEntities( name );
+	}
+
+	public Collection createCollection() {
+		return new ArrayList();
+	}
+
+	public Child createChild(String name) {
+		return new ChildEntity( name );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/manytomany/UnidirectionalManyToManyBagCollectionEventTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/manytomany/UnidirectionalManyToManyBagMapping.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/manytomany/UnidirectionalManyToManyBagMapping.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/manytomany/UnidirectionalManyToManyBagMapping.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.event.collection.association.unidirectional">
+
+    <class name="ParentWithCollectionOfEntities" table="PARENT">
+        <id name="id" column="ID" type="long">
+            <generator class="native"/>
+        </id>
+        <bag name="children" table="PARENT_CHILD"
+             inverse="false" cascade="all">
+            <key column="parent_id"/>
+            <many-to-many column="child_id" class="org.hibernate.test.event.collection.ChildEntity"/>
+        </bag>
+    </class>
+
+    <class name="org.hibernate.test.event.collection.ChildEntity" table="CHILD">
+        <id name="id" column="ID" type="long">
+            <generator class="native"/>
+        </id>
+        <property name="name" column="NAME" type="string"/>
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/manytomany/UnidirectionalManyToManyBagMapping.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/onetomany/UnidirectionalOneToManyBagCollectionEventTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/onetomany/UnidirectionalOneToManyBagCollectionEventTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/onetomany/UnidirectionalOneToManyBagCollectionEventTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,65 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution statements
+ * applied by the authors.
+ *
+ * All third-party contributions are distributed under license by Red Hat
+ * Middleware LLC.  This copyrighted material is made available to anyone
+ * wishing to use, modify, copy, or redistribute it subject to the terms
+ * and conditions of the GNU Lesser General Public License, as published by
+ * the Free Software Foundation.  This program is distributed in the hope
+ * that it will be useful, but WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * See the GNU Lesser General Public License for more details.  You should
+ * have received a copy of the GNU Lesser General Public License along with
+ * this distribution; if not, write to: Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.event.collection.association.unidirectional.onetomany;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.event.collection.Child;
+import org.hibernate.test.event.collection.ChildEntity;
+import org.hibernate.test.event.collection.ParentWithCollection;
+import org.hibernate.test.event.collection.association.AbstractAssociationCollectionEventTest;
+import org.hibernate.test.event.collection.association.unidirectional.ParentWithCollectionOfEntities;
+
+/**
+ *
+ * @author Gail Badner
+ */
+public class UnidirectionalOneToManyBagCollectionEventTest extends AbstractAssociationCollectionEventTest {
+
+	public UnidirectionalOneToManyBagCollectionEventTest(String string) {
+		super( string );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( UnidirectionalOneToManyBagCollectionEventTest.class );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "event/collection/association/unidirectional/onetomany/UnidirectionalOneToManyBagMapping.hbm.xml" };
+	}
+
+	public ParentWithCollection createParent(String name) {
+		return new ParentWithCollectionOfEntities( name );
+	}
+
+	public Collection createCollection() {
+		return new ArrayList();
+	}
+
+	public Child createChild(String name) {
+		return new ChildEntity( name );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/onetomany/UnidirectionalOneToManyBagCollectionEventTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/onetomany/UnidirectionalOneToManyBagMapping.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/onetomany/UnidirectionalOneToManyBagMapping.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/onetomany/UnidirectionalOneToManyBagMapping.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.event.collection.association.unidirectional">
+
+    <class name="ParentWithCollectionOfEntities" table="PARENT">
+        <id name="id" column="ID" type="long">
+            <generator class="native"/>
+        </id>
+        <bag name="children"
+             cascade="all">
+            <key column="parent_id"/>
+            <one-to-many class="org.hibernate.test.event.collection.ChildEntity"/>
+        </bag>
+    </class>
+
+    <class name="org.hibernate.test.event.collection.ChildEntity" table="CHILD">
+        <id name="id" column="ID" type="long">
+            <generator class="native"/>
+        </id>
+        <property name="name" column="NAME" type="string"/>
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/onetomany/UnidirectionalOneToManyBagMapping.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/onetomany/UnidirectionalOneToManySetCollectionEventTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/onetomany/UnidirectionalOneToManySetCollectionEventTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/onetomany/UnidirectionalOneToManySetCollectionEventTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,60 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution statements
+ * applied by the authors.
+ *
+ * All third-party contributions are distributed under license by Red Hat
+ * Middleware LLC.  This copyrighted material is made available to anyone
+ * wishing to use, modify, copy, or redistribute it subject to the terms
+ * and conditions of the GNU Lesser General Public License, as published by
+ * the Free Software Foundation.  This program is distributed in the hope
+ * that it will be useful, but WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * See the GNU Lesser General Public License for more details.  You should
+ * have received a copy of the GNU Lesser General Public License along with
+ * this distribution; if not, write to: Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.event.collection.association.unidirectional.onetomany;
+
+import java.util.Collection;
+import java.util.HashSet;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.event.collection.ParentWithCollection;
+import org.hibernate.test.event.collection.association.AbstractAssociationCollectionEventTest;
+import org.hibernate.test.event.collection.association.unidirectional.ParentWithCollectionOfEntities;
+
+/**
+ *
+ * @author Gail Badner
+ */
+public class UnidirectionalOneToManySetCollectionEventTest extends AbstractAssociationCollectionEventTest {
+
+	public UnidirectionalOneToManySetCollectionEventTest(String string) {
+		super( string );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( UnidirectionalOneToManySetCollectionEventTest.class );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "event/collection/association/unidirectional/onetomany/UnidirectionalOneToManySetMapping.hbm.xml" };
+	}
+
+	public ParentWithCollection createParent(String name) {
+		return new ParentWithCollectionOfEntities( name );
+	}
+
+	public Collection createCollection() {
+		return new HashSet();
+	}	
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/onetomany/UnidirectionalOneToManySetCollectionEventTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/onetomany/UnidirectionalOneToManySetMapping.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/onetomany/UnidirectionalOneToManySetMapping.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/onetomany/UnidirectionalOneToManySetMapping.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.event.collection.association.unidirectional">
+
+    <class name="ParentWithCollectionOfEntities" table="PARENT">
+        <id name="id" column="ID" type="long">
+            <generator class="native"/>
+        </id>
+        <set name="children"
+             cascade="all">
+            <key column="parent_id"/>
+            <one-to-many class="org.hibernate.test.event.collection.ChildEntity"/>
+        </set>
+    </class>
+
+    <class name="org.hibernate.test.event.collection.ChildEntity" table="CHILD">
+        <id name="id" column="ID" type="long">
+            <generator class="native"/>
+        </id>
+        <property name="name" column="NAME" type="string"/>
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/association/unidirectional/onetomany/UnidirectionalOneToManySetMapping.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/values/ParentWithCollectionOfValues.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/values/ParentWithCollectionOfValues.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/values/ParentWithCollectionOfValues.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,45 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution statements
+ * applied by the authors.
+ *
+ * All third-party contributions are distributed under license by Red Hat
+ * Middleware LLC.  This copyrighted material is made available to anyone
+ * wishing to use, modify, copy, or redistribute it subject to the terms
+ * and conditions of the GNU Lesser General Public License, as published by
+ * the Free Software Foundation.  This program is distributed in the hope
+ * that it will be useful, but WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * See the GNU Lesser General Public License for more details.  You should
+ * have received a copy of the GNU Lesser General Public License along with
+ * this distribution; if not, write to: Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.event.collection.values;
+
+import java.util.Collection;
+
+import org.hibernate.test.event.collection.Child;
+import org.hibernate.test.event.collection.ChildValue;
+import org.hibernate.test.event.collection.AbstractParentWithCollection;
+
+/**
+ *
+ * @author Gail Badner
+ */
+public class ParentWithCollectionOfValues extends AbstractParentWithCollection {
+	public ParentWithCollectionOfValues() {
+	}
+
+	public ParentWithCollectionOfValues(String name) {
+		super( name );
+	}
+	
+	public Child createChild(String name) {
+		return new ChildValue( name );
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/values/ParentWithCollectionOfValues.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/values/ValuesBagCollectionEventTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/values/ValuesBagCollectionEventTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/values/ValuesBagCollectionEventTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,58 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution statements
+ * applied by the authors.
+ *
+ * All third-party contributions are distributed under license by Red Hat
+ * Middleware LLC.  This copyrighted material is made available to anyone
+ * wishing to use, modify, copy, or redistribute it subject to the terms
+ * and conditions of the GNU Lesser General Public License, as published by
+ * the Free Software Foundation.  This program is distributed in the hope
+ * that it will be useful, but WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * See the GNU Lesser General Public License for more details.  You should
+ * have received a copy of the GNU Lesser General Public License along with
+ * this distribution; if not, write to: Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.event.collection.values;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.event.collection.AbstractCollectionEventTest;
+import org.hibernate.test.event.collection.ParentWithCollection;
+
+/**
+ *
+ * @author Gail Badner
+ */
+public class ValuesBagCollectionEventTest extends AbstractCollectionEventTest {
+
+	public ValuesBagCollectionEventTest(String string) {
+		super( string );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( ValuesBagCollectionEventTest.class );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "event/collection/values/ValuesBagMapping.hbm.xml" };
+	}
+
+	public ParentWithCollection createParent(String name) {
+		return new ParentWithCollectionOfValues( name );
+	}
+
+	public Collection createCollection() {
+		return new ArrayList();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/values/ValuesBagCollectionEventTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/values/ValuesBagMapping.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/values/ValuesBagMapping.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/values/ValuesBagMapping.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.event.collection.values">
+
+    <class name="ParentWithCollectionOfValues" table="PARENT">
+        <id name="id" column="ID" type="long">
+            <generator class="native"/>
+        </id>
+        <bag name="children"
+             cascade="all">
+            <key column="parent_id"/>
+            <composite-element class="org.hibernate.test.event.collection.ChildValue">
+                <property name="name"/>
+            </composite-element>
+        </bag>
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/event/collection/values/ValuesBagMapping.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/events/CallbackTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/events/CallbackTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/events/CallbackTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,101 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.events;
+
+import java.util.Set;
+
+import org.hibernate.SessionFactory;
+import org.hibernate.SessionFactoryObserver;
+import org.hibernate.HibernateException;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.event.DeleteEventListener;
+import org.hibernate.event.Destructible;
+import org.hibernate.event.Initializable;
+import org.hibernate.event.DeleteEvent;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+
+/**
+ * CallbackTest implementation
+ *
+ * @author Steve Ebersole
+ */
+public class CallbackTest extends FunctionalTestCase {
+	private TestingObserver observer = new TestingObserver();
+	private TestingListener listener = new TestingListener();
+
+	public CallbackTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[0];
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setSessionFactoryObserver( observer );
+		cfg.getEventListeners().setDeleteEventListeners( new DeleteEventListener[] { listener } );
+	}
+
+	public void testCallbacks() {
+		assertTrue( "observer not notified of creation", observer.creationCount == 1 );
+		assertTrue( "listener not notified of creation", listener.initCount == 1 );
+
+		sfi().close();
+
+		assertTrue( "observer not notified of close", observer.closedCount == 1 );
+		assertTrue( "listener not notified of close", listener.destoryCount == 1 );
+	}
+
+	private static class TestingObserver implements SessionFactoryObserver {
+		private int creationCount = 0;
+		private int closedCount = 0;
+
+		public void sessionFactoryCreated(SessionFactory factory) {
+			creationCount++;
+		}
+
+		public void sessionFactoryClosed(SessionFactory factory) {
+			closedCount++;
+		}
+	}
+
+	private static class TestingListener implements DeleteEventListener, Initializable, Destructible {
+		private int initCount = 0;
+		private int destoryCount = 0;
+
+		public void initialize(Configuration cfg) {
+			initCount++;
+		}
+
+		public void cleanup() {
+			destoryCount++;
+		}
+
+		public void onDelete(DeleteEvent event) throws HibernateException {
+		}
+
+		public void onDelete(DeleteEvent event, Set transientEntities) throws HibernateException {
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/events/CallbackTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/exception/Group.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/exception/Group.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/exception/Group.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<hibernate-mapping package="org.hibernate.test.exception" >
+	<class name="Group" table="T_GROUP" >
+		<id name="id" unsaved-value="null" column="group_id" >
+			<generator class="native"/>
+		</id>
+		<property name="name" type="string" column="name" />
+		<set name="members" inverse="true" table="T_MEMBERSHIP" cascade="none">
+			<key column="group_id"/>
+			<many-to-many class="User" column="user_id"/>
+		</set>
+	</class>
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/exception/Group.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/exception/Group.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/exception/Group.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/exception/Group.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,48 @@
+// $Id: Group.java 4746 2004-11-11 20:57:28Z steveebersole $
+package org.hibernate.test.exception;
+
+import java.util.Set;
+
+/**
+ * Implementation of Group.
+ *
+ * @author Steve Ebersole
+ */
+public class Group {
+	private Long id;
+	private String name;
+	private Set members;
+
+	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 Set getMembers() {
+		return members;
+	}
+
+	public void setMembers(Set members) {
+		this.members = members;
+	}
+
+	public void addMember(User member) {
+		if (member == null) {
+			throw new IllegalArgumentException("Member to add cannot be null");
+		}
+
+		this.members.add(member);
+		member.getMemberships().add(this);
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/exception/Group.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/exception/SQLExceptionConversionTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/exception/SQLExceptionConversionTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/exception/SQLExceptionConversionTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,114 @@
+// $Id: SQLExceptionConversionTest.java 11339 2007-03-23 12:51:38Z steve.ebersole at jboss.com $
+package org.hibernate.test.exception;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+
+import junit.framework.Test;
+
+import org.hibernate.JDBCException;
+import org.hibernate.Session;
+import org.hibernate.dialect.MySQLMyISAMDialect;
+import org.hibernate.exception.ConstraintViolationException;
+import org.hibernate.exception.SQLExceptionConverter;
+import org.hibernate.exception.SQLGrammarException;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.util.JDBCExceptionReporter;
+
+/**
+ * Implementation of SQLExceptionConversionTest.
+ *
+ * @author Steve Ebersole
+ */
+public class SQLExceptionConversionTest extends FunctionalTestCase {
+
+	public SQLExceptionConversionTest(String name) {
+		super(name);
+	}
+
+	public String[] getMappings() {
+		return new String[] {"exception/User.hbm.xml", "exception/Group.hbm.xml"};
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite(SQLExceptionConversionTest.class);
+	}
+
+	public void testIntegrityViolation() throws Exception {
+		if ( getDialect() instanceof MySQLMyISAMDialect ) {
+			reportSkip( "MySQL (ISAM) does not support FK violation checking", "exception conversion" );
+			return;
+		}
+
+		SQLExceptionConverter converter = getDialect().buildSQLExceptionConverter();
+
+		Session session = openSession();
+		session.beginTransaction();
+		Connection connection = session.connection();
+
+		// Attempt to insert some bad values into the T_MEMBERSHIP table that should
+		// result in a constraint violation
+		PreparedStatement ps = null;
+		try {
+			ps = connection.prepareStatement("INSERT INTO T_MEMBERSHIP (user_id, group_id) VALUES (?, ?)");
+			ps.setLong(1, 52134241);    // Non-existent user_id
+			ps.setLong(2, 5342);        // Non-existent group_id
+			ps.executeUpdate();
+
+			fail("INSERT should have failed");
+		}
+		catch(SQLException sqle) {
+			JDBCExceptionReporter.logExceptions(sqle, "Just output!!!!");
+			JDBCException jdbcException = converter.convert(sqle, null, null);
+			assertEquals( "Bad conversion [" + sqle.getMessage() + "]", ConstraintViolationException.class , jdbcException.getClass() );
+			ConstraintViolationException ex = (ConstraintViolationException) jdbcException;
+			System.out.println("Violated constraint name: " + ex.getConstraintName());
+		}
+		finally {
+			if ( ps != null ) {
+				try {
+					ps.close();
+				}
+				catch( Throwable ignore ) {
+					// ignore...
+				}
+			}
+		}
+
+		session.getTransaction().rollback();
+		session.close();
+	}
+
+	public void testBadGrammar() throws Exception {
+		SQLExceptionConverter converter = getDialect().buildSQLExceptionConverter();
+
+		Session session = openSession();
+		Connection connection = session.connection();
+
+        // prepare/execute a query against a non-existent table
+		PreparedStatement ps = null;
+		try {
+			ps = connection.prepareStatement("SELECT user_id, user_name FROM tbl_no_there");
+			ps.executeQuery();
+
+			fail("SQL compilation should have failed");
+		}
+		catch( SQLException sqle ) {
+			assertEquals( "Bad conversion [" + sqle.getMessage() + "]", SQLGrammarException.class, converter.convert(sqle, null, null).getClass() );
+		}
+		finally {
+			if ( ps != null ) {
+				try {
+					ps.close();
+				}
+				catch( Throwable ignore ) {
+					// ignore...
+				}
+			}
+		}
+
+		session.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/exception/SQLExceptionConversionTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/exception/User.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/exception/User.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/exception/User.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<hibernate-mapping package="org.hibernate.test.exception" >
+	<class name="User" table="T_USER" >
+		<id name="id" unsaved-value="null" column="user_id" >
+			<generator class="native"/>
+		</id>
+		<property name="username" type="string" column="user_name" />
+		<set name="memberships" inverse="false" table="T_MEMBERSHIP" cascade="none">
+			<key column="user_id"/>
+			<many-to-many class="Group" column="group_id"/>
+		</set>
+	</class>
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/exception/User.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/exception/User.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/exception/User.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/exception/User.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,49 @@
+// $Id: User.java 4746 2004-11-11 20:57:28Z steveebersole $
+package org.hibernate.test.exception;
+
+import java.util.Set;
+import java.util.HashSet;
+
+/**
+ * Implementation of User.
+ *
+ * @author Steve Ebersole
+ */
+public class User {
+	private Long id;
+	private String username;
+	private Set memberships = new HashSet();
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getUsername() {
+		return username;
+	}
+
+	public void setUsername(String username) {
+		this.username = username;
+	}
+
+	public Set getMemberships() {
+		return memberships;
+	}
+
+	public void setMemberships(Set memberships) {
+		this.memberships = memberships;
+	}
+
+	public void addMembership(Group membership) {
+		if (membership == null) {
+			throw new IllegalArgumentException("Membership to add cannot be null");
+		}
+
+		this.memberships.add(membership);
+		membership.getMembers().add(this);
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/exception/User.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/Customer.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/Customer.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/Customer.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+  This mapping demonstrates 
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.extendshbm">
+	<subclass name="Customer" extends="Person">
+				<property name="comments"/>
+				<many-to-one name="salesperson"/>
+	</subclass>
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/Customer.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/Customer.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/Customer.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/Customer.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,35 @@
+//$Id: Customer.java 5011 2004-12-19 22:01:25Z maxcsaucdk $
+package org.hibernate.test.extendshbm;
+
+/**
+ * @author Gavin King
+ */
+public class Customer extends Person {
+	private Employee salesperson;
+	private String comments;
+
+	/**
+	 * @return Returns the salesperson.
+	 */
+	public Employee getSalesperson() {
+		return salesperson;
+	}
+	/**
+	 * @param salesperson The salesperson to set.
+	 */
+	public void setSalesperson(Employee salesperson) {
+		this.salesperson = salesperson;
+	}
+	/**
+	 * @return Returns the comments.
+	 */
+	public String getComments() {
+		return comments;
+	}
+	/**
+	 * @param comments The comments to set.
+	 */
+	public void setComments(String comments) {
+		this.comments = comments;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/Customer.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/Employee.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/Employee.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/Employee.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+  This mapping demonstrates 
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.extendshbm">
+	<subclass name="Employee" extends="Person">
+				<property name="title"
+					length="20"/>
+				<property name="salary"
+					length="0"/>
+				<many-to-one name="manager"/>
+		</subclass>
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/Employee.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/Employee.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/Employee.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/Employee.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,49 @@
+//$Id: Employee.java 5011 2004-12-19 22:01:25Z maxcsaucdk $
+package org.hibernate.test.extendshbm;
+
+import java.math.BigDecimal;
+
+/**
+ * @author Gavin King
+ */
+public class Employee extends Person {
+	private String title;
+	private BigDecimal salary;
+	private Employee manager;
+	/**
+	 * @return Returns the title.
+	 */
+	public String getTitle() {
+		return title;
+	}
+	/**
+	 * @param title The title to set.
+	 */
+	public void setTitle(String title) {
+		this.title = title;
+	}
+	/**
+	 * @return Returns the manager.
+	 */
+	public Employee getManager() {
+		return manager;
+	}
+	/**
+	 * @param manager The manager to set.
+	 */
+	public void setManager(Employee manager) {
+		this.manager = manager;
+	}
+	/**
+	 * @return Returns the salary.
+	 */
+	public BigDecimal getSalary() {
+		return salary;
+	}
+	/**
+	 * @param salary The salary to set.
+	 */
+	public void setSalary(BigDecimal salary) {
+		this.salary = salary;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/Employee.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/ExtendsTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/ExtendsTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/ExtendsTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,192 @@
+//$Id: ExtendsTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.extendshbm;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.hibernate.HibernateException;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.testing.junit.UnitTestCase;
+
+/**
+ * @author Gavin King
+ */
+public class ExtendsTest extends UnitTestCase {
+
+	public ExtendsTest(String str) {
+		super( str );
+	}
+
+	public static Test suite() {
+		return new TestSuite( ExtendsTest.class );
+	}
+
+	private String getBaseForMappings() {
+		return "org/hibernate/test/";
+	}
+
+	public void testAllInOne() {
+		Configuration cfg = new Configuration();
+
+		cfg.addResource( getBaseForMappings() + "extendshbm/allinone.hbm.xml" );
+		assertNotNull( cfg.getClassMapping( "org.hibernate.test.extendshbm.Customer" ) );
+		assertNotNull( cfg.getClassMapping( "org.hibernate.test.extendshbm.Person" ) );
+		assertNotNull( cfg.getClassMapping( "org.hibernate.test.extendshbm.Employee" ) );
+	}
+
+	public void testOutOfOrder() {
+		Configuration cfg = new Configuration();
+
+		try {
+			cfg.addResource( getBaseForMappings() + "extendshbm/Customer.hbm.xml" );
+			assertNull(
+					"cannot be in the configuration yet!",
+					cfg.getClassMapping( "org.hibernate.test.extendshbm.Customer" )
+			);
+			cfg.addResource( getBaseForMappings() + "extendshbm/Person.hbm.xml" );
+			cfg.addResource( getBaseForMappings() + "extendshbm/Employee.hbm.xml" );
+
+			cfg.buildSessionFactory();
+
+			assertNotNull( cfg.getClassMapping( "org.hibernate.test.extendshbm.Customer" ) );
+			assertNotNull( cfg.getClassMapping( "org.hibernate.test.extendshbm.Person" ) );
+			assertNotNull( cfg.getClassMapping( "org.hibernate.test.extendshbm.Employee" ) );
+
+		}
+		catch ( HibernateException e ) {
+			fail( "should not fail with exception! " + e );
+		}
+
+	}
+
+	public void testNwaitingForSuper() {
+		Configuration cfg = new Configuration();
+
+		try {
+			cfg.addResource( getBaseForMappings() + "extendshbm/Customer.hbm.xml" );
+			assertNull(
+					"cannot be in the configuration yet!",
+					cfg.getClassMapping( "org.hibernate.test.extendshbm.Customer" )
+			);
+			cfg.addResource( getBaseForMappings() + "extendshbm/Employee.hbm.xml" );
+			assertNull(
+					"cannot be in the configuration yet!",
+					cfg.getClassMapping( "org.hibernate.test.extendshbm.Employee" )
+			);
+			cfg.addResource( getBaseForMappings() + "extendshbm/Person.hbm.xml" );
+
+			cfg.buildMappings();
+
+			assertNotNull( cfg.getClassMapping( "org.hibernate.test.extendshbm.Person" ) );
+			assertNotNull( cfg.getClassMapping( "org.hibernate.test.extendshbm.Employee" ) );
+			assertNotNull( cfg.getClassMapping( "org.hibernate.test.extendshbm.Customer" ) );
+
+
+		}
+		catch ( HibernateException e ) {
+			e.printStackTrace();
+			fail( "should not fail with exception! " + e );
+
+		}
+
+	}
+
+	public void testMissingSuper() {
+		Configuration cfg = new Configuration();
+
+		try {
+			cfg.addResource( getBaseForMappings() + "extendshbm/Customer.hbm.xml" );
+			assertNull(
+					"cannot be in the configuration yet!",
+					cfg.getClassMapping( "org.hibernate.test.extendshbm.Customer" )
+			);
+			cfg.addResource( getBaseForMappings() + "extendshbm/Employee.hbm.xml" );
+
+			cfg.buildSessionFactory();
+
+			fail( "Should not be able to build sessionfactory without a Person" );
+		}
+		catch ( HibernateException e ) {
+
+		}
+
+	}
+
+	public void testAllSeparateInOne() {
+		Configuration cfg = new Configuration();
+
+		try {
+			cfg.addResource( getBaseForMappings() + "extendshbm/allseparateinone.hbm.xml" );
+
+			cfg.buildSessionFactory();
+
+			assertNotNull( cfg.getClassMapping( "org.hibernate.test.extendshbm.Customer" ) );
+			assertNotNull( cfg.getClassMapping( "org.hibernate.test.extendshbm.Person" ) );
+			assertNotNull( cfg.getClassMapping( "org.hibernate.test.extendshbm.Employee" ) );
+
+		}
+		catch ( HibernateException e ) {
+			fail( "should not fail with exception! " + e );
+		}
+
+	}
+
+	public void testJoinedSubclassAndEntityNamesOnly() {
+		Configuration cfg = new Configuration();
+
+		try {
+			cfg.addResource( getBaseForMappings() + "extendshbm/entitynames.hbm.xml" );
+
+			cfg.buildMappings();
+
+			assertNotNull( cfg.getClassMapping( "EntityHasName" ) );
+			assertNotNull( cfg.getClassMapping( "EntityCompany" ) );
+
+		}
+		catch ( HibernateException e ) {
+			e.printStackTrace();
+			fail( "should not fail with exception! " + e );
+
+		}
+	}
+
+	public void testEntityNamesWithPackage() {
+		Configuration cfg = new Configuration();
+		try {
+			cfg.addResource( getBaseForMappings() + "extendshbm/packageentitynames.hbm.xml" );
+
+			cfg.buildMappings();
+
+			assertNotNull( cfg.getClassMapping( "EntityHasName" ) );
+			assertNotNull( cfg.getClassMapping( "EntityCompany" ) );
+
+		}
+		catch ( HibernateException e ) {
+			e.printStackTrace();
+			fail( "should not fail with exception! " + e );
+
+		}
+	}
+
+
+	public void testUnionSubclass() {
+		Configuration cfg = new Configuration();
+
+		try {
+			cfg.addResource( getBaseForMappings() + "extendshbm/unionsubclass.hbm.xml" );
+
+			cfg.buildMappings();
+
+			assertNotNull( cfg.getClassMapping( "org.hibernate.test.extendshbm.Person" ) );
+			assertNotNull( cfg.getClassMapping( "org.hibernate.test.extendshbm.Customer" ) );
+
+		}
+		catch ( HibernateException e ) {
+			e.printStackTrace();
+			fail( "should not fail with exception! " + e );
+
+		}
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/ExtendsTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/Person.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/Person.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/Person.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+  This mapping demonstrates 
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.extendshbm">
+	<class name="Person">
+		
+		<id name="id" 
+			column="person_id" 
+			unsaved-value="0">
+			<generator class="native"/>
+		</id>
+		
+		<discriminator 
+			type="string"
+			/>
+		
+		<property name="name" 
+			not-null="true"
+			length="80"/>
+			
+	</class>
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/Person.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,50 @@
+//$Id: Person.java 5011 2004-12-19 22:01:25Z maxcsaucdk $
+package org.hibernate.test.extendshbm;
+
+
+/**
+ * @author Gavin King
+ */
+public class Person {
+	private long id;
+	private String name;
+	private char sex;
+	
+	/**
+	 * @return Returns the sex.
+	 */
+	public char getSex() {
+		return sex;
+	}
+	/**
+	 * @param sex The sex to set.
+	 */
+	public void setSex(char sex) {
+		this.sex = sex;
+	}
+	/**
+	 * @return Returns the id.
+	 */
+	public long getId() {
+		return id;
+	}
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(long id) {
+		this.id = id;
+	}
+	/**
+	 * @return Returns the identity.
+	 */
+	public String getName() {
+		return name;
+	}
+	/**
+	 * @param identity The identity to set.
+	 */
+	public void setName(String identity) {
+		this.name = identity;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/Person.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/allinone.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/allinone.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/allinone.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,46 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+  This mapping demonstrates 
+
+-->
+
+<hibernate-mapping 
+	package="org.hibernate.test.extendshbm">
+	
+	<class name="Person">
+		
+		<id name="id" 
+			column="person_id" 
+			unsaved-value="0">
+			<generator class="native"/>
+		</id>
+		
+		<discriminator 
+			type="string"/>
+		
+		<property name="name" 
+			not-null="true"
+			length="80"/>
+			
+		<subclass name="Employee">
+				<property name="title"
+					length="20"/>
+				<property name="salary"
+					length="0"/>
+				<many-to-one name="manager"/>
+		</subclass>
+		
+		<subclass name="Customer">
+				<property name="comments"/>
+				<many-to-one name="salesperson"/>
+		</subclass>
+		
+	</class>
+	
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/allinone.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/allseparateinone.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/allseparateinone.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/allseparateinone.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,49 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+  This mapping demonstrates 
+
+-->
+
+<hibernate-mapping 
+	package="org.hibernate.test.extendshbm">
+	
+	<class name="Person">
+		
+		<id name="id" 
+			column="person_id" 
+			unsaved-value="0">
+			<generator class="native"/>
+		</id>
+		
+		<discriminator 
+			type="string"/>
+		
+		<property name="name" 
+			not-null="true"
+			length="80"/>
+			
+		<subclass name="Employee">
+				<property name="title"
+					length="20"/>
+				<property name="salary"
+					length="0"/>
+				<many-to-one name="manager"/>
+		</subclass>
+		
+		
+		
+	</class>
+	
+	
+	<subclass name="Customer" extends="Person">
+				<property name="comments"/>
+				<many-to-one name="salesperson"/>
+	</subclass>
+
+	
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/allseparateinone.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/entitynames.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/entitynames.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/entitynames.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,18 @@
+<!DOCTYPE hibernate-mapping
+        PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping>
+    <class lazy="true" entity-name="EntityHasName" table="F5_ENTITY_HASNAME">
+        <id name="id" column="ID" type="long">
+            <generator class="native"/>
+        </id>
+        <property name="attrName" type="string">
+            <column name="NAME"/>
+        </property>
+    </class>
+    <joined-subclass lazy="true" entity-name="EntityCompany" table="F5_ENTITY_COMPANY" extends="EntityHasName">
+        <key column="REF_ID"/>
+        <many-to-one name="parent" entity-name="EntityHasName"/>
+    </joined-subclass>
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/entitynames.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/packageentitynames.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/packageentitynames.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/packageentitynames.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,18 @@
+<!DOCTYPE hibernate-mapping
+        PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.extendshbm">
+    <class lazy="true" entity-name="EntityHasName" table="F5_ENTITY_HASNAME">
+        <id name="id" column="ID" type="long">
+            <generator class="native"/>
+        </id>
+        <property name="attrName" type="string">
+            <column name="NAME"/>
+        </property>
+    </class>
+    <joined-subclass lazy="true" entity-name="EntityCompany" table="F5_ENTITY_COMPANY" extends="EntityHasName">
+        <key column="REF_ID"/>
+        <many-to-one name="parent" entity-name="EntityHasName"/>
+    </joined-subclass>
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/packageentitynames.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/unionsubclass.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/unionsubclass.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/unionsubclass.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,46 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+  This mapping demonstrates 
+
+-->
+
+<hibernate-mapping 
+	package="org.hibernate.test.extendshbm">
+	
+		<class name="Person">
+		
+		<id name="id" 
+			column="person_id" 
+			unsaved-value="0">
+			<generator class="native"/>
+		</id>
+		
+		<discriminator 
+			type="string"/>
+		
+		<property name="name" 
+			not-null="true"
+			length="80"/>
+	
+	</class>
+	
+	
+	<union-subclass name="Customer" extends="Person">
+				<property name="comments"/>
+				<many-to-one name="salesperson"/>
+	</union-subclass>
+
+        <subclass name="Employee" extends="Person">
+				<property name="title"
+					length="20"/>
+				<property name="salary"
+					length="0"/>
+				<many-to-one name="manager"/>
+		</subclass>
+		
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extendshbm/unionsubclass.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extralazy/Document.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extralazy/Document.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extralazy/Document.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,38 @@
+//$Id: Document.java 7635 2005-07-24 23:04:30Z oneovthafew $
+package org.hibernate.test.extralazy;
+
+public class Document {
+
+	private String title;
+	private String content;
+	private User owner;
+	
+	Document() {}
+	
+	public Document(String title, String content, User owner) {
+		this.content = content;
+		this.owner = owner;
+		this.title = title;
+		owner.getDocuments().add(this);
+	}
+
+	public String getContent() {
+		return content;
+	}
+	public void setContent(String content) {
+		this.content = content;
+	}
+	public User getOwner() {
+		return owner;
+	}
+	public void setOwner(User owner) {
+		this.owner = owner;
+	}
+	public String getTitle() {
+		return title;
+	}
+	public void setTitle(String title) {
+		this.title = title;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extralazy/Document.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extralazy/ExtraLazyTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extralazy/ExtraLazyTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extralazy/ExtraLazyTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,221 @@
+//$Id: ExtraLazyTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.extralazy;
+
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class ExtraLazyTest extends FunctionalTestCase {
+
+	public ExtraLazyTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "extralazy/UserGroup.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( ExtraLazyTest.class );
+	}
+
+	public void testOrphanDelete() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		User gavin = new User("gavin", "secret");
+		Document hia = new Document("HiA", "blah blah blah", gavin);
+		Document hia2 = new Document("HiA2", "blah blah blah blah", gavin);
+		s.persist(gavin);
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		gavin = (User) s.get(User.class, "gavin");
+		assertEquals( 2, gavin.getDocuments().size() );
+		gavin.getDocuments().remove(hia2);
+		assertFalse( gavin.getDocuments().contains(hia2) );
+		assertTrue( gavin.getDocuments().contains(hia) );
+		assertEquals( 1, gavin.getDocuments().size() );
+		assertFalse( Hibernate.isInitialized( gavin.getDocuments() ) );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		gavin = (User) s.get(User.class, "gavin");
+		assertEquals( 1, gavin.getDocuments().size() );
+		assertFalse( gavin.getDocuments().contains(hia2) );
+		assertTrue( gavin.getDocuments().contains(hia) );
+		assertFalse( Hibernate.isInitialized( gavin.getDocuments() ) );
+		assertNull( s.get(Document.class, "HiA2") );
+		gavin.getDocuments().clear();
+		assertTrue( Hibernate.isInitialized( gavin.getDocuments() ) );
+		s.delete(gavin);
+		t.commit();
+		s.close();
+	}
+	
+	public void testGet() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		User gavin = new User("gavin", "secret");
+		User turin = new User("turin", "tiger");
+		Group g = new Group("developers");
+		g.getUsers().put("gavin", gavin);
+		g.getUsers().put("turin", turin);
+		s.persist(g);
+		gavin.getSession().put( "foo", new SessionAttribute("foo", "foo bar baz") );
+		gavin.getSession().put( "bar", new SessionAttribute("bar", "foo bar baz 2") );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		g = (Group) s.get(Group.class, "developers");
+		gavin = (User) g.getUsers().get("gavin");
+		turin = (User) g.getUsers().get("turin");
+		assertNotNull(gavin);
+		assertNotNull(turin);
+		assertNull( g.getUsers().get("emmanuel") );
+		assertFalse( Hibernate.isInitialized( g.getUsers() ) );
+		assertNotNull( gavin.getSession().get("foo") );
+		assertNull( turin.getSession().get("foo") );
+		assertFalse( Hibernate.isInitialized( gavin.getSession() ) );
+		assertFalse( Hibernate.isInitialized( turin.getSession() ) );
+		s.delete(gavin);
+		s.delete(turin);
+		s.delete(g);
+		t.commit();
+		s.close();
+	}
+	
+	public void testRemoveClear() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		User gavin = new User("gavin", "secret");
+		User turin = new User("turin", "tiger");
+		Group g = new Group("developers");
+		g.getUsers().put("gavin", gavin);
+		g.getUsers().put("turin", turin);
+		s.persist(g);
+		gavin.getSession().put( "foo", new SessionAttribute("foo", "foo bar baz") );
+		gavin.getSession().put( "bar", new SessionAttribute("bar", "foo bar baz 2") );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		g = (Group) s.get(Group.class, "developers");
+		gavin = (User) g.getUsers().get("gavin");
+		turin = (User) g.getUsers().get("turin");
+		assertFalse( Hibernate.isInitialized( g.getUsers() ) );
+		g.getUsers().clear();
+		gavin.getSession().remove("foo");
+		assertTrue( Hibernate.isInitialized( g.getUsers() ) );
+		assertTrue( Hibernate.isInitialized( gavin.getSession() ) );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		g = (Group) s.get(Group.class, "developers");
+		assertTrue( g.getUsers().isEmpty() );
+		assertFalse( Hibernate.isInitialized( g.getUsers() ) );
+		gavin = (User) s.get(User.class, "gavin");
+		assertFalse( gavin.getSession().containsKey("foo") );
+		assertFalse( Hibernate.isInitialized( gavin.getSession() ) );
+		s.delete(gavin);
+		s.delete(turin);
+		s.delete(g);
+		t.commit();
+		s.close();
+	}
+	
+	public void testIndexFormulaMap() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		User gavin = new User("gavin", "secret");
+		User turin = new User("turin", "tiger");
+		Group g = new Group("developers");
+		g.getUsers().put("gavin", gavin);
+		g.getUsers().put("turin", turin);
+		s.persist(g);
+		gavin.getSession().put( "foo", new SessionAttribute("foo", "foo bar baz") );
+		gavin.getSession().put( "bar", new SessionAttribute("bar", "foo bar baz 2") );
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		g = (Group) s.get(Group.class, "developers");
+		assertEquals( g.getUsers().size(), 2 );
+		g.getUsers().remove("turin");
+		Map smap = ( (User) g.getUsers().get("gavin") ).getSession();
+		assertEquals(smap.size(), 2);
+		smap.remove("bar");
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		g = (Group) s.get(Group.class, "developers");
+		assertEquals( g.getUsers().size(), 1 );
+		smap = ( (User) g.getUsers().get("gavin") ).getSession();
+		assertEquals(smap.size(), 1);
+		gavin = (User) g.getUsers().put("gavin", turin);
+		s.delete(gavin);
+		assertEquals( s.createQuery("select count(*) from SessionAttribute").uniqueResult(), new Long(0) );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		g = (Group) s.get(Group.class, "developers");
+		assertEquals( g.getUsers().size(), 1 );
+		turin = (User) g.getUsers().get("turin");
+		smap = turin.getSession();
+		assertEquals(smap.size(), 0);
+		assertEquals( s.createQuery("select count(*) from User").uniqueResult(), new Long(1) );
+		s.delete(g);
+		s.delete(turin);
+		assertEquals( s.createQuery("select count(*) from User").uniqueResult(), new Long(0) );
+		t.commit();
+		s.close();
+	}
+	
+	public void testSQLQuery() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		User gavin = new User("gavin", "secret");
+		User turin = new User("turin", "tiger");
+		gavin.getSession().put( "foo", new SessionAttribute("foo", "foo bar baz") );
+		gavin.getSession().put( "bar", new SessionAttribute("bar", "foo bar baz 2") );
+		s.persist(gavin);
+		s.persist(turin);
+		s.flush();
+		s.clear();
+		List results = s.getNamedQuery("userSessionData").setParameter("uname", "%in").list();
+		assertEquals( results.size(), 2 );
+		gavin = (User) ( (Object[]) results.get(0) )[0];
+		assertEquals( gavin.getName(), "gavin" );
+		assertEquals( gavin.getSession().size(), 2 );
+		s.createQuery("delete SessionAttribute").executeUpdate();
+		s.createQuery("delete User").executeUpdate();
+		t.commit();
+		s.close();
+		
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extralazy/ExtraLazyTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extralazy/Group.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extralazy/Group.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extralazy/Group.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,29 @@
+//$Id: Group.java 7628 2005-07-24 06:55:01Z oneovthafew $
+package org.hibernate.test.extralazy;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author Gavin King
+ */
+public class Group {
+	private String name;
+	private Map users = new HashMap();
+	Group() {}
+	public Group(String n) {
+		name = n;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public Map getUsers() {
+		return users;
+	}
+	public void setUsers(Map users) {
+		this.users = users;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extralazy/Group.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extralazy/SessionAttribute.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extralazy/SessionAttribute.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extralazy/SessionAttribute.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,41 @@
+//$Id: SessionAttribute.java 7628 2005-07-24 06:55:01Z oneovthafew $
+package org.hibernate.test.extralazy;
+
+import java.io.Serializable;
+
+/**
+ * @author Gavin King
+ */
+public class SessionAttribute {
+	private Long id;
+	private String name;
+	private String stringData;
+	private Serializable objectData;
+	SessionAttribute() {}
+	public SessionAttribute(String name, Serializable obj) {
+		this.name = name;
+		this.objectData = obj;
+	}
+	public SessionAttribute(String name, String str) {
+		this.name = name;
+		this.stringData = str;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public Serializable getObjectData() {
+		return objectData;
+	}
+	public void setObjectData(Serializable objectData) {
+		this.objectData = objectData;
+	}
+	public String getStringData() {
+		return stringData;
+	}
+	public void setStringData(String stringData) {
+		this.stringData = stringData;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extralazy/SessionAttribute.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extralazy/User.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extralazy/User.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extralazy/User.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,46 @@
+//$Id: User.java 7635 2005-07-24 23:04:30Z oneovthafew $
+package org.hibernate.test.extralazy;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author Gavin King
+ */
+public class User {
+	private String name;
+	private String password;
+	private Map session = new HashMap();
+	private Set documents = new HashSet();
+	User() {}
+	public User(String n, String pw) {
+		name=n;
+		password = pw;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public String getPassword() {
+		return password;
+	}
+	public void setPassword(String password) {
+		this.password = password;
+	}
+	public Map getSession() {
+		return session;
+	}
+	public void setSession(Map session) {
+		this.session = session;
+	}
+	public Set getDocuments() {
+		return documents;
+	}
+	public void setDocuments(Set documents) {
+		this.documents = documents;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extralazy/User.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extralazy/UserGroup.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extralazy/UserGroup.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extralazy/UserGroup.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,67 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+     
+-->
+
+<hibernate-mapping package="org.hibernate.test.extralazy">
+	
+	<class name="Group" table="groups">
+		<id name="name"/>
+		<map name="users" cascade="persist" 
+				table="group_user" lazy="extra">
+			<key column="groupName"/>
+			<map-key formula="lower(personName)" type="string"/>
+			<many-to-many column="personName" class="User"/>
+		</map>
+	</class>
+	
+	<class name="User" table="users">
+		<id name="name"/>
+		<property name="password"/>
+		<map name="session" lazy="extra" 
+				cascade="persist,save-update,delete,delete-orphan">
+			<key column="userName" not-null="true"/>
+			<map-key column="name" type="string"/>
+			<one-to-many class="SessionAttribute"/>
+		</map>
+		<set name="documents" inverse="true" 
+				lazy="extra" cascade="all,delete-orphan">
+			<key column="owner"/>
+			<one-to-many class="Document"/>
+		</set>
+	</class>
+	
+	<class name="Document" table="documents">
+		<id name="title"/>
+		<property name="content" type="text"/>
+		<many-to-one name="owner" not-null="true"/>
+	</class>
+	
+	<class name="SessionAttribute" table="session_attributes">
+		<id name="id" access="field">
+			<generator class="native"/>
+		</id>
+		<property name="name" not-null="true" 
+				insert="false" update="false"/>
+		<property name="stringData"/>
+		<property name="objectData"/>
+	</class>
+	
+	<sql-query name="userSessionData">
+		<return alias="u" class="User"/>
+		<return-join alias="s" property="u.session"/>
+		select 
+			lower(u.name) as {u.name}, lower(u.password) as {u.password}, 
+			lower(s.userName) as {s.key}, lower(s.name) as {s.index}, s.id as {s.element}, 
+			{s.element.*}
+		from users u 
+		join session_attributes s on lower(s.userName) = lower(u.name)
+		where u.name like :uname
+	</sql-query>	
+	
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/extralazy/UserGroup.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/join/Course.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/join/Course.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/join/Course.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,123 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.fetchprofiles.join;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class Course {
+	private Long id;
+	private Code code;
+	private String name;
+
+	public Course() {
+	}
+
+	public Course(Code code, String name) {
+		this.code = code;
+		this.name = name;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Code getCode() {
+		return code;
+	}
+
+	public void setCode(Code code) {
+		this.code = code;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+	public static class Code {
+		private Department department;
+		private int number;
+
+		public Code() {
+		}
+
+		public Code(Department department, int number) {
+			this.department = department;
+			this.number = number;
+		}
+
+		public Department getDepartment() {
+			return department;
+		}
+
+		public void setDepartment(Department department) {
+			this.department = department;
+		}
+
+		public int getNumber() {
+			return number;
+		}
+
+		public void setNumber(int number) {
+			this.number = number;
+		}
+
+		public boolean equals(Object o) {
+			if ( this == o ) {
+				return true;
+			}
+			if ( !( o instanceof Code ) ) {
+				return false;
+			}
+
+			Code code = ( Code ) o;
+
+			if ( number != code.number ) {
+				return false;
+			}
+			if ( !department.equals( code.department ) ) {
+				return false;
+			}
+
+			return true;
+		}
+
+		public int hashCode() {
+			int result;
+			result = department.hashCode();
+			result = 31 * result + number;
+			return result;
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/join/Course.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/join/CourseOffering.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/join/CourseOffering.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/join/CourseOffering.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,90 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.fetchprofiles.join;
+
+import java.util.Set;
+import java.util.HashSet;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class CourseOffering {
+	private Long id;
+	private Course course;
+	private int semester;
+	private int year;
+	private Set enrollments = new HashSet();
+
+	public CourseOffering() {
+	}
+
+	public CourseOffering(Course course, int semester, int year) {
+		this.course = course;
+		this.semester = semester;
+		this.year = year;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Course getCourse() {
+		return course;
+	}
+
+	public void setCourse(Course course) {
+		this.course = course;
+	}
+
+	public int getSemester() {
+		return semester;
+	}
+
+	public void setSemester(int semester) {
+		this.semester = semester;
+	}
+
+	public int getYear() {
+		return year;
+	}
+
+	public void setYear(int year) {
+		this.year = year;
+	}
+
+	public Set getEnrollments() {
+		return enrollments;
+	}
+
+	public void setEnrollments(Set enrollments) {
+		this.enrollments = enrollments;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/join/CourseOffering.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/join/Department.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/join/Department.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/join/Department.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,68 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.fetchprofiles.join;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class Department {
+	private Long id;
+	private String code;
+	private String name;
+
+	public Department() {
+	}
+
+	public Department(String code, String name) {
+		this.code = code;
+		this.name = name;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getCode() {
+		return code;
+	}
+
+	public void setCode(String code) {
+		this.code = code;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/join/Department.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/join/Enrollment.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/join/Enrollment.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/join/Enrollment.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,77 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.fetchprofiles.join;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class Enrollment {
+	private Long id;
+	private CourseOffering offering;
+	private Student student;
+	private int finalGrade;
+
+	public Enrollment() {
+	}
+
+	public Enrollment(CourseOffering offering, Student student) {
+		this.offering = offering;
+		this.student = student;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public CourseOffering getOffering() {
+		return offering;
+	}
+
+	public void setOffering(CourseOffering offering) {
+		this.offering = offering;
+	}
+
+	public Student getStudent() {
+		return student;
+	}
+
+	public void setStudent(Student student) {
+		this.student = student;
+	}
+
+	public int getFinalGrade() {
+		return finalGrade;
+	}
+
+	public void setFinalGrade(int finalGrade) {
+		this.finalGrade = finalGrade;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/join/Enrollment.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/join/JoinFetchProfileTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/join/JoinFetchProfileTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/join/JoinFetchProfileTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,310 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.fetchprofiles.join;
+
+import java.util.List;
+
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.Session;
+import org.hibernate.Hibernate;
+import org.hibernate.UnknownProfileException;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.engine.SessionImplementor;
+
+/**
+ * Various tests related to join-style fetch profiles.
+ *
+ * @author Steve Ebersole
+ */
+public class JoinFetchProfileTest extends FunctionalTestCase {
+	private List sections;
+
+	public JoinFetchProfileTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "fetchprofiles/join/Mappings.hbm.xml" };
+	}
+
+	public String getCacheConcurrencyStrategy() {
+		return null;
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
+	}
+
+	private static interface TestData {
+		public Long getStudentId();
+		public Long getDepartmentId();
+		public Long getCourseId();
+		public Long getSectionId();
+		public Long getEnrollmentId();
+	}
+
+	private interface TestCode {
+		public void perform(TestData data);
+	}
+
+	private void performWithStandardData(TestCode testCode) {
+		Session session = openSession();
+		session.beginTransaction();
+		final Department literatureDepartment = new Department( "lit", "Literature" );
+		session.save( literatureDepartment );
+		final Course lit101 = new Course( new Course.Code( literatureDepartment, 101 ), "Introduction to Literature" );
+		session.save( lit101 );
+		final CourseOffering section = new CourseOffering( lit101, 1, 2008 );
+		session.save( section );
+		final Student me = new Student( "Steve" );
+		session.save( me );
+		final Enrollment enrollment = new Enrollment( section, me );
+		section.getEnrollments().add( enrollment );
+		session.save( enrollment );
+		session.getTransaction().commit();
+		session.close();
+
+		sfi().getStatistics().clear();
+
+		testCode.perform(
+				new TestData() {
+					public Long getStudentId() {
+						return me.getId();
+					}
+
+					public Long getDepartmentId() {
+						return literatureDepartment.getId();
+					}
+
+					public Long getCourseId() {
+						return lit101.getId();
+					}
+
+					public Long getSectionId() {
+						return section.getId();
+					}
+
+					public Long getEnrollmentId() {
+						return enrollment.getId();
+					}
+				}
+		);
+
+		session = openSession();
+		session.beginTransaction();
+		session.delete( enrollment );
+		session.delete( me );
+		session.delete( enrollment.getOffering() );
+		session.delete( enrollment.getOffering().getCourse() );
+		session.delete( enrollment.getOffering().getCourse().getCode().getDepartment() );
+		session.getTransaction().commit();
+		session.close();
+	}
+
+	public void testNormalLoading() {
+		performWithStandardData(
+				new TestCode() {
+					public void perform(TestData data) {
+						Session session = openSession();
+						session.beginTransaction();
+						CourseOffering section = ( CourseOffering ) session.get( CourseOffering.class, data.getSectionId() );
+						assertEquals( 1, sfi().getStatistics().getEntityLoadCount() );
+						assertEquals( 0, sfi().getStatistics().getEntityFetchCount() );
+						assertFalse( Hibernate.isInitialized( section.getCourse() ) );
+						assertFalse( Hibernate.isInitialized( section.getEnrollments() ) );
+						assertFalse( Hibernate.isInitialized( section.getCourse().getCode().getDepartment() ) );
+						assertTrue( Hibernate.isInitialized( section.getCourse() ) );
+						assertEquals( 1, sfi().getStatistics().getEntityFetchCount() );
+						session.getTransaction().commit();
+						session.close();
+					}
+				}
+		);
+	}
+
+	public void testNormalCriteria() {
+		performWithStandardData(
+				new TestCode() {
+					public void perform(TestData data) {
+						Session session = openSession();
+						session.beginTransaction();
+						CourseOffering section = ( CourseOffering ) session.createCriteria( CourseOffering.class ).uniqueResult();
+						assertEquals( 1, sfi().getStatistics().getEntityLoadCount() );
+						assertEquals( 0, sfi().getStatistics().getEntityFetchCount() );
+						assertFalse( Hibernate.isInitialized( section.getCourse() ) );
+						assertFalse( Hibernate.isInitialized( section.getEnrollments() ) );
+						assertFalse( Hibernate.isInitialized( section.getCourse().getCode().getDepartment() ) );
+						assertTrue( Hibernate.isInitialized( section.getCourse() ) );
+						assertEquals( 1, sfi().getStatistics().getEntityFetchCount() );
+						session.getTransaction().commit();
+						session.close();
+					}
+				}
+		);
+	}
+
+	public void testBasicFetchProfileOperation() {
+		assertTrue( "fetch profile not parsed properly", sfi().containsFetchProfileDefinition( "enrollment.details" ) );
+		assertTrue( "fetch profile not parsed properly", sfi().containsFetchProfileDefinition( "offering.details" ) );
+		assertTrue( "fetch profile not parsed properly", sfi().containsFetchProfileDefinition( "course.details" ) );
+		Session s = openSession();
+		SessionImplementor si = ( SessionImplementor ) s;
+		s.enableFetchProfile( "enrollment.details" );
+		assertTrue( si.getLoadQueryInfluencers().hasEnabledFetchProfiles() );
+		s.disableFetchProfile( "enrollment.details" );
+		assertFalse( si.getLoadQueryInfluencers().hasEnabledFetchProfiles() );
+		try {
+			s.enableFetchProfile( "never-gonna-get-it" );
+			fail( "expecting failure on undefined fetch-profile" );
+		}
+		catch ( UnknownProfileException expected ) {
+		}
+		s.close();
+	}
+
+	public void testLoadManyToOneFetchProfile() {
+		performWithStandardData(
+				new TestCode() {
+					public void perform(TestData data) {
+						Session session = openSession();
+						session.beginTransaction();
+						session.enableFetchProfile( "enrollment.details" );
+						Enrollment enrollment = ( Enrollment ) session.get( Enrollment.class, data.getEnrollmentId() );
+						assertEquals( 3, sfi().getStatistics().getEntityLoadCount() ); // enrollment + (section + student)
+						assertEquals( 0, sfi().getStatistics().getEntityFetchCount() );
+						assertTrue( Hibernate.isInitialized( enrollment.getOffering() ) );
+						assertTrue( Hibernate.isInitialized( enrollment.getStudent() ) );
+						assertEquals( 0, sfi().getStatistics().getEntityFetchCount() );
+						session.getTransaction().commit();
+						session.close();
+					}
+				}
+		);
+	}
+
+	public void testCriteriaManyToOneFetchProfile() {
+		performWithStandardData(
+				new TestCode() {
+					public void perform(TestData data) {
+						Session session = openSession();
+						session.beginTransaction();
+						session.enableFetchProfile( "enrollment.details" );
+						Enrollment enrollment = ( Enrollment ) session.createCriteria( Enrollment.class ).uniqueResult();
+						assertEquals( 3, sfi().getStatistics().getEntityLoadCount() ); // enrollment + (section + student)
+						assertEquals( 0, sfi().getStatistics().getEntityFetchCount() );
+						assertTrue( Hibernate.isInitialized( enrollment.getOffering() ) );
+						assertTrue( Hibernate.isInitialized( enrollment.getStudent() ) );
+						assertEquals( 0, sfi().getStatistics().getEntityFetchCount() );
+						session.getTransaction().commit();
+						session.close();
+					}
+				}
+		);
+	}
+
+	public void testLoadOneToManyFetchProfile() {
+		performWithStandardData(
+				new TestCode() {
+					public void perform(TestData data) {
+						Session session = openSession();
+						session.beginTransaction();
+						session.enableFetchProfile( "offering.details" );
+						CourseOffering section = ( CourseOffering ) session.get( CourseOffering.class, data.getSectionId() );
+						assertEquals( 3, sfi().getStatistics().getEntityLoadCount() ); // section + (enrollments + course)
+						assertEquals( 0, sfi().getStatistics().getEntityFetchCount() );
+						assertTrue( Hibernate.isInitialized( section.getEnrollments() ) );
+						session.getTransaction().commit();
+						session.close();
+					}
+				}
+		);
+	}
+
+	public void testLoadDeepFetchProfile() {
+		performWithStandardData(
+				new TestCode() {
+					public void perform(TestData data) {
+						Session session = openSession();
+						session.beginTransaction();
+						// enable both enrollment and offering detail profiles;
+						// then loading the section/offering should fetch the enrollment
+						// which in turn should fetch student (+ offering).
+						session.enableFetchProfile( "offering.details" );
+						session.enableFetchProfile( "enrollment.details" );
+						CourseOffering section = ( CourseOffering ) session.get( CourseOffering.class, data.getSectionId() );
+						assertEquals( 4, sfi().getStatistics().getEntityLoadCount() ); // section + (course + enrollments + (student))
+						assertEquals( 0, sfi().getStatistics().getEntityFetchCount() );
+						assertTrue( Hibernate.isInitialized( section.getEnrollments() ) );
+						session.getTransaction().commit();
+						session.close();
+					}
+				}
+		);
+	}
+
+	public void testLoadComponentDerefFetchProfile() {
+		performWithStandardData(
+				new TestCode() {
+					public void perform(TestData data) {
+						Session session = openSession();
+						session.beginTransaction();
+						session.enableFetchProfile( "course.details" );
+						Course course = ( Course ) session.get( Course.class, data.getCourseId() );
+						assertEquals( 2, sfi().getStatistics().getEntityLoadCount() ); // course + department
+						assertEquals( 0, sfi().getStatistics().getEntityFetchCount() );
+						assertTrue( Hibernate.isInitialized( course.getCode().getDepartment() ) );
+						session.getTransaction().commit();
+						session.close();
+					}
+				}
+		);
+	}
+
+	/**
+	 * fetch-profiles should have no effect what-so-ever on the direct results of the HQL query.
+	 *
+	 * TODO : this is actually not strictly true.  what we should have happen is to subsequently load those fetches
+	 */
+	public void testHQL() {
+		performWithStandardData(
+				new TestCode() {
+					public void perform(TestData data) {
+						Session session = openSession();
+						session.beginTransaction();
+						session.enableFetchProfile( "offering.details" );
+						session.enableFetchProfile( "enrollment.details" );
+						List sections = session.createQuery( "from CourseOffering" ).list();
+						int sectionCount = sections.size();
+						assertEquals( "unexpected CourseOffering count", 1, sectionCount );
+						assertEquals( 1, sfi().getStatistics().getEntityLoadCount() );
+						assertEquals( 0, sfi().getStatistics().getEntityFetchCount() );
+						session.getTransaction().commit();
+						session.close();
+					}
+				}
+		);
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/join/JoinFetchProfileTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/join/Mappings.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/join/Mappings.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/join/Mappings.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,96 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping
+        SYSTEM
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<!--
+  ~ Hibernate, Relational Persistence for Idiomatic Java
+  ~
+  ~ Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+  ~ indicated by the @author tags or express copyright attribution
+  ~ statements applied by the authors.  All third-party contributions are
+  ~ distributed under license by Red Hat Middleware LLC.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, as published by the Free Software Foundation.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  ~ or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+  ~ for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public License
+  ~ along with this distribution; if not, write to:
+  ~ Free Software Foundation, Inc.
+  ~ 51 Franklin Street, Fifth Floor
+  ~ Boston, MA  02110-1301  USA
+  ~
+  -->
+
+<hibernate-mapping package="org.hibernate.test.fetchprofiles.join">
+
+    <class name="Department">
+    	<id name="id" type="long">
+    		<generator class="increment"/>
+    	</id>
+        <property name="code" column="CODE" type="string"/>
+        <property name="name" column="NAME" type="string"/>
+	</class>
+
+    <class name="Student">
+        <id name="id" type="long">
+            <generator class="increment"/>
+        </id>
+        <property name="name" column="NAME" type="string"/>
+    </class>
+
+    <class name="Course">
+        <id name="id" type="long">
+            <generator class="increment"/>
+        </id>
+        <property name="name" column="NAME" type="string"/>
+        <component name="code" class="Course$Code">
+            <many-to-one name="department" class="Department" column="DEPT_ID" cascade="save-update"/>
+            <property name="number" type="int" column="CODE_NUMBER"/>
+        </component>
+        <fetch-profile name="course.details">
+            <fetch association="code.department" style="join"/>
+        </fetch-profile>
+    </class>
+
+    <class name="CourseOffering" table="SECTION">
+        <id name="id" type="long">
+            <generator class="increment"/>
+        </id>
+        <many-to-one name="course" column="COURSE_ID" class="Course"/>
+        <property name="semester" type="int" column="SEMESTER"/>
+        <property name="year" type="int" column="`YEAR`"/>
+        <set name="enrollments" lazy="true" cascade="all">
+            <key column="SECTION_ID"/>
+            <one-to-many class="Enrollment"/>
+        </set>
+        <fetch-profile name="offering.details">
+            <fetch association="enrollments" style="join"/>
+            <fetch association="course" style="join"/>
+        </fetch-profile>
+        <fetch-profile name="offering.details2">
+            <fetch entity="CourseOffering" association="enrollments" style="join"/>
+        </fetch-profile>
+    </class>
+
+    <class name="Enrollment">
+        <id name="id" type="long">
+            <generator class="increment"/>
+        </id>
+        <many-to-one name="offering" column="SECTION_ID" class="CourseOffering" cascade="none"/>
+        <many-to-one name="student" column="STUDENT_ID" class="Student" cascade="none"/>
+        <property name="finalGrade" column="FINAL_GRADE" type="int"/>
+    </class>
+
+    <fetch-profile name="enrollment.details">
+        <fetch entity="Enrollment" association="student" style="join"/>
+        <fetch entity="Enrollment" association="offering" style="join"/>
+    </fetch-profile>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/join/Mappings.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/join/Student.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/join/Student.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/join/Student.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,58 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.fetchprofiles.join;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class Student {
+	private Long id;
+	private String name;
+
+	public Student() {
+	}
+
+	public Student(String name) {
+		this.name = name;
+	}
+
+	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;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/fetchprofiles/join/Student.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Category.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Category.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Category.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,29 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping
+        SYSTEM
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<hibernate-mapping package="org.hibernate.test.filter">
+
+    <class name="Category" table="CATEGORY">
+        <id name="id" column="CAT_ID">
+            <generator class="native"/>
+        </id>
+
+        <property name="name" type="string"/>
+        <property name="effectiveStartDate" column="eff_start_dt" type="java.util.Date"/>
+        <property name="effectiveEndDate" column="eff_end_dt" type="java.util.Date"/>
+
+        <set cascade="none" inverse="true" name="products" table="PROD_CAT">
+            <key column="CAT_ID"/>
+            <many-to-many column="PROD_ID" class="Product"/>
+        </set>
+
+        <filter name="effectiveDate" condition=":asOfDate BETWEEN eff_start_dt and eff_end_dt"/>
+        <filter name="unioned">
+            'abc' in ( select d.reg from DEPARTMENT d where (d.dept_id=123) union select p.name from SALES_PERSON p )
+        </filter>
+
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Category.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Category.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Category.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Category.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,104 @@
+// $Id: Category.java 6507 2005-04-25 16:57:32Z steveebersole $
+package org.hibernate.test.filter;
+
+import java.util.Date;
+import java.util.Set;
+
+/**
+ * Implementation of Category.
+ *
+ * @author Steve Ebersole
+ */
+public class Category {
+	private Long id;
+	private String name;
+	private Date effectiveStartDate;
+	private Date effectiveEndDate;
+	private Set products;
+
+	public Category() {
+	}
+
+	public Category(String name) {
+		this.name = name;
+	}
+
+	public Category(String name, Date effectiveStartDate, Date effectiveEndDate) {
+		this.name = name;
+		this.effectiveStartDate = effectiveStartDate;
+		this.effectiveEndDate = effectiveEndDate;
+	}
+
+	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 Date getEffectiveStartDate() {
+		return effectiveStartDate;
+	}
+
+	public void setEffectiveStartDate(Date effectiveStartDate) {
+		this.effectiveStartDate = effectiveStartDate;
+	}
+
+	public Date getEffectiveEndDate() {
+		return effectiveEndDate;
+	}
+
+	public void setEffectiveEndDate(Date effectiveEndDate) {
+		this.effectiveEndDate = effectiveEndDate;
+	}
+
+	public Set getProducts() {
+		return products;
+	}
+
+	public void setProducts(Set products) {
+		this.products = products;
+	}
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( !( o instanceof Category ) ) return false;
+
+		final Category category = ( Category ) o;
+
+		if ( !name.equals( category.name ) ) {
+			return false;
+		}
+
+		if ( effectiveEndDate != null ?
+		        !effectiveEndDate.equals( category.effectiveEndDate ) :
+		        category.effectiveEndDate != null ) {
+			return false;
+		}
+
+		if ( effectiveStartDate != null ?
+		        !effectiveStartDate.equals( category.effectiveStartDate ) :
+		        category.effectiveStartDate != null ) {
+			return false;
+		}
+
+		return true;
+	}
+
+	public int hashCode() {
+		int result;
+		result = name.hashCode();
+		result = 29 * result + ( effectiveStartDate != null ? effectiveStartDate.hashCode() : 0 );
+		result = 29 * result + ( effectiveEndDate != null ? effectiveEndDate.hashCode() : 0 );
+		return result;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Category.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Department.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Department.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Department.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping
+        SYSTEM
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<hibernate-mapping package="org.hibernate.test.filter">
+
+    <class name="Department" table="DEPARTMENT">
+    	<id name="id" column="DEPT_ID" type="long">
+    		<generator class="native"/>
+    	</id>
+
+    	<property name="name" column="REG" type="string"/>
+
+	    <set name="salespersons" cascade="save-update" inverse="true">
+		    <key column="DEPT_ID"/>
+		    <one-to-many class="Salesperson"/>
+		    <filter name="seniorSalespersons"><![CDATA[`hire dt` < :asOfDate]]></filter>
+	    </set>
+
+	</class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Department.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Department.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Department.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Department.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,40 @@
+// $Id: Department.java 4448 2004-08-28 02:29:05Z steveebersole $
+package org.hibernate.test.filter;
+
+import java.util.Set;
+import java.util.HashSet;
+
+/**
+ * Implementation of Department.
+ *
+ * @author Steve
+ */
+public class Department {
+	private Long id;
+	private String name;
+	private Set salespersons = new HashSet();
+
+	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 Set getSalespersons() {
+		return salespersons;
+	}
+
+	public void setSalespersons(Set salespersons) {
+		this.salespersons = salespersons;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Department.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/DynamicFilterTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/DynamicFilterTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/DynamicFilterTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,925 @@
+// $Id: DynamicFilterTest.java 11398 2007-04-10 14:54:07Z steve.ebersole at jboss.com $
+package org.hibernate.test.filter;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import junit.framework.Test;
+
+import org.hibernate.Criteria;
+import org.hibernate.EntityMode;
+import org.hibernate.FetchMode;
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cache.CacheKey;
+import org.hibernate.cache.entry.CollectionCacheEntry;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.criterion.DetachedCriteria;
+import org.hibernate.criterion.Property;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.criterion.Subqueries;
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.impl.SessionFactoryImpl;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.persister.collection.CollectionPersister;
+import org.hibernate.transform.DistinctRootEntityResultTransformer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Implementation of DynamicFilterTest.
+ *
+ * @author Steve
+ */
+ at SuppressWarnings({ "WhileLoopReplaceableByForEach", "unchecked" })
+public class DynamicFilterTest extends FunctionalTestCase {
+
+	private Logger log = LoggerFactory.getLogger( DynamicFilterTest.class );
+
+	public DynamicFilterTest(String testName) {
+		super( testName );
+	}
+
+	public String[] getMappings() {
+		return new String[]{
+			"filter/defs.hbm.xml",
+			"filter/LineItem.hbm.xml",
+			"filter/Order.hbm.xml",
+			"filter/Product.hbm.xml",
+			"filter/Salesperson.hbm.xml",
+			"filter/Department.hbm.xml",
+			"filter/Category.hbm.xml"
+		};
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setProperty( Environment.MAX_FETCH_DEPTH, "1" );
+		cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
+		cfg.setProperty( Environment.USE_QUERY_CACHE, "true" );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( DynamicFilterTest.class );
+	}
+
+	public void testSqlSyntaxOfFiltersWithUnions() {
+		Session session = openSession();
+		session.enableFilter( "unioned" );
+		session.createQuery( "from Category" ).list();
+		session.close();
+	}
+
+	public void testSecondLevelCachedCollectionsFiltering() {
+		TestData testData = new TestData();
+		testData.prepare();
+
+		Session session = openSession();
+		long ts = ( ( SessionImplementor ) session ).getTimestamp();
+
+		// Force a collection into the second level cache, with its non-filtered elements
+		Salesperson sp = ( Salesperson ) session.load( Salesperson.class, testData.steveId );
+		Hibernate.initialize( sp.getOrders() );
+		CollectionPersister persister = ( ( SessionFactoryImpl ) getSessions() )
+		        .getCollectionPersister( Salesperson.class.getName() + ".orders" );
+		assertTrue( "No cache for collection", persister.hasCache() );
+		CollectionCacheEntry cachedData = ( CollectionCacheEntry ) persister.getCacheAccessStrategy()
+		        .get( new CacheKey( testData.steveId, persister.getKeyType(), persister.getRole(), EntityMode.POJO, sfi() ), ts );
+		assertNotNull( "collection was not in cache", cachedData );
+
+		session.close();
+
+		session = openSession();
+		ts = ( ( SessionImplementor ) session ).getTimestamp();
+		session.enableFilter( "fulfilledOrders" ).setParameter( "asOfDate", testData.lastMonth.getTime() );
+		sp = ( Salesperson ) session.createQuery( "from Salesperson as s where s.id = :id" )
+		        .setLong( "id", testData.steveId )
+		        .uniqueResult();
+		assertEquals( "Filtered-collection not bypassing 2L-cache", 1, sp.getOrders().size() );
+
+		CollectionCacheEntry cachedData2 = ( CollectionCacheEntry ) persister.getCacheAccessStrategy()
+		        .get( new CacheKey( testData.steveId, persister.getKeyType(), persister.getRole(), EntityMode.POJO, sfi() ), ts );
+		assertNotNull( "collection no longer in cache!", cachedData2 );
+		assertSame( "Different cache values!", cachedData, cachedData2 );
+
+		session.close();
+
+		session = openSession();
+		session.enableFilter( "fulfilledOrders" ).setParameter( "asOfDate", testData.lastMonth.getTime() );
+		sp = ( Salesperson ) session.load( Salesperson.class, testData.steveId );
+		assertEquals( "Filtered-collection not bypassing 2L-cache", 1, sp.getOrders().size() );
+
+		session.close();
+
+		// Finally, make sure that the original cached version did not get over-written
+		session = openSession();
+		sp = ( Salesperson ) session.load( Salesperson.class, testData.steveId );
+		assertEquals( "Actual cached version got over-written", 2, sp.getOrders().size() );
+
+		session.close();
+		testData.release();
+	}
+
+	public void testCombinedClassAndCollectionFiltersEnabled() {
+		TestData testData = new TestData();
+		testData.prepare();
+
+		Session session = openSession();
+		session.enableFilter( "regionlist" ).setParameterList( "regions", new String[]{"LA", "APAC"} );
+		session.enableFilter( "fulfilledOrders" ).setParameter( "asOfDate", testData.lastMonth.getTime() );
+
+		// test retreival through hql with the collection as non-eager
+		List salespersons = session.createQuery( "select s from Salesperson as s" ).list();
+		assertEquals( "Incorrect salesperson count", 1, salespersons.size() );
+		Salesperson sp = ( Salesperson ) salespersons.get( 0 );
+		assertEquals( "Incorrect order count", 1, sp.getOrders().size() );
+
+		session.clear();
+
+		session.disableFilter("regionlist");
+		session.enableFilter( "regionlist" ).setParameterList( "regions", new String[]{"LA", "APAC", "APAC"} );
+		// Second test retreival through hql with the collection as non-eager with different region list
+		salespersons = session.createQuery( "select s from Salesperson as s" ).list();
+		assertEquals( "Incorrect salesperson count", 1, salespersons.size() );
+		sp = ( Salesperson ) salespersons.get( 0 );
+		assertEquals( "Incorrect order count", 1, sp.getOrders().size() );
+
+		session.clear();
+
+
+		// test retreival through hql with the collection join fetched
+		salespersons = session.createQuery( "select s from Salesperson as s left join fetch s.orders" ).list();
+		assertEquals( "Incorrect salesperson count", 1, salespersons.size() );
+		sp = ( Salesperson ) salespersons.get( 0 );
+		assertEquals( "Incorrect order count", 1, sp.getOrders().size() );
+
+		session.close();
+		testData.release();
+	}
+
+	public void testHqlFilters() {
+		//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+		// HQL test
+		//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+		log.info( "Starting HQL filter tests" );
+		TestData testData = new TestData();
+		testData.prepare();
+
+		Session session = openSession();
+		session.enableFilter( "region" ).setParameter( "region", "APAC" );
+
+		session.enableFilter( "effectiveDate" )
+		        .setParameter( "asOfDate", testData.lastMonth.getTime() );
+
+		log.info( "HQL against Salesperson..." );
+		List results = session.createQuery( "select s from Salesperson as s left join fetch s.orders" ).list();
+		assertTrue( "Incorrect filtered HQL result count [" + results.size() + "]", results.size() == 1 );
+		Salesperson result = ( Salesperson ) results.get( 0 );
+		assertTrue( "Incorrect collectionfilter count", result.getOrders().size() == 1 );
+
+		log.info( "HQL against Product..." );
+		results = session.createQuery( "from Product as p where p.stockNumber = ?" ).setInteger( 0, 124 ).list();
+		assertTrue( results.size() == 1 );
+
+		session.close();
+		testData.release();
+	}
+	
+	public void testFiltersWithCustomerReadAndWrite() {
+		//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+		// Custom SQL read/write with filter
+		//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+		log.info( "Starting HQL filter with custom SQL get/set tests" );
+		TestData testData = new TestData();
+		testData.prepare();
+
+		Session session = openSession();
+		session.enableFilter( "heavyProducts" ).setParameter("weightKilograms", 4d);
+		log.info( "HQL against Product..." );
+		List results = session.createQuery( "from Product").list();
+		assertEquals( 1, results.size() );
+
+		session.close();
+		testData.release();
+	}
+
+	public void testCriteriaQueryFilters() {
+		//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+		// Criteria-query test
+		//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+		log.info( "Starting Criteria-query filter tests" );
+		TestData testData = new TestData();
+		testData.prepare();
+
+		Session session = openSession();
+		session.enableFilter( "region" ).setParameter( "region", "APAC" );
+
+		session.enableFilter( "fulfilledOrders" )
+		        .setParameter( "asOfDate", testData.lastMonth.getTime() );
+
+		session.enableFilter( "effectiveDate" )
+		        .setParameter( "asOfDate", testData.lastMonth.getTime() );
+
+		log.info( "Criteria query against Salesperson..." );
+		List salespersons = session.createCriteria( Salesperson.class )
+		        .setFetchMode( "orders", FetchMode.JOIN )
+		        .list();
+		assertEquals( "Incorrect salesperson count", 1, salespersons.size() );
+		assertEquals( "Incorrect order count", 1, ( ( Salesperson ) salespersons.get( 0 ) ).getOrders().size() );
+
+		log.info( "Criteria query against Product..." );
+		List products = session.createCriteria( Product.class )
+		        .add( Restrictions.eq( "stockNumber", 124 ) )
+		        .list();
+		assertEquals( "Incorrect product count", 1, products.size() );
+
+		session.close();
+		testData.release();
+	}
+
+	public void testCriteriaControl() {
+		TestData testData = new TestData();
+		testData.prepare();
+
+		// the subquery...
+		DetachedCriteria subquery = DetachedCriteria.forClass( Salesperson.class )
+				.setProjection( Property.forName( "name" ) );
+
+		Session session = openSession();
+		session.beginTransaction();
+		session.enableFilter( "fulfilledOrders" ).setParameter( "asOfDate", testData.lastMonth.getTime() );
+		session.enableFilter( "regionlist" ).setParameterList( "regions", new String[] { "APAC" } );
+
+		List result = session.createCriteria( Order.class )
+				.add( Subqueries.in( "steve", subquery ) )
+				.list();
+		assertEquals( 1, result.size() );
+
+		session.getTransaction().commit();
+		session.close();
+
+		testData.release();
+	}
+
+	public void testCriteriaSubqueryWithFilters() {
+		//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+		// Criteria-subquery test
+		//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+		log.info("Starting Criteria-subquery filter tests");
+		TestData testData = new TestData();
+		testData.prepare();
+
+		Session session = openSession();
+		session.enableFilter("region").setParameter("region", "APAC");
+
+		log.info("Criteria query against Department with a subquery on Salesperson in the APAC reqion...");
+		DetachedCriteria salespersonSubquery = DetachedCriteria.forClass(Salesperson.class)
+				.add(Restrictions.eq("name", "steve"))
+				.setProjection(Property.forName("department"));
+
+		Criteria departmentsQuery = session.createCriteria(Department.class).add(Subqueries.propertyIn("id", salespersonSubquery));
+		List departments = departmentsQuery.list();
+
+		assertEquals("Incorrect department count", 1, departments.size());
+
+		log.info("Criteria query against Department with a subquery on Salesperson in the FooBar reqion...");
+
+		session.enableFilter("region").setParameter("region", "Foobar");
+		departments = departmentsQuery.list();
+
+		assertEquals("Incorrect department count", 0, departments.size());
+
+		log.info("Criteria query against Order with a subquery for line items with a subquery on product and sold by a given sales person...");
+		session.enableFilter("region").setParameter("region", "APAC");
+
+		DetachedCriteria lineItemSubquery = DetachedCriteria.forClass(LineItem.class)
+				.add( Restrictions.ge( "quantity", 1L ) )
+				.createCriteria( "product" )
+				.add( Restrictions.eq( "name", "Acme Hair Gel" ) )
+				.setProjection( Property.forName( "id" ) );
+
+		List orders = session.createCriteria(Order.class)
+				.add(Subqueries.exists(lineItemSubquery))
+				.add(Restrictions.eq("buyer", "gavin"))
+				.list();
+
+		assertEquals("Incorrect orders count", 1, orders.size());
+
+		log.info("query against Order with a subquery for line items with a subquery line items where the product name is Acme Hair Gel and the quantity is greater than 1 in a given region and the product is effective as of last month");
+		session.enableFilter("region").setParameter("region", "APAC");
+		session.enableFilter("effectiveDate").setParameter("asOfDate", testData.lastMonth.getTime());
+
+		DetachedCriteria productSubquery = DetachedCriteria.forClass(Product.class)
+				.add(Restrictions.eq("name", "Acme Hair Gel"))
+				.setProjection(Property.forName("id"));
+
+		lineItemSubquery = DetachedCriteria.forClass(LineItem.class)
+				.add(Restrictions.ge("quantity", 1L ))
+				.createCriteria("product")
+				.add(Subqueries.propertyIn("id", productSubquery))
+				.setProjection(Property.forName("id"));
+
+		orders = session.createCriteria(Order.class)
+				.add(Subqueries.exists(lineItemSubquery))
+				.add(Restrictions.eq("buyer", "gavin"))
+				.list();
+
+		assertEquals("Incorrect orders count", 1, orders.size());
+
+
+		log.info("query against Order with a subquery for line items with a subquery line items where the product name is Acme Hair Gel and the quantity is greater than 1 in a given region and the product is effective as of 4 months ago");
+		session.enableFilter("region").setParameter("region", "APAC");
+		session.enableFilter("effectiveDate").setParameter("asOfDate", testData.fourMonthsAgo.getTime());
+
+		orders = session.createCriteria(Order.class)
+				.add(Subqueries.exists(lineItemSubquery))
+				.add(Restrictions.eq("buyer", "gavin"))
+				.list();
+
+		assertEquals("Incorrect orders count", 0, orders.size());
+
+		session.close();
+		testData.release();
+	}
+
+	public void testHQLSubqueryWithFilters() {
+		//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+		// HQL subquery with filters test
+		//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+		log.info("Starting HQL subquery with filters tests");
+		TestData testData = new TestData();
+		testData.prepare();
+
+		Session session = openSession();
+		session.enableFilter("region").setParameter("region", "APAC");
+
+		log.info("query against Department with a subquery on Salesperson in the APAC reqion...");
+
+		List departments = session.createQuery("select d from Department as d where d.id in (select s.department from Salesperson s where s.name = ?)").setString(0, "steve").list();
+
+		assertEquals("Incorrect department count", 1, departments.size());
+
+		log.info("query against Department with a subquery on Salesperson in the FooBar reqion...");
+
+		session.enableFilter("region").setParameter("region", "Foobar");
+		departments = session.createQuery("select d from Department as d where d.id in (select s.department from Salesperson s where s.name = ?)").setString(0, "steve").list();
+
+		assertEquals("Incorrect department count", 0, departments.size());
+
+		log.info("query against Order with a subquery for line items with a subquery line items where the product name is Acme Hair Gel and the quantity is greater than 1 in a given region for a given buyer");
+		session.enableFilter("region").setParameter("region", "APAC");
+
+		List orders = session.createQuery("select o from Order as o where exists (select li.id from LineItem li, Product as p where p.id = li.product and li.quantity >= ? and p.name = ?) and o.buyer = ?")
+				.setLong(0, 1L).setString(1, "Acme Hair Gel").setString(2, "gavin").list();
+
+		assertEquals("Incorrect orders count", 1, orders.size());
+
+		log.info("query against Order with a subquery for line items with a subquery line items where the product name is Acme Hair Gel and the quantity is greater than 1 in a given region and the product is effective as of last month");
+
+		session.enableFilter("region").setParameter("region", "APAC");
+		session.enableFilter("effectiveDate").setParameter("asOfDate", testData.lastMonth.getTime());
+
+		orders = session.createQuery("select o from Order as o where exists (select li.id from LineItem li where li.quantity >= ? and li.product in (select p.id from Product p where p.name = ?)) and o.buyer = ?")
+				.setLong(0, 1L).setString(1, "Acme Hair Gel").setString(2, "gavin").list();
+
+		assertEquals("Incorrect orders count", 1, orders.size());
+
+
+		log.info("query against Order with a subquery for line items with a subquery line items where the product name is Acme Hair Gel and the quantity is greater than 1 in a given region and the product is effective as of 4 months ago");
+
+		session.enableFilter("region").setParameter("region", "APAC");
+		session.enableFilter("effectiveDate").setParameter("asOfDate", testData.fourMonthsAgo.getTime());
+
+		orders = session.createQuery("select o from Order as o where exists (select li.id from LineItem li where li.quantity >= ? and li.product in (select p.id from Product p where p.name = ?)) and o.buyer = ?")
+				.setLong(0, 1L).setString(1, "Acme Hair Gel").setString(2, "gavin").list();
+
+		assertEquals("Incorrect orders count", 0, orders.size());
+
+		log.info("query against Order with a subquery for line items with a subquery line items where the product name is Acme Hair Gel and the quantity is greater than 1 in a given region and the product is effective as of last month with named types");
+
+		session.enableFilter("region").setParameter("region", "APAC");
+		session.enableFilter("effectiveDate").setParameter("asOfDate", testData.lastMonth.getTime());
+
+		orders = session.createQuery("select o from Order as o where exists (select li.id from LineItem li where li.quantity >= :quantity and li.product in (select p.id from Product p where p.name = :name)) and o.buyer = :buyer")
+				.setLong("quantity", 1L).setString("name", "Acme Hair Gel").setString("buyer", "gavin").list();
+
+		assertEquals("Incorrect orders count", 1, orders.size());
+
+		log.info("query against Order with a subquery for line items with a subquery line items where the product name is Acme Hair Gel and the quantity is greater than 1 in a given region and the product is effective as of last month with mixed types");
+
+		session.enableFilter("region").setParameter("region", "APAC");
+		session.enableFilter("effectiveDate").setParameter("asOfDate", testData.lastMonth.getTime());
+
+		orders = session.createQuery("select o from Order as o where exists (select li.id from LineItem li where li.quantity >= ? and li.product in (select p.id from Product p where p.name = ?)) and o.buyer = :buyer")
+				.setLong(0, 1L).setString(1, "Acme Hair Gel").setString("buyer", "gavin").list();
+
+		assertEquals("Incorrect orders count", 1, orders.size());
+
+		session.close();
+		testData.release();
+	}
+
+	public void testFilterApplicationOnHqlQueryWithImplicitSubqueryContainingPositionalParameter() {
+		TestData testData = new TestData();
+		testData.prepare();
+
+		Session session = openSession();
+		session.beginTransaction();
+
+		final String queryString = "from Order o where ? in ( select sp.name from Salesperson sp )";
+
+		// first a control-group query
+		List result = session.createQuery( queryString ).setParameter( 0, "steve" ).list();
+		assertEquals( 2, result.size() );
+
+		// now lets enable filters on Order...
+		session.enableFilter( "fulfilledOrders" ).setParameter( "asOfDate", testData.lastMonth.getTime() );
+		result = session.createQuery( queryString ).setParameter( 0, "steve" ).list();
+		assertEquals( 1, result.size() );
+
+		// now, lets additionally enable filter on Salesperson.  First a valid one...
+		session.enableFilter( "regionlist" ).setParameterList( "regions", new String[] { "APAC" } );
+		result = session.createQuery( queryString ).setParameter( 0, "steve" ).list();
+		assertEquals( 1, result.size() );
+
+		// ... then a silly one...
+		session.enableFilter( "regionlist" ).setParameterList( "regions", new String[] { "gamma quadrant" } );
+		result = session.createQuery( queryString ).setParameter( 0, "steve" ).list();
+		assertEquals( 0, result.size() );
+
+		session.getTransaction().commit();
+		session.close();
+
+		testData.release();
+	}
+
+	public void testFilterApplicationOnHqlQueryWithImplicitSubqueryContainingNamedParameter() {
+		TestData testData = new TestData();
+		testData.prepare();
+
+		Session session = openSession();
+		session.beginTransaction();
+
+		final String queryString = "from Order o where :salesPersonName in ( select sp.name from Salesperson sp )";
+
+		// first a control-group query
+		List result = session.createQuery( queryString ).setParameter( "salesPersonName", "steve" ).list();
+		assertEquals( 2, result.size() );
+
+		// now lets enable filters on Order...
+		session.enableFilter( "fulfilledOrders" ).setParameter( "asOfDate", testData.lastMonth.getTime() );
+		result = session.createQuery( queryString ).setParameter( "salesPersonName", "steve" ).list();
+		assertEquals( 1, result.size() );
+
+		// now, lets additionally enable filter on Salesperson.  First a valid one...
+		session.enableFilter( "regionlist" ).setParameterList( "regions", new String[] { "APAC" } );
+		result = session.createQuery( queryString ).setParameter( "salesPersonName", "steve" ).list();
+		assertEquals( 1, result.size() );
+
+		// ... then a silly one...
+		session.enableFilter( "regionlist" ).setParameterList( "regions", new String[] { "gamma quadrant" } );
+		result = session.createQuery( queryString ).setParameter( "salesPersonName", "steve" ).list();
+		assertEquals( 0, result.size() );
+
+		session.getTransaction().commit();
+		session.close();
+
+		testData.release();
+	}
+
+	public void testFiltersOnSimpleHqlDelete() {
+		Session session = openSession();
+		session.beginTransaction();
+		Salesperson sp = new Salesperson();
+		sp.setName( "steve" );
+		sp.setRegion( "NA" );
+		session.persist( sp );
+		Salesperson sp2 = new Salesperson();
+		sp2.setName( "john" );
+		sp2.setRegion( "APAC" );
+		session.persist( sp2 );
+		session.getTransaction().commit();
+		session.close();
+
+		session = openSession();
+		session.beginTransaction();
+		session.enableFilter( "region" ).setParameter( "region", "NA" );
+		int count = session.createQuery( "delete from Salesperson" ).executeUpdate();
+		assertEquals( 1, count );
+		session.delete( sp2 );
+		session.getTransaction().commit();
+		session.close();
+	}
+
+	public void testFiltersOnMultiTableHqlDelete() {
+		Session session = openSession();
+		session.beginTransaction();
+		Salesperson sp = new Salesperson();
+		sp.setName( "steve" );
+		sp.setRegion( "NA" );
+		session.persist( sp );
+		Salesperson sp2 = new Salesperson();
+		sp2.setName( "john" );
+		sp2.setRegion( "APAC" );
+		session.persist( sp2 );
+		session.getTransaction().commit();
+		session.close();
+
+		session = openSession();
+		session.beginTransaction();
+		session.enableFilter( "region" ).setParameter( "region", "NA" );
+		int count = session.createQuery( "delete from Salesperson" ).executeUpdate();
+		assertEquals( 1, count );
+		session.delete( sp2 );
+		session.getTransaction().commit();
+		session.close();
+	}
+
+
+	public void testGetFilters() {
+		//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+		// Get() test
+		//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+		log.info( "Starting get() filter tests (eager assoc. fetching)." );
+		TestData testData = new TestData();
+		testData.prepare();
+
+		Session session = openSession();
+		session.enableFilter( "region" ).setParameter( "region", "APAC" );
+
+		log.info( "Performing get()..." );
+		Salesperson salesperson = ( Salesperson ) session.get( Salesperson.class, testData.steveId );
+		assertNotNull( salesperson );
+		assertEquals( "Incorrect order count", 1, salesperson.getOrders().size() );
+
+		session.close();
+		testData.release();
+	}
+
+	public void testOneToManyFilters() {
+		//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+		// one-to-many loading tests
+		//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+		log.info( "Starting one-to-many collection loader filter tests." );
+		TestData testData = new TestData();
+		testData.prepare();
+
+		Session session = openSession();
+		session.enableFilter( "seniorSalespersons" )
+		        .setParameter( "asOfDate", testData.lastMonth.getTime() );
+
+		log.info( "Performing load of Department..." );
+		Department department = ( Department ) session.load( Department.class, testData.deptId );
+		Set salespersons = department.getSalespersons();
+		assertEquals( "Incorrect salesperson count", 1, salespersons.size() );
+
+		session.close();
+		testData.release();
+	}
+
+	public void testInStyleFilterParameter() {
+		//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+		// one-to-many loading tests
+		//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+		log.info( "Starting one-to-many collection loader filter tests." );
+		TestData testData = new TestData();
+		testData.prepare();
+
+		Session session = openSession();
+		session.enableFilter( "regionlist" )
+		        .setParameterList( "regions", new String[]{"LA", "APAC"} );
+
+		log.debug( "Performing query of Salespersons" );
+		List salespersons = session.createQuery( "from Salesperson" ).list();
+		assertEquals( "Incorrect salesperson count", 1, salespersons.size() );
+
+		session.close();
+		testData.release();
+	}
+
+	public void testManyToManyFilterOnCriteria() {
+		TestData testData = new TestData();
+		testData.prepare();
+
+		Session session = openSession();
+		session.enableFilter( "effectiveDate" ).setParameter( "asOfDate", new Date() );
+
+		Product prod = ( Product ) session.createCriteria( Product.class )
+		        .setResultTransformer( DistinctRootEntityResultTransformer.INSTANCE )
+		        .add( Restrictions.eq( "id", testData.prod1Id ) )
+		        .uniqueResult();
+
+		assertNotNull( prod );
+		assertEquals( "Incorrect Product.categories count for filter", 1, prod.getCategories().size() );
+
+		session.close();
+		testData.release();
+	}
+
+	public void testManyToManyFilterOnLoad() {
+		TestData testData = new TestData();
+		testData.prepare();
+
+		Session session = openSession();
+		session.enableFilter( "effectiveDate" ).setParameter( "asOfDate", new Date() );
+
+		Product prod = ( Product ) session.get( Product.class, testData.prod1Id );
+
+		long initLoadCount = getSessions().getStatistics().getCollectionLoadCount();
+		long initFetchCount = getSessions().getStatistics().getCollectionFetchCount();
+
+		// should already have been initialized...
+		int size = prod.getCategories().size();
+		assertEquals( "Incorrect filtered collection count", 1, size );
+
+		long currLoadCount = getSessions().getStatistics().getCollectionLoadCount();
+		long currFetchCount = getSessions().getStatistics().getCollectionFetchCount();
+
+		assertTrue(
+		        "load with join fetch of many-to-many did not trigger join fetch",
+		        ( initLoadCount == currLoadCount ) && ( initFetchCount == currFetchCount )
+		);
+
+		// make sure we did not get back a collection of proxies
+		long initEntityLoadCount = getSessions().getStatistics().getEntityLoadCount();
+		Iterator itr = prod.getCategories().iterator();
+		while ( itr.hasNext() ) {
+			Category cat = ( Category ) itr.next();
+			System.out.println( " ===> " + cat.getName() );
+		}
+		long currEntityLoadCount = getSessions().getStatistics().getEntityLoadCount();
+
+		assertTrue(
+		        "load with join fetch of many-to-many did not trigger *complete* join fetch",
+		        ( initEntityLoadCount == currEntityLoadCount )
+		);
+
+		session.close();
+		testData.release();
+	}
+
+	public void testManyToManyOnCollectionLoadAfterHQL() {
+		TestData testData = new TestData();
+		testData.prepare();
+
+		Session session = openSession();
+		session.enableFilter( "effectiveDate" ).setParameter( "asOfDate", new Date() );
+
+		// Force the categories to not get initialized here
+		List result = session.createQuery( "from Product as p where p.id = :id" )
+		        .setLong( "id", testData.prod1Id )
+		        .list();
+		assertTrue( "No products returned from HQL", !result.isEmpty() );
+
+		Product prod = ( Product ) result.get( 0 );
+		assertNotNull( prod );
+		assertEquals( "Incorrect Product.categories count for filter on collection load", 1, prod.getCategories().size() );
+
+		session.close();
+		testData.release();
+	}
+
+	public void testManyToManyFilterOnQuery() {
+		TestData testData = new TestData();
+		testData.prepare();
+
+		Session session = openSession();
+		session.enableFilter( "effectiveDate" ).setParameter( "asOfDate", new Date() );
+
+		List result = session.createQuery( "from Product p inner join fetch p.categories" ).list();
+		assertTrue( "No products returned from HQL many-to-many filter case", !result.isEmpty() );
+
+		Product prod = ( Product ) result.get( 0 );
+
+		assertNotNull( prod );
+		assertEquals( "Incorrect Product.categories count for filter with HQL", 1, prod.getCategories().size() );
+
+		session.close();
+		testData.release();
+	}
+
+	public void testManyToManyBase() {
+		TestData testData = new TestData();
+		testData.prepare();
+
+		Session session = openSession();
+
+		Product prod = ( Product ) session.get( Product.class, testData.prod1Id );
+
+		long initLoadCount = getSessions().getStatistics().getCollectionLoadCount();
+		long initFetchCount = getSessions().getStatistics().getCollectionFetchCount();
+
+		// should already have been initialized...
+		int size = prod.getCategories().size();
+		assertEquals( "Incorrect non-filtered collection count", 2, size );
+
+		long currLoadCount = getSessions().getStatistics().getCollectionLoadCount();
+		long currFetchCount = getSessions().getStatistics().getCollectionFetchCount();
+
+		assertTrue(
+		        "load with join fetch of many-to-many did not trigger join fetch",
+		        ( initLoadCount == currLoadCount ) && ( initFetchCount == currFetchCount )
+		);
+
+		// make sure we did not get back a collection of proxies
+		long initEntityLoadCount = getSessions().getStatistics().getEntityLoadCount();
+		Iterator itr = prod.getCategories().iterator();
+		while ( itr.hasNext() ) {
+			Category cat = ( Category ) itr.next();
+			System.out.println( " ===> " + cat.getName() );
+		}
+		long currEntityLoadCount = getSessions().getStatistics().getEntityLoadCount();
+
+		assertTrue(
+		        "load with join fetch of many-to-many did not trigger *complete* join fetch",
+		        ( initEntityLoadCount == currEntityLoadCount )
+		);
+
+		session.close();
+		testData.release();
+	}
+
+	public void testManyToManyBaseThruCriteria() {
+		TestData testData = new TestData();
+		testData.prepare();
+
+		Session session = openSession();
+
+		List result = session.createCriteria( Product.class )
+		        .add( Restrictions.eq( "id", testData.prod1Id ) )
+		        .list();
+
+		Product prod = ( Product ) result.get( 0 );
+
+		long initLoadCount = getSessions().getStatistics().getCollectionLoadCount();
+		long initFetchCount = getSessions().getStatistics().getCollectionFetchCount();
+
+		// should already have been initialized...
+		int size = prod.getCategories().size();
+		assertEquals( "Incorrect non-filtered collection count", 2, size );
+
+		long currLoadCount = getSessions().getStatistics().getCollectionLoadCount();
+		long currFetchCount = getSessions().getStatistics().getCollectionFetchCount();
+
+		assertTrue(
+		        "load with join fetch of many-to-many did not trigger join fetch",
+		        ( initLoadCount == currLoadCount ) && ( initFetchCount == currFetchCount )
+		);
+
+		// make sure we did not get back a collection of proxies
+		long initEntityLoadCount = getSessions().getStatistics().getEntityLoadCount();
+		Iterator itr = prod.getCategories().iterator();
+		while ( itr.hasNext() ) {
+			Category cat = ( Category ) itr.next();
+			System.out.println( " ===> " + cat.getName() );
+		}
+		long currEntityLoadCount = getSessions().getStatistics().getEntityLoadCount();
+
+		assertTrue(
+		        "load with join fetch of many-to-many did not trigger *complete* join fetch",
+		        ( initEntityLoadCount == currEntityLoadCount )
+		);
+
+		session.close();
+		testData.release();
+	}
+
+	private class TestData {
+		private Long steveId;
+		private Long deptId;
+		private Long prod1Id;
+		private Calendar lastMonth;
+		private Calendar nextMonth;
+		private Calendar sixMonthsAgo;
+		private Calendar fourMonthsAgo;
+
+		private List entitiesToCleanUp = new ArrayList();
+
+		private void prepare() {
+			Session session = openSession();
+			Transaction transaction = session.beginTransaction();
+
+			lastMonth = new GregorianCalendar();
+			lastMonth.add( Calendar.MONTH, -1 );
+
+			nextMonth = new GregorianCalendar();
+			nextMonth.add( Calendar.MONTH, 1 );
+
+			sixMonthsAgo = new GregorianCalendar();
+			sixMonthsAgo.add( Calendar.MONTH, -6 );
+
+			fourMonthsAgo = new GregorianCalendar();
+			fourMonthsAgo.add( Calendar.MONTH, -4 );
+
+			Department dept = new Department();
+			dept.setName( "Sales" );
+
+			session.save( dept );
+			deptId = dept.getId();
+			entitiesToCleanUp.add( dept );
+
+			Salesperson steve = new Salesperson();
+			steve.setName( "steve" );
+			steve.setRegion( "APAC" );
+			steve.setHireDate( sixMonthsAgo.getTime() );
+
+			steve.setDepartment( dept );
+			dept.getSalespersons().add( steve );
+
+			Salesperson max = new Salesperson();
+			max.setName( "max" );
+			max.setRegion( "EMEA" );
+			max.setHireDate( nextMonth.getTime() );
+
+			max.setDepartment( dept );
+			dept.getSalespersons().add( max );
+
+			session.save( steve );
+			session.save( max );
+			entitiesToCleanUp.add( steve );
+			entitiesToCleanUp.add( max );
+
+			steveId = steve.getId();
+
+			Category cat1 = new Category( "test cat 1", lastMonth.getTime(), nextMonth.getTime() );
+			Category cat2 = new Category( "test cat 2", sixMonthsAgo.getTime(), fourMonthsAgo.getTime() );
+
+			Product product1 = new Product();
+			product1.setName( "Acme Hair Gel" );
+			product1.setStockNumber( 123 );
+			product1.setWeightPounds( 0.25 );
+			product1.setEffectiveStartDate( lastMonth.getTime() );
+			product1.setEffectiveEndDate( nextMonth.getTime() );
+
+			product1.addCategory( cat1 );
+			product1.addCategory( cat2 );
+
+			session.save( product1 );
+			entitiesToCleanUp.add( product1 );
+			prod1Id = product1.getId();
+
+			Order order1 = new Order();
+			order1.setBuyer( "gavin" );
+			order1.setRegion( "APAC" );
+			order1.setPlacementDate( sixMonthsAgo.getTime() );
+			order1.setFulfillmentDate( fourMonthsAgo.getTime() );
+			order1.setSalesperson( steve );
+			order1.addLineItem( product1, 500 );
+
+			session.save( order1 );
+			entitiesToCleanUp.add( order1 );
+
+			Product product2 = new Product();
+			product2.setName( "Acme Super-Duper DTO Factory" );
+			product2.setStockNumber( 124 );
+			product1.setWeightPounds( 10.0 );
+			product2.setEffectiveStartDate( sixMonthsAgo.getTime() );
+			product2.setEffectiveEndDate( new Date() );
+
+			Category cat3 = new Category( "test cat 2", sixMonthsAgo.getTime(), new Date() );
+			product2.addCategory( cat3 );
+
+			session.save( product2 );
+			entitiesToCleanUp.add( product2 );
+
+			// An uncategorized product
+			Product product3 = new Product();
+			product3.setName( "Uncategorized product" );
+			session.save( product3 );
+			entitiesToCleanUp.add( product3 );
+
+			Order order2 = new Order();
+			order2.setBuyer( "christian" );
+			order2.setRegion( "EMEA" );
+			order2.setPlacementDate( lastMonth.getTime() );
+			order2.setSalesperson( steve );
+			order2.addLineItem( product2, -1 );
+
+			session.save( order2 );
+			entitiesToCleanUp.add( order2 );
+
+			transaction.commit();
+			session.close();
+		}
+
+		private void release() {
+			Session session = openSession();
+			Transaction transaction = session.beginTransaction();
+
+			Iterator itr = entitiesToCleanUp.iterator();
+			while ( itr.hasNext() ) {
+				session.delete( itr.next() );
+			}
+
+			transaction.commit();
+			session.close();
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/DynamicFilterTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/LineItem.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/LineItem.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/LineItem.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping
+        SYSTEM
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<hibernate-mapping package="org.hibernate.test.filter">
+
+    <class name="LineItem" table="ORDER_ITEM">
+    	<id name="id" column="ITEM_ID" >
+    		<generator class="native"/>
+    	</id>
+
+	    <many-to-one name="order" class="Order" column="ORDER_ID" cascade="none"/>
+	    <property name="sequence" column="SEQ" type="int"/>
+	    <many-to-one name="product" class="Product" column="PRODUCT_ID" cascade="none"/>
+	    <property name="quantity" column="AMT" type="long"/>
+	</class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/LineItem.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/LineItem.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/LineItem.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/LineItem.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,67 @@
+// $Id: LineItem.java 4046 2004-07-20 04:07:40Z steveebersole $
+package org.hibernate.test.filter;
+
+/**
+ * Implementation of LineItem.
+ * 
+ * @author Steve
+ */
+public class LineItem {
+	private Long id;
+	private Order order;
+	private int sequence;
+	private Product product;
+	private long quantity;
+
+	/*package*/ LineItem() {}
+
+	public static LineItem generate(Order order, int sequence, Product product, long quantity) {
+		LineItem item = new LineItem();
+		item.order = order;
+		item.sequence = sequence;
+		item.product = product;
+		item.quantity = quantity;
+		item.order.getLineItems().add(sequence, item);
+		return item;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Order getOrder() {
+		return order;
+	}
+
+	public void setOrder(Order order) {
+		this.order = order;
+	}
+
+	public int getSequence() {
+		return sequence;
+	}
+
+	public void setSequence(int sequence) {
+		this.sequence = sequence;
+	}
+
+	public Product getProduct() {
+		return product;
+	}
+
+	public void setProduct(Product product) {
+		this.product = product;
+	}
+
+	public long getQuantity() {
+		return quantity;
+	}
+
+	public void setQuantity(long quantity) {
+		this.quantity = quantity;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/LineItem.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Order.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Order.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Order.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping
+        SYSTEM
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<hibernate-mapping package="org.hibernate.test.filter">
+
+    <class name="Order" table="T_ORDER">
+    	<id name="id" column="ORDER_ID" type="long">
+    		<generator class="native"/>
+    	</id>
+
+    	<property name="region" column="REG" type="string"/>
+	    <property name="buyer" column="BUYER" type="string"/>
+    	<property name="placementDate" column="`ord dt`" type="java.util.Date"/>
+    	<property name="fulfillmentDate" column="`close dt`" type="java.util.Date"/>
+
+	    <many-to-one name="salesperson" class="Salesperson" column="SALES_PERSON_ID"/>
+
+	    <list cascade="all-delete-orphan" inverse="true" name="lineItems">
+		    <key column="ORDER_ID"/>
+		    <index column="SEQ"/>
+		    <one-to-many class="LineItem"/>
+	    </list>
+
+	    <filter name="region" condition="REG = :region"/>
+	    <filter name="fulfilledOrders"><![CDATA[`close dt` < :asOfDate]]></filter>
+
+	</class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Order.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Order.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Order.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Order.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,87 @@
+// $Id: Order.java 4222 2004-08-10 05:19:46Z steveebersole $
+package org.hibernate.test.filter;
+
+import java.util.Date;
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * @author Steve Ebersole
+ */
+public class Order {
+	private Long id;
+	private String region;
+	private Date placementDate;
+	private Date fulfillmentDate;
+	private Salesperson salesperson;
+	private String buyer;
+	private List lineItems = new ArrayList();
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getRegion() {
+		return region;
+	}
+
+	public void setRegion(String region) {
+		this.region = region;
+	}
+
+	public Date getPlacementDate() {
+		return placementDate;
+	}
+
+	public void setPlacementDate(Date placementDate) {
+		this.placementDate = placementDate;
+	}
+
+	public Date getFulfillmentDate() {
+		return fulfillmentDate;
+	}
+
+	public void setFulfillmentDate(Date fulfillmentDate) {
+		this.fulfillmentDate = fulfillmentDate;
+	}
+
+	public Salesperson getSalesperson() {
+		return salesperson;
+	}
+
+	public void setSalesperson(Salesperson salesperson) {
+		this.salesperson = salesperson;
+	}
+
+	public String getBuyer() {
+		return buyer;
+	}
+
+	public void setBuyer(String buyer) {
+		this.buyer = buyer;
+	}
+
+	public List getLineItems() {
+		return lineItems;
+	}
+
+	protected void setLineItems(List lineItems) {
+		this.lineItems = lineItems;
+	}
+
+	public LineItem addLineItem(Product product, long quantity) {
+		return LineItem.generate(this, getLineItems().size(), product, quantity);
+	}
+
+	public void removeLineItem(LineItem item) {
+		removeLineItem( item.getSequence() );
+	}
+
+	public void removeLineItem(int sequence) {
+		getLineItems().remove(sequence);
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Order.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Product.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Product.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Product.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,43 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping
+        SYSTEM
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<hibernate-mapping package="org.hibernate.test.filter">
+
+    <class name="Product" table="PRODUCT">
+    	<id name="id" column="PROD_ID" >
+    		<generator class="native"/>
+    	</id>
+
+    	<property name="name" type="string"/>
+	    <property name="stockNumber" column="STOCK_NUM" type="int"/>
+	    <property name="weightPounds">
+	    	<column name="weight_kg" 
+	    		not-null="true" 
+	    		write="0.453 * ?" 
+	    		read="weight_kg / 0.453"/>
+	    </property>
+
+	    <property name="effectiveStartDate" column="eff_start_dt" type="java.util.Date"/>
+	    <property name="effectiveEndDate" column="eff_end_dt" type="java.util.Date"/>
+
+	    <set cascade="none" inverse="true" name="orderLineItems">
+		    <key column="PROD_ID"/>
+		    <one-to-many class="LineItem"/>
+	    </set>
+
+	    <set cascade="all" inverse="false" name="categories" fetch="join" table="PROD_CAT" >
+		    <key column="PROD_ID"/>
+		    <many-to-many class="Category" column="CAT_ID" fetch="join" >
+	            <filter name="effectiveDate" condition=":asOfDate BETWEEN eff_start_dt and eff_end_dt"/>
+			    <filter name="cat" condition="CAT_ID = :catId"/> 
+            </many-to-many>
+	    </set>
+
+	    <filter name="effectiveDate" condition=":asOfDate BETWEEN eff_start_dt and eff_end_dt"/>
+	    <filter name="heavyProducts" condition=":weightKilograms &lt; weight_kg"/>
+
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Product.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Product.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Product.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Product.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,108 @@
+// $Id: Product.java 6507 2005-04-25 16:57:32Z steveebersole $
+package org.hibernate.test.filter;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author Steve Ebersole
+ */
+public class Product {
+	private Long id;
+	private String name;
+	private int stockNumber;  // int for ease of hashCode() impl
+	private Date effectiveStartDate;
+	private Date effectiveEndDate;
+	private double weightPounds;
+	private Set orderLineItems;
+	private Set categories;
+
+	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 Set getOrderLineItems() {
+		return orderLineItems;
+	}
+
+	public void setOrderLineItems(Set orderLineItems) {
+		this.orderLineItems = orderLineItems;
+	}
+
+	public int getStockNumber() {
+		return stockNumber;
+	}
+
+	public void setStockNumber(int stockNumber) {
+		this.stockNumber = stockNumber;
+	}
+
+	public int hashCode() {
+		return stockNumber;
+	}
+
+	public boolean equals(Object obj) {
+		return ( (Product) obj ).stockNumber == this.stockNumber;
+	}
+
+	public Date getEffectiveStartDate() {
+		return effectiveStartDate;
+	}
+
+	public void setEffectiveStartDate(Date effectiveStartDate) {
+		this.effectiveStartDate = effectiveStartDate;
+	}
+
+	public Date getEffectiveEndDate() {
+		return effectiveEndDate;
+	}
+
+	public void setEffectiveEndDate(Date effectiveEndDate) {
+		this.effectiveEndDate = effectiveEndDate;
+	}
+
+	public double getWeightPounds() {
+		return weightPounds;
+	}
+
+	public void setWeightPounds(double weightPounds) {
+		this.weightPounds = weightPounds;
+	}
+	
+	public Set getCategories() {
+		return categories;
+	}
+
+	public void setCategories(Set categories) {
+		this.categories = categories;
+	}
+
+	public void addCategory(Category category) {
+		if ( category == null ) {
+			return;
+		}
+
+		if ( categories == null ) {
+			categories = new HashSet();
+		}
+
+		categories.add( category );
+		if ( category.getProducts() == null ) {
+			category.setProducts( new HashSet() );
+		}
+		category.getProducts().add( this );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Product.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Salesperson.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Salesperson.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Salesperson.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping
+        SYSTEM
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<hibernate-mapping package="org.hibernate.test.filter">
+
+    <class name="Salesperson" table="SALES_PERSON">
+    	<id name="id" column="SALES_PERSON_ID" >
+    		<generator class="native"/>
+    	</id>
+
+	    <property name="name" column="NAME" type="string"/>
+    	<property name="region" column="REG" type="string"/>
+
+	    <many-to-one name="department" cascade="none" class="Department" column="DEPT_ID"/>
+
+	    <property name="hireDate" column="`hire dt`" type="java.util.Date"/>
+
+	    <set name="orders" cascade="none" inverse="true" fetch="join">
+		    <key column="SALES_PERSON_ID"/>
+		    <one-to-many class="Order"/>
+		    <filter name="region" condition="REG = :region"/>
+	        <filter name="fulfilledOrders"><![CDATA[`close dt` < :asOfDate]]></filter>
+	    </set>
+
+	    <filter name="region" condition="REG = :region"/>
+	    <filter name="regionlist" condition="REG IN (:regions)"/>
+
+	</class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Salesperson.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Salesperson.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Salesperson.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Salesperson.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,68 @@
+// $Id: Salesperson.java 4448 2004-08-28 02:29:05Z steveebersole $
+package org.hibernate.test.filter;
+
+import java.util.Set;
+import java.util.HashSet;
+import java.util.Date;
+
+/**
+ * Implementation of Salesperson.
+ * 
+ * @author Steve
+ */
+public class Salesperson {
+	private Long id;
+	private String name;
+	private String region;
+	private Date hireDate;
+	private Department department;
+	private Set orders = new HashSet();
+
+	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 String getRegion() {
+		return region;
+	}
+
+	public void setRegion(String region) {
+		this.region = region;
+	}
+
+	public Set getOrders() {
+		return orders;
+	}
+
+	public void setOrders(Set orders) {
+		this.orders = orders;
+	}
+
+	public Date getHireDate() {
+		return hireDate;
+	}
+
+	public void setHireDate(Date hireDate) {
+		this.hireDate = hireDate;
+	}
+
+	public Department getDepartment() {
+		return department;
+	}
+
+	public void setDepartment(Department department) {
+		this.department = department;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/Salesperson.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/defs.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/defs.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/defs.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,38 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping
+        SYSTEM
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<hibernate-mapping>
+	<filter-def name="region">
+		<filter-param name="region" type="string"/>
+	</filter-def>
+
+	<filter-def name="regionlist">
+		<filter-param name="regions" type="string"/>
+	</filter-def>
+
+	<filter-def name="fulfilledOrders">
+		<filter-param name="asOfDate" type="timestamp"/>
+	</filter-def>
+
+	<filter-def name="effectiveDate">
+		<filter-param name="asOfDate" type="timestamp"/>
+	</filter-def>
+
+	<filter-def name="heavyProducts">
+		<filter-param name="weightKilograms" type="double"/>
+	</filter-def>
+
+	<filter-def name="seniorSalespersons">
+		<filter-param name="asOfDate" type="timestamp"/>
+	</filter-def>
+
+	<filter-def name="cat">
+		<filter-param name="catId" type="long"/>
+	</filter-def>
+
+    <filter-def name="unioned">
+    </filter-def>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/defs.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/Basic.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/Basic.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/Basic.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,40 @@
+<?xml version="1.0"?>
+<!--
+  ~ Hibernate, Relational Persistence for Idiomatic Java
+  ~
+  ~ Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+  ~ indicated by the @author tags or express copyright attribution
+  ~ statements applied by the authors.  All third-party contributions are
+  ~ distributed under license by Red Hat Middleware LLC.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, as published by the Free Software Foundation.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  ~ or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+  ~ for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public License
+  ~ along with this distribution; if not, write to:
+  ~ Free Software Foundation, Inc.
+  ~ 51 Franklin Street, Fifth Floor
+  ~ Boston, MA  02110-1301  USA
+  ~
+  -->
+
+<!DOCTYPE hibernate-mapping
+        SYSTEM
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<hibernate-mapping package="org.hibernate.test.filter.hql">
+    <class name="Person" table="FILTER_HQL_PERSON">
+        <id column="ID" name="id" type="long">
+            <generator class="increment"/>
+        </id>
+        <property name="name" type="string"/>
+        <property name="sex" column="SEX_CODE" type="char"/>
+        <filter name="sex"/>
+    </class>
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/Basic.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/BasicFilteredBulkManipulationTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/BasicFilteredBulkManipulationTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/BasicFilteredBulkManipulationTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,93 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.filter.hql;
+
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.Session;
+
+/**
+ * Tests for application of filters 
+ *
+ * @author Steve Ebersole
+ */
+public class BasicFilteredBulkManipulationTest extends FunctionalTestCase {
+	public BasicFilteredBulkManipulationTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[]{
+			"filter/hql/filter-defs.hbm.xml",
+			"filter/hql/Basic.hbm.xml"
+		};
+	}
+
+	public void testBasicFilteredHqlDelete() {
+		Session s = openSession();
+		s.beginTransaction();
+		s.save( new Person( "Steve", 'M' ) );
+		s.save( new Person( "Emmanuel", 'M' ) );
+		s.save( new Person( "Gail", 'F' ) );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.enableFilter( "sex" ).setParameter( "sexCode", new Character( 'M' ) );
+		int count = s.createQuery( "delete Person" ).executeUpdate();
+		assertEquals( 2, count );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.createQuery( "delete Person" ).executeUpdate();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testBasicFilteredHqlUpdate() {
+		Session s = openSession();
+		s.beginTransaction();
+		s.save( new Person( "Shawn", 'M' ) );
+		s.save( new Person( "Sally", 'F' ) );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.enableFilter( "sex" ).setParameter( "sexCode", new Character( 'M' ) );
+		int count = s.createQuery( "update Person p set p.name = 'Shawn'" ).executeUpdate();
+		assertEquals( 1, count );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.createQuery( "delete Person" ).executeUpdate();
+		s.getTransaction().commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/BasicFilteredBulkManipulationTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/Customer.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/Customer.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/Customer.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,51 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.filter.hql;
+
+/**
+ * Leaf subclass
+ *
+ * @author Steve Ebersole
+ */
+public class Customer extends User {
+	private String company;
+
+	protected Customer() {
+		super();
+	}
+
+	public Customer(String name, char sex, String username, String company) {
+		super( name, sex, username );
+		this.company = company;
+	}
+
+	public String getCompany() {
+		return company;
+	}
+
+	public void setCompany(String company) {
+		this.company = company;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/Customer.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/Employee.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/Employee.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/Employee.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,53 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.filter.hql;
+
+import java.util.Date;
+
+/**
+ * Leaf subclass
+ *
+ * @author Steve Ebersole
+ */
+public class Employee extends User {
+	private Date hireDate;
+
+	protected Employee() {
+		super();
+	}
+
+	public Employee(String name, char sex, String username, Date hireDate) {
+		super( name, sex, username );
+		this.hireDate = hireDate;
+	}
+
+	public Date getHireDate() {
+		return hireDate;
+	}
+
+	public void setHireDate(Date hireDate) {
+		this.hireDate = hireDate;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/Employee.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/Joined.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/Joined.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/Joined.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,52 @@
+<?xml version="1.0"?>
+<!--
+  ~ Hibernate, Relational Persistence for Idiomatic Java
+  ~
+  ~ Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+  ~ indicated by the @author tags or express copyright attribution
+  ~ statements applied by the authors.  All third-party contributions are
+  ~ distributed under license by Red Hat Middleware LLC.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, as published by the Free Software Foundation.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  ~ or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+  ~ for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public License
+  ~ along with this distribution; if not, write to:
+  ~ Free Software Foundation, Inc.
+  ~ 51 Franklin Street, Fifth Floor
+  ~ Boston, MA  02110-1301  USA
+  ~
+  -->
+
+<!DOCTYPE hibernate-mapping
+        SYSTEM
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<hibernate-mapping package="org.hibernate.test.filter.hql">
+    <class name="Person" table="FILTER_HQL_JOINED_PERSON">
+        <id column="ID" name="id" type="long">
+            <generator class="increment"/>
+        </id>
+        <property name="name" type="string"/>
+        <property name="sex" column="SEX_CODE" type="char"/>
+        <joined-subclass name="User" table="FILTER_HQL_JOINED_USER">
+            <key column="USER_ID"/>
+            <property name="username" type="string"/>
+            <joined-subclass name="Employee" table="FILTER_HQL_JOINED_EMP">
+                <key column="EMP_ID"/>
+                <property name="hireDate" type="date"/>
+            </joined-subclass>
+            <joined-subclass name="Customer" table="FILTER_HQL_JOINED_CUST">
+                <key column="CUST_ID"/>
+                <property name="company" type="string"/>
+            </joined-subclass>
+        </joined-subclass>
+        <filter name="sex"/>
+    </class>
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/Joined.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/JoinedFilteredBulkManipulationTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/JoinedFilteredBulkManipulationTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/JoinedFilteredBulkManipulationTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,201 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.filter.hql;
+
+import java.util.Date;
+
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.Session;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class JoinedFilteredBulkManipulationTest extends FunctionalTestCase {
+	public JoinedFilteredBulkManipulationTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[]{
+			"filter/hql/filter-defs.hbm.xml",
+			"filter/hql/Joined.hbm.xml"
+		};
+	}
+
+	public void testFilteredJoinedSubclassHqlDeleteRoot() {
+		Session s = openSession();
+		s.beginTransaction();
+		s.save( new Employee( "John", 'M', "john", new Date() ) );
+		s.save( new Employee( "Jane", 'F', "jane", new Date() ) );
+		s.save( new Customer( "Charlie", 'M', "charlie", "Acme" ) );
+		s.save( new Customer( "Wanda", 'F', "wanda", "ABC" ) );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.enableFilter( "sex" ).setParameter( "sexCode", new Character('M' ) );
+		int count = s.createQuery( "delete Person" ).executeUpdate();
+		assertEquals( 2, count );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.createQuery( "delete Person" ).executeUpdate();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testFilteredJoinedSubclassHqlDeleteNonLeaf() {
+		Session s = openSession();
+		s.beginTransaction();
+		s.save( new Employee( "John", 'M', "john", new Date() ) );
+		s.save( new Employee( "Jane", 'F', "jane", new Date() ) );
+		s.save( new Customer( "Charlie", 'M', "charlie", "Acme" ) );
+		s.save( new Customer( "Wanda", 'F', "wanda", "ABC" ) );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.enableFilter( "sex" ).setParameter( "sexCode", new Character('M' ) );
+		int count = s.createQuery( "delete User" ).executeUpdate();
+		assertEquals( 2, count );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.createQuery( "delete Person" ).executeUpdate();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testFilteredJoinedSubclassHqlDeleteLeaf() {
+		Session s = openSession();
+		s.beginTransaction();
+		s.save( new Employee( "John", 'M', "john", new Date() ) );
+		s.save( new Employee( "Jane", 'F', "jane", new Date() ) );
+		s.save( new Customer( "Charlie", 'M', "charlie", "Acme" ) );
+		s.save( new Customer( "Wanda", 'F', "wanda", "ABC" ) );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.enableFilter( "sex" ).setParameter( "sexCode", new Character('M' ) );
+		int count = s.createQuery( "delete Employee" ).executeUpdate();
+		assertEquals( 1, count );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.createQuery( "delete Person" ).executeUpdate();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testFilteredJoinedSubclassHqlUpdateRoot() {
+		Session s = openSession();
+		s.beginTransaction();
+		s.save( new Employee( "John", 'M', "john", new Date() ) );
+		s.save( new Employee( "Jane", 'F', "jane", new Date() ) );
+		s.save( new Customer( "Charlie", 'M', "charlie", "Acme" ) );
+		s.save( new Customer( "Wanda", 'F', "wanda", "ABC" ) );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.enableFilter( "sex" ).setParameter( "sexCode", new Character('M' ) );
+		int count = s.createQuery( "update Person p set p.name = '<male>'" ).executeUpdate();
+		assertEquals( 2, count );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.createQuery( "delete Person" ).executeUpdate();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testFilteredJoinedSubclassHqlUpdateNonLeaf() {
+		Session s = openSession();
+		s.beginTransaction();
+		s.save( new Employee( "John", 'M', "john", new Date() ) );
+		s.save( new Employee( "Jane", 'F', "jane", new Date() ) );
+		s.save( new Customer( "Charlie", 'M', "charlie", "Acme" ) );
+		s.save( new Customer( "Wanda", 'F', "wanda", "ABC" ) );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.enableFilter( "sex" ).setParameter( "sexCode", new Character('M' ) );
+		int count = s.createQuery( "update User u set u.username = :un where u.name = :n" )
+				.setString( "un", "charlie" )
+				.setString( "n", "Wanda" )
+				.executeUpdate();
+		assertEquals( 0, count );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.createQuery( "delete Person" ).executeUpdate();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testFilteredJoinedSubclassHqlUpdateLeaf() {
+		Session s = openSession();
+		s.beginTransaction();
+		s.save( new Employee( "John", 'M', "john", new Date() ) );
+		s.save( new Employee( "Jane", 'F', "jane", new Date() ) );
+		s.save( new Customer( "Charlie", 'M', "charlie", "Acme" ) );
+		s.save( new Customer( "Wanda", 'F', "wanda", "ABC" ) );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.enableFilter( "sex" ).setParameter( "sexCode", new Character('M' ) );
+		int count = s.createQuery( "update Customer c set c.company = 'XYZ'" ).executeUpdate();
+		assertEquals( 1, count );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.createQuery( "delete Person" ).executeUpdate();
+		s.getTransaction().commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/JoinedFilteredBulkManipulationTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,71 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.filter.hql;
+
+/**
+ * Base of inheritence hierarchy
+ *
+ * @author Steve Ebersole
+ */
+public class Person {
+	private Long id;
+	private String name;
+	private char sex;
+
+	/**
+	 * Used by persistence
+	 */
+	protected Person() {
+	}
+
+	public Person(String name, char sex) {
+		this.name = name;
+		this.sex = sex;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	private void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public char getSex() {
+		return sex;
+	}
+
+	public void setSex(char sex) {
+		this.sex = sex;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/Person.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/User.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/User.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/User.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,51 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.filter.hql;
+
+/**
+ * Non-leaf subclass
+ *
+ * @author Steve Ebersole
+ */
+public class User extends Person {
+	private String username;
+
+	protected User() {
+		super();
+	}
+
+	public User(String name, char sex, String username) {
+		super( name, sex );
+		this.username = username;
+	}
+
+	public String getUsername() {
+		return username;
+	}
+
+	public void setUsername(String username) {
+		this.username = username;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/User.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/filter-defs.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/filter-defs.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/filter-defs.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<!--
+  ~ Hibernate, Relational Persistence for Idiomatic Java
+  ~
+  ~ Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+  ~ indicated by the @author tags or express copyright attribution
+  ~ statements applied by the authors.  All third-party contributions are
+  ~ distributed under license by Red Hat Middleware LLC.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, as published by the Free Software Foundation.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  ~ or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+  ~ for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public License
+  ~ along with this distribution; if not, write to:
+  ~ Free Software Foundation, Inc.
+  ~ 51 Franklin Street, Fifth Floor
+  ~ Boston, MA  02110-1301  USA
+  ~
+  -->
+
+<!DOCTYPE hibernate-mapping
+        SYSTEM
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<hibernate-mapping package="org.hibernate.test.filter.hql">
+    <filter-def name="sex" condition="SEX_CODE = :sexCode">
+        <filter-param name="sexCode" type="char"/>
+    </filter-def>
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/filter/hql/filter-defs.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/formulajoin/Detail.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/formulajoin/Detail.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/formulajoin/Detail.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,46 @@
+//$Id: Detail.java 4602 2004-09-26 11:42:47Z oneovthafew $
+package org.hibernate.test.formulajoin;
+
+import java.io.Serializable;
+
+/**
+ * @author Gavin King
+ */
+public class Detail implements Serializable {
+	private Long id;
+	private Master master;
+	private int version;
+	private String details;
+	private boolean currentVersion;
+	
+	public boolean isCurrentVersion() {
+		return currentVersion;
+	}
+	public void setCurrentVersion(boolean currentVersion) {
+		this.currentVersion = currentVersion;
+	}
+	public String getDetails() {
+		return details;
+	}
+	public void setDetails(String details) {
+		this.details = details;
+	}
+	public Long getId() {
+		return id;
+	}
+	public void setId(Long id) {
+		this.id = id;
+	}
+	public Master getMaster() {
+		return master;
+	}
+	public void setMaster(Master master) {
+		this.master = master;
+	}
+	public int getVersion() {
+		return version;
+	}
+	public void setVersion(int version) {
+		this.version = version;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/formulajoin/Detail.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/formulajoin/FormulaJoinTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/formulajoin/FormulaJoinTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/formulajoin/FormulaJoinTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,100 @@
+//$Id: FormulaJoinTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.formulajoin;
+
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.dialect.PostgreSQLDialect;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class FormulaJoinTest extends FunctionalTestCase {
+	
+	public FormulaJoinTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "formulajoin/Master.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( FormulaJoinTest.class );
+	}
+	
+	public void testFormulaJoin() {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Master master = new Master();
+		master.setName("master 1");
+		Detail current = new Detail();
+		current.setCurrentVersion(true);
+		current.setVersion(2);
+		current.setDetails("details of master 1 blah blah");
+		current.setMaster(master);
+		master.setDetail(current);
+		Detail past = new Detail();
+		past.setCurrentVersion(false);
+		past.setVersion(1);
+		past.setDetails("old details of master 1 yada yada");
+		past.setMaster(master);
+		s.persist(master);
+		s.persist(past);
+		s.persist(current);
+		tx.commit();
+		s.close();
+		
+		if ( getDialect() instanceof PostgreSQLDialect ) return;
+
+		s = openSession();
+		tx = s.beginTransaction();
+		List l = s.createQuery("from Master m left join m.detail d").list();
+		assertEquals( l.size(), 1 );
+		tx.commit();
+		s.close();
+		
+		s = openSession();
+		tx = s.beginTransaction();
+		l = s.createQuery("from Master m left join fetch m.detail").list();
+		assertEquals( l.size(), 1 );
+		Master m = (Master) l.get(0);
+		assertEquals( "master 1", m.getDetail().getMaster().getName() );
+		assertTrue( m==m.getDetail().getMaster() );
+		tx.commit();
+		s.close();
+		
+		s = openSession();
+		tx = s.beginTransaction();
+		l = s.createQuery("from Master m join fetch m.detail").list();
+		assertEquals( l.size(), 1 );
+		tx.commit();
+		s.close();
+		
+		s = openSession();
+		tx = s.beginTransaction();
+		l = s.createQuery("from Detail d join fetch d.currentMaster.master").list();
+		assertEquals( l.size(), 2 );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		l = s.createQuery("from Detail d join fetch d.currentMaster.master m join fetch m.detail").list();
+		assertEquals( l.size(), 2 );
+		
+		s.createQuery("delete from Detail").executeUpdate();
+		s.createQuery("delete from Master").executeUpdate();
+		
+		tx.commit();
+		s.close();
+
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/formulajoin/FormulaJoinTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/formulajoin/Master.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/formulajoin/Master.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/formulajoin/Master.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,65 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+  
+  Demonstrates use of an association "filtered" using a formula
+  mapping in the foreign key.
+  
+-->
+
+<hibernate-mapping package="org.hibernate.test.formulajoin">
+
+	<class name="Master" table="t_masters">
+	
+		<id name="id">
+			<generator class="increment"/>
+		</id>
+		
+		<property name="name" 
+			not-null="true" 
+			length="100" 
+			update="false"/>
+		
+		<many-to-one name="detail" 
+				property-ref="currentMaster" 
+				insert="false"
+				update="false">
+			<column name="id"/>
+			<formula>1</formula>
+		</many-to-one>
+		
+	</class>
+
+	<class name="Detail" table="t_details">
+	
+		<id name="id">
+			<generator class="hilo"/>
+		</id>
+		
+		<property name="details" 
+			length="300" 
+			update="false" 
+			not-null="true"/>
+			
+		<property name="version" update="false">
+			<column name="version" 
+				not-null="true" 
+				unique-key="masterVersion"/>
+		</property>
+		
+		<properties name="currentMaster">
+			<many-to-one name="master">
+				<column name="cur_master" 
+					unique-key="masterVersion" 
+					not-null="true"/>
+			</many-to-one>
+			<property name="currentVersion" 
+				not-null="true"/>
+		</properties>
+		
+	</class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/formulajoin/Master.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/formulajoin/Master.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/formulajoin/Master.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/formulajoin/Master.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,31 @@
+//$Id: Master.java 4602 2004-09-26 11:42:47Z oneovthafew $
+package org.hibernate.test.formulajoin;
+
+import java.io.Serializable;
+
+/**
+ * @author Gavin King
+ */
+public class Master implements Serializable {
+	private Long id;
+	private String name;
+	private Detail detail;
+	public Detail getDetail() {
+		return detail;
+	}
+	public void setDetail(Detail detail) {
+		this.detail = detail;
+	}
+	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;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/formulajoin/Master.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/AbstractGeneratedPropertyTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/AbstractGeneratedPropertyTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/AbstractGeneratedPropertyTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,55 @@
+// $Id: AbstractGeneratedPropertyTest.java 10976 2006-12-12 23:22:26Z steve.ebersole at jboss.com $
+package org.hibernate.test.generated;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.Hibernate;
+import org.hibernate.testing.junit.functional.DatabaseSpecificFunctionalTestCase;
+
+/**
+ * Implementation of AbstractGeneratedPropertyTest.
+ *
+ * @author Steve Ebersole
+ */
+public abstract class AbstractGeneratedPropertyTest extends DatabaseSpecificFunctionalTestCase {
+	public AbstractGeneratedPropertyTest(String x) {
+		super( x );
+	}
+
+	public final void testGeneratedProperty() {
+		// The following block is repeated 300 times to reproduce HHH-2627.
+		// Without the fix, Oracle will run out of cursors using 10g with
+		// a default installation (ORA-01000: maximum open cursors exceeded).
+		// The number of loops may need to be adjusted depending on the how
+		// Oracle is configured.
+		// Note: The block is not indented to avoid a lot of irrelevant differences.
+		for ( int i=0; i<300; i++ ) {
+		GeneratedPropertyEntity entity = new GeneratedPropertyEntity();
+		entity.setName( "entity-1" );
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.save( entity );
+		s.flush();
+		assertNotNull( "no timestamp retrieved", entity.getLastModified() );
+		t.commit();
+		s.close();
+
+		byte[] bytes = entity.getLastModified();
+
+		s = openSession();
+		t = s.beginTransaction();
+		entity = ( GeneratedPropertyEntity ) s.get( GeneratedPropertyEntity.class, entity.getId() );
+		assertTrue( Hibernate.BINARY.isEqual( bytes, entity.getLastModified() ) );
+		t.commit();
+		s.close();
+
+		assertTrue( Hibernate.BINARY.isEqual( bytes, entity.getLastModified() ) );
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete( entity );
+		t.commit();
+		s.close();
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/AbstractGeneratedPropertyTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/ComponentOwner.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/ComponentOwner.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/ComponentOwner.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,38 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.generated">
+
+    <class name="ComponentOwner" table="part_gen_comp">
+    	<id name="id">
+    		<generator class="increment"/>
+    	</id>
+        <property name="name" />
+        <component name="component" class="ComponentOwner$Component">
+            <property name="generated" type="int" generated="always" column="GENED"/>
+        </component>
+	</class>
+
+    <database-object>
+        <create>
+            <![CDATA[CREATE OR REPLACE TRIGGER t_iu_part_gen_comp
+            BEFORE INSERT OR UPDATE ON part_gen_comp
+            FOR EACH ROW
+            BEGIN
+                IF INSERTING THEN
+                    :new.gened := 1;
+                ELSE
+                    :new.gened := :old.gened + 1;
+                END IF;
+            END;]]>
+        </create>
+        <drop>
+            <![CDATA[DROP TRIGGER t_iu_part_gen_comp]]>
+        </drop>
+        <dialect-scope name="org.hibernate.dialect.Oracle9iDialect"/>
+        <dialect-scope name="org.hibernate.dialect.Oracle10gDialect"/>
+    </database-object>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/ComponentOwner.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/ComponentOwner.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/ComponentOwner.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/ComponentOwner.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,55 @@
+package org.hibernate.test.generated;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class ComponentOwner {
+	private Long id;
+	private String name;
+	private Component component;
+
+	public ComponentOwner() {
+	}
+
+	public ComponentOwner(String name) {
+		this.name = name;
+	}
+
+	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 Component getComponent() {
+		return component;
+	}
+
+	public void setComponent(Component component) {
+		this.component = component;
+	}
+
+	public static class Component {
+		private int generated;
+
+		public int getGenerated() {
+			return generated;
+		}
+
+		public void setGenerated(int generated) {
+			this.generated = generated;
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/ComponentOwner.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/GeneratedPropertyEntity.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/GeneratedPropertyEntity.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/GeneratedPropertyEntity.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,42 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.generated">
+
+    <class name="GeneratedPropertyEntity" table="gen_prop">
+
+    	<id name="id">
+    		<generator class="native"/>
+    	</id>
+        <property name="name"/>
+        <property name="lastModified" generated="always" type="binary">
+            <column name="lastModified" length="8"/>
+        </property>
+
+	</class>
+
+    <database-object>
+        <create>
+            <![CDATA[CREATE OR REPLACE TRIGGER t_iu_gen_prop
+            BEFORE INSERT OR UPDATE ON gen_prop
+            FOR EACH ROW
+            BEGIN
+                IF INSERTING THEN
+                    :new.lastModified := HEXTORAW( '1' );
+                ELSE
+                    :new.lastModified := HEXTORAW(
+                        TO_NUMBER( RAWTOHEX( :old.lastModified ) ) + 1
+                    );
+                END IF;
+            END;]]>
+        </create>
+        <drop>
+            <![CDATA[DROP TRIGGER t_iu_gen_prop]]>
+        </drop>
+        <dialect-scope name="org.hibernate.dialect.Oracle9iDialect"/>
+        <dialect-scope name="org.hibernate.dialect.Oracle10gDialect"/>
+    </database-object>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/GeneratedPropertyEntity.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/GeneratedPropertyEntity.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/GeneratedPropertyEntity.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/GeneratedPropertyEntity.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,37 @@
+// $Id: GeneratedPropertyEntity.java 7800 2005-08-10 12:13:00Z steveebersole $
+package org.hibernate.test.generated;
+
+/**
+ * Implementation of GeneratedPropertyEntity.
+ *
+ * @author Steve Ebersole
+ */
+public class GeneratedPropertyEntity {
+	private Long id;
+	private String name;
+	private byte[] lastModified;
+
+	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 byte[] getLastModified() {
+		return lastModified;
+	}
+
+	public void setLastModified(byte[] lastModified) {
+		this.lastModified = lastModified;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/GeneratedPropertyEntity.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/MSSQLGeneratedPropertyEntity.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/MSSQLGeneratedPropertyEntity.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/MSSQLGeneratedPropertyEntity.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.generated">
+
+    <class name="GeneratedPropertyEntity" table="gen_prop">
+
+    	<id name="id">
+    		<generator class="native"/>
+    	</id>
+        <property name="name"/>
+        <property name="lastModified" generated="always" type="binary">
+            <column name="lastModified" length="8" sql-type="TIMESTAMP"/>
+        </property>
+
+	</class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/MSSQLGeneratedPropertyEntity.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/PartiallyGeneratedComponentTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/PartiallyGeneratedComponentTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/PartiallyGeneratedComponentTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,64 @@
+package org.hibernate.test.generated;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.DatabaseSpecificFunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.dialect.Oracle9iDialect;
+import org.hibernate.Session;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class PartiallyGeneratedComponentTest extends DatabaseSpecificFunctionalTestCase {
+	public PartiallyGeneratedComponentTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "generated/ComponentOwner.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( PartiallyGeneratedComponentTest.class );
+	}
+
+	public boolean appliesTo(Dialect dialect) {
+		return dialect instanceof Oracle9iDialect;
+	}
+
+	public void testPartialComponentGeneration() {
+		ComponentOwner owner = new ComponentOwner( "initial" );
+		Session s = openSession();
+		s.beginTransaction();
+		s.save( owner );
+		s.getTransaction().commit();
+		s.close();
+
+		assertNotNull( "expecting insert value generation", owner.getComponent() );
+		int previousValue = owner.getComponent().getGenerated();
+		assertFalse( "expecting insert value generation", 0 == previousValue );
+
+		s = openSession();
+		s.beginTransaction();
+		owner = ( ComponentOwner ) s.get( ComponentOwner.class, owner.getId() );
+		assertEquals( "expecting insert value generation", previousValue, owner.getComponent().getGenerated() );
+		owner.setName( "subsequent" );
+		s.getTransaction().commit();
+		s.close();
+
+		assertNotNull( owner.getComponent() );
+		previousValue = owner.getComponent().getGenerated();
+
+		s = openSession();
+		s.beginTransaction();
+		owner = ( ComponentOwner ) s.get( ComponentOwner.class, owner.getId() );
+		assertEquals( "expecting update value generation", previousValue, owner.getComponent().getGenerated() );
+		s.delete( owner );
+		s.getTransaction().commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/PartiallyGeneratedComponentTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/TimestampGeneratedValuesWithCachingTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/TimestampGeneratedValuesWithCachingTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/TimestampGeneratedValuesWithCachingTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,40 @@
+// $Id: TimestampGeneratedValuesWithCachingTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.generated;
+
+import junit.framework.Test;
+
+import org.hibernate.dialect.Dialect;
+import org.hibernate.dialect.SybaseDialect;
+import org.hibernate.dialect.Sybase11Dialect;
+import org.hibernate.dialect.SybaseAnywhereDialect;
+import org.hibernate.dialect.SybaseASE15Dialect;
+import org.hibernate.dialect.SQLServerDialect;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Implementation of TimestampGeneratedValuesWithCachingTest.
+ *
+ * @author Steve Ebersole
+ */
+public class TimestampGeneratedValuesWithCachingTest extends AbstractGeneratedPropertyTest {
+
+	public TimestampGeneratedValuesWithCachingTest(String x) {
+		super( x );
+	}
+
+	public final String[] getMappings() {
+		return new String[] { "generated/MSSQLGeneratedPropertyEntity.hbm.xml" };
+	}
+
+	public boolean appliesTo(Dialect dialect) {
+		// this test is specific to Sybase/SQLServer as it is testing support
+		// for their TIMESTAMP datatype...
+		return ( dialect instanceof SybaseDialect || dialect instanceof Sybase11Dialect ||
+			dialect instanceof SybaseAnywhereDialect || dialect instanceof SybaseASE15Dialect ||
+			dialect instanceof SQLServerDialect);
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( TimestampGeneratedValuesWithCachingTest.class );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/TimestampGeneratedValuesWithCachingTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/TriggerGeneratedValuesWithCachingTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/TriggerGeneratedValuesWithCachingTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/TriggerGeneratedValuesWithCachingTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,34 @@
+// $Id: TriggerGeneratedValuesWithCachingTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.generated;
+
+import org.hibernate.dialect.Oracle9iDialect;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+import junit.framework.Test;
+
+/**
+ * Implementation of TriggerGeneratedValuesWithoutCachingTest.
+ *
+ * @author Steve Ebersole
+ */
+public class TriggerGeneratedValuesWithCachingTest extends AbstractGeneratedPropertyTest {
+
+	public TriggerGeneratedValuesWithCachingTest(String x) {
+		super( x );
+	}
+
+	public final String[] getMappings() {
+		return new String[] { "generated/GeneratedPropertyEntity.hbm.xml" };
+	}
+
+	public boolean appliesTo(Dialect dialect) {
+		// currently have only defined triggers for oracle...
+		// TODO : add more triggers for dialects which allow mods in triggers...
+		return ( dialect instanceof Oracle9iDialect );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( TriggerGeneratedValuesWithCachingTest.class );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/TriggerGeneratedValuesWithCachingTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/TriggerGeneratedValuesWithoutCachingTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/TriggerGeneratedValuesWithoutCachingTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/TriggerGeneratedValuesWithoutCachingTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,38 @@
+// $Id: TriggerGeneratedValuesWithoutCachingTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.generated;
+
+import junit.framework.Test;
+
+import org.hibernate.dialect.Dialect;
+import org.hibernate.dialect.Oracle9iDialect;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Implementation of TriggerGeneratedValuesWithoutCachingTest.
+ *
+ * @author Steve Ebersole
+ */
+public class TriggerGeneratedValuesWithoutCachingTest extends AbstractGeneratedPropertyTest {
+
+	public TriggerGeneratedValuesWithoutCachingTest(String x) {
+		super( x );
+	}
+
+	public final String[] getMappings() {
+		return new String[] { "generated/GeneratedPropertyEntity.hbm.xml" };
+	}
+
+	public boolean appliesTo(Dialect dialect) {
+		// currently have only defined triggers for oracle...
+		// TODO : add more triggers for dialects which allow mods in triggers...
+		return ( dialect instanceof Oracle9iDialect );
+	}
+
+	public String getCacheConcurrencyStrategy() {
+		return null;
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( TriggerGeneratedValuesWithoutCachingTest.class );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generated/TriggerGeneratedValuesWithoutCachingTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/identity/IdentityGeneratedKeysTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/identity/IdentityGeneratedKeysTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/identity/IdentityGeneratedKeysTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,160 @@
+package org.hibernate.test.generatedkeys.identity;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.testing.junit.functional.DatabaseSpecificFunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Steve Ebersole
+ */
+public class IdentityGeneratedKeysTest extends DatabaseSpecificFunctionalTestCase {
+	public IdentityGeneratedKeysTest(String name) {
+		super( name );
+	}
+
+	public void configure(Configuration cfg) {
+		super.configure( cfg );
+		cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "generatedkeys/identity/MyEntity.hbm.xml" };
+	}
+
+	public boolean appliesTo(Dialect dialect) {
+		return dialect.supportsIdentityColumns();
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( IdentityGeneratedKeysTest.class );
+	}
+
+	public void testIdentityColumnGeneratedIds() {
+		Session s = openSession();
+		s.beginTransaction();
+		MyEntity myEntity = new MyEntity( "test" );
+		Long id = ( Long ) s.save( myEntity );
+		assertNotNull( "identity column did not force immediate insert", id );
+		assertEquals( id, myEntity.getId() );
+		s.delete( myEntity );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testPersistOutsideTransaction() {
+		Session s = openSession();
+
+		// first test save() which should force an immediate insert...
+		MyEntity myEntity1 = new MyEntity( "test-save" );
+		Long id = ( Long ) s.save( myEntity1 );
+		assertNotNull( "identity column did not force immediate insert", id );
+		assertEquals( id, myEntity1.getId() );
+
+		// next test persist() which should cause a delayed insert...
+		long initialInsertCount = sfi().getStatistics().getEntityInsertCount();
+		MyEntity myEntity2 = new MyEntity( "test-persist");
+		s.persist( myEntity2 );
+		assertEquals( "persist on identity column not delayed", initialInsertCount, sfi().getStatistics().getEntityInsertCount() );
+		assertNull( myEntity2.getId() );
+
+		// an explicit flush should cause execution of the delayed insertion
+		s.flush();
+		assertEquals( "delayed persist insert not executed on flush", initialInsertCount + 1, sfi().getStatistics().getEntityInsertCount() );
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.delete( myEntity1 );
+		s.delete( myEntity2 );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testPersistOutsideTransactionCascadedToNonInverseCollection() {
+		long initialInsertCount = sfi().getStatistics().getEntityInsertCount();
+		Session s = openSession();
+		MyEntity myEntity = new MyEntity( "test-persist");
+		myEntity.getNonInverseChildren().add( new MyChild( "test-child-persist-non-inverse" ) );
+		s.persist( myEntity );
+		assertEquals( "persist on identity column not delayed", initialInsertCount, sfi().getStatistics().getEntityInsertCount() );
+		assertNull( myEntity.getId() );
+		s.flush();
+		assertEquals( "delayed persist insert not executed on flush", initialInsertCount + 2, sfi().getStatistics().getEntityInsertCount() );
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.createQuery( "delete MyChild" ).executeUpdate();
+		s.createQuery( "delete MyEntity" ).executeUpdate();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testPersistOutsideTransactionCascadedToInverseCollection() {
+		long initialInsertCount = sfi().getStatistics().getEntityInsertCount();
+		Session s = openSession();
+		MyEntity myEntity2 = new MyEntity( "test-persist-2");
+		MyChild child = new MyChild( "test-child-persist-inverse" );
+		myEntity2.getInverseChildren().add( child );
+		child.setInverseParent( myEntity2 );
+		s.persist( myEntity2 );
+		assertEquals( "persist on identity column not delayed", initialInsertCount, sfi().getStatistics().getEntityInsertCount() );
+		assertNull( myEntity2.getId() );
+		s.flush();
+		assertEquals( "delayed persist insert not executed on flush", initialInsertCount + 2, sfi().getStatistics().getEntityInsertCount() );
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.createQuery( "delete MyChild" ).executeUpdate();
+		s.createQuery( "delete MyEntity" ).executeUpdate();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testPersistOutsideTransactionCascadedToManyToOne() {
+		long initialInsertCount = sfi().getStatistics().getEntityInsertCount();
+		Session s = openSession();
+		MyEntity myEntity = new MyEntity( "test-persist");
+		myEntity.setSibling( new MySibling( "test-persist-sibling-out" ) );
+		s.persist( myEntity );
+		assertEquals( "persist on identity column not delayed", initialInsertCount, sfi().getStatistics().getEntityInsertCount() );
+		assertNull( myEntity.getId() );
+		s.flush();
+		assertEquals( "delayed persist insert not executed on flush", initialInsertCount + 2, sfi().getStatistics().getEntityInsertCount() );
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.createQuery( "delete MyEntity" ).executeUpdate();
+		s.createQuery( "delete MySibling" ).executeUpdate();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testPersistOutsideTransactionCascadedFromManyToOne() {
+		long initialInsertCount = sfi().getStatistics().getEntityInsertCount();
+		Session s = openSession();
+		MyEntity myEntity2 = new MyEntity( "test-persist-2");
+		MySibling sibling = new MySibling( "test-persist-sibling-in" );
+		sibling.setEntity( myEntity2 );
+		s.persist( sibling );
+		assertEquals( "persist on identity column not delayed", initialInsertCount, sfi().getStatistics().getEntityInsertCount() );
+		assertNull( myEntity2.getId() );
+		s.flush();
+		assertEquals( "delayed persist insert not executed on flush", initialInsertCount + 2, sfi().getStatistics().getEntityInsertCount() );
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.createQuery( "delete MySibling" ).executeUpdate();
+		s.createQuery( "delete MyEntity" ).executeUpdate();
+		s.getTransaction().commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/identity/IdentityGeneratedKeysTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/identity/MyChild.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/identity/MyChild.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/identity/MyChild.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,41 @@
+package org.hibernate.test.generatedkeys.identity;
+
+/**
+ * @author Steve Ebersole
+ */
+public class MyChild {
+	private Long id;
+	private String name;
+	private MyEntity inverseParent;
+
+	public MyChild() {
+	}
+
+	public MyChild(String name) {
+		this.name = name;
+	}
+
+	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 MyEntity getInverseParent() {
+		return inverseParent;
+	}
+
+	public void setInverseParent(MyEntity inverseParent) {
+		this.inverseParent = inverseParent;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/identity/MyChild.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/identity/MyEntity.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/identity/MyEntity.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/identity/MyEntity.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,48 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.generatedkeys.identity" default-access="field">
+
+    <class name="MyEntity" table="my_entity">
+    	<id name="id">
+    		<generator class="identity"/>
+    	</id>
+        <property name="name"/>
+
+        <!-- used to test cascades "out" to a many-to-one association -->
+        <many-to-one name="sibling" class="MySibling" cascade="persist, merge"/>
+
+        <!-- used to test cascades "out" to non-inverse collections -->
+        <set name="nonInverseChildren" inverse="false" cascade="persist, merge">
+            <key column="non_inv_parent_id"/>
+            <one-to-many class="MyChild"/>
+        </set>
+
+        <!-- used to test cascades "out" to inverse collections -->
+        <set name="inverseChildren" inverse="true" cascade="persist, merge">
+            <key column="inv_parent_id"/>
+            <one-to-many class="MyChild"/>
+        </set>
+    </class>
+
+
+    <class name="MySibling" table="my_sibling">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <property name="name"/>
+        <many-to-one name="entity" class="MyEntity" cascade="persist, merge"/>
+    </class>
+
+
+    <class name="MyChild" table="my_child">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <property name="name"/>
+        <many-to-one name="inverseParent" column="inv_parent_id" class="MyEntity"/>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/identity/MyEntity.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/identity/MyEntity.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/identity/MyEntity.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/identity/MyEntity.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,62 @@
+package org.hibernate.test.generatedkeys.identity;
+
+import java.util.Set;
+import java.util.HashSet;
+
+/**
+ * @author Steve Ebersole
+ */
+public class MyEntity {
+	private Long id;
+	private String name;
+	private MySibling sibling;
+	private Set nonInverseChildren = new HashSet();
+	private Set inverseChildren = new HashSet();
+
+	public MyEntity() {
+	}
+
+	public MyEntity(String name) {
+		this.name = name;
+	}
+
+	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 MySibling getSibling() {
+		return sibling;
+	}
+
+	public void setSibling(MySibling sibling) {
+		this.sibling = sibling;
+	}
+
+	public Set getNonInverseChildren() {
+		return nonInverseChildren;
+	}
+
+	public void setNonInverseChildren(Set nonInverseChildren) {
+		this.nonInverseChildren = nonInverseChildren;
+	}
+
+	public Set getInverseChildren() {
+		return inverseChildren;
+	}
+
+	public void setInverseChildren(Set inverseChildren) {
+		this.inverseChildren = inverseChildren;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/identity/MyEntity.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/identity/MySibling.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/identity/MySibling.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/identity/MySibling.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,41 @@
+package org.hibernate.test.generatedkeys.identity;
+
+/**
+ * @author Steve Ebersole
+ */
+public class MySibling {
+	private Long id;
+	private String name;
+	private MyEntity entity;
+
+	public MySibling() {
+	}
+
+	public MySibling(String name) {
+		this.name = name;
+	}
+
+	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 MyEntity getEntity() {
+		return entity;
+	}
+
+	public void setEntity(MyEntity entity) {
+		this.entity = entity;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/identity/MySibling.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/select/MyEntity.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/select/MyEntity.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/select/MyEntity.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.generatedkeys.select" default-access="field">
+
+    <class name="MyEntity" table="my_entity">
+
+    	<id name="id">
+    		<generator class="select"/>
+    	</id>
+        <natural-id>
+            <property name="name"/>
+        </natural-id>
+	</class>
+
+    <database-object>
+        <create>
+            <![CDATA[CREATE OR REPLACE TRIGGER t_i_my_entity
+            BEFORE INSERT ON my_entity
+            FOR EACH ROW
+            BEGIN
+                select nvl( max(id), 0 ) + 1
+                into :new.id
+                from my_entity;
+            END;]]>
+        </create>
+        <drop>
+            <![CDATA[DROP TRIGGER t_i_my_entity]]>
+        </drop>
+        <dialect-scope name="org.hibernate.dialect.Oracle9iDialect"/>
+        <dialect-scope name="org.hibernate.dialect.Oracle10gDialect"/>
+    </database-object>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/select/MyEntity.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/select/MyEntity.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/select/MyEntity.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/select/MyEntity.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,28 @@
+package org.hibernate.test.generatedkeys.select;
+
+/**
+ * @author <a href="mailto:steve at hibernate.org">Steve Ebersole </a>
+ */
+public class MyEntity {
+	private Long id;
+	private String name;
+
+	public MyEntity() {
+	}
+
+	public MyEntity(String name) {
+		this.name = name;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/select/MyEntity.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/select/SelectGeneratorTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/select/SelectGeneratorTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/select/SelectGeneratorTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,47 @@
+package org.hibernate.test.generatedkeys.select;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.dialect.Oracle9iDialect;
+import org.hibernate.testing.junit.functional.DatabaseSpecificFunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Steve Ebersole
+ */
+public class SelectGeneratorTest extends DatabaseSpecificFunctionalTestCase {
+	public SelectGeneratorTest(String x) {
+		super( x );
+	}
+
+	// TODO : need to determine appropriate physical generation strategies for select-generator testing on other databases...
+
+	public String[] getMappings() {
+		return new String[] { "generatedkeys/select/MyEntity.hbm.xml" };
+	}
+
+	public boolean appliesTo(Dialect dialect) {
+		return ( dialect instanceof Oracle9iDialect );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( SelectGeneratorTest.class );
+	}
+
+	public void testJDBC3GetGeneratedKeysSupportOnOracle() {
+		Session session = openSession();
+		session.beginTransaction();
+
+		MyEntity e = new MyEntity( "entity-1" );
+		session.save( e );
+
+		// this insert should happen immediately!
+		assertEquals( "id not generated through forced insertion", new Long(1), e.getId() );
+
+		session.delete( e );
+		session.getTransaction().commit();
+		session.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/select/SelectGeneratorTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/seqidentity/MyEntity.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/seqidentity/MyEntity.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/seqidentity/MyEntity.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.generatedkeys.seqidentity" default-access="field">
+
+    <class name="MyEntity" table="my_entity">
+
+    	<id name="id">
+    		<generator class="sequence-identity"/>
+    	</id>
+        <natural-id>
+            <property name="name"/>
+        </natural-id>
+	</class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/seqidentity/MyEntity.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/seqidentity/MyEntity.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/seqidentity/MyEntity.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/seqidentity/MyEntity.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,28 @@
+package org.hibernate.test.generatedkeys.seqidentity;
+
+/**
+ * @author <a href="mailto:steve at hibernate.org">Steve Ebersole </a>
+ */
+public class MyEntity {
+	private Long id;
+	private String name;
+
+	public MyEntity() {
+	}
+
+	public MyEntity(String name) {
+		this.name = name;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/seqidentity/MyEntity.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/seqidentity/SequenceIdentityTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/seqidentity/SequenceIdentityTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/seqidentity/SequenceIdentityTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,52 @@
+package org.hibernate.test.generatedkeys.seqidentity;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.dialect.Oracle9iDialect;
+import org.hibernate.testing.junit.functional.DatabaseSpecificFunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Steve Ebersole
+ */
+public class SequenceIdentityTest extends DatabaseSpecificFunctionalTestCase {
+	public SequenceIdentityTest(String x) {
+		super( x );
+	}
+
+	public void configure(Configuration cfg) {
+		super.configure( cfg );
+	}
+
+	public boolean appliesTo(Dialect dialect) {
+		// the DataDirect driver for Oracle known to not support
+		// JDBC3 getGeneratedKeys...
+		return ( dialect instanceof Oracle9iDialect );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "generatedkeys/seqidentity/MyEntity.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( SequenceIdentityTest.class );
+	}
+
+	public void testSequenceIdentityGenerator() {
+		Session session = openSession();
+		session.beginTransaction();
+
+		MyEntity e = new MyEntity( "entity-1" );
+		session.save( e );
+
+		// this insert should happen immediately!
+		assertNotNull( "id not generated through forced insertion", e.getId() );
+
+		session.delete( e );
+		session.getTransaction().commit();
+		session.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/generatedkeys/seqidentity/SequenceIdentityTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/ASTParserLoadingTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/ASTParserLoadingTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/ASTParserLoadingTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,2519 @@
+// $Id: ASTParserLoadingTest.java 11373 2007-03-29 19:09:07Z steve.ebersole at jboss.com $
+package org.hibernate.test.hql;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.sql.Date;
+import java.sql.Time;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.HibernateException;
+import org.hibernate.Query;
+import org.hibernate.QueryException;
+import org.hibernate.ScrollableResults;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.TypeMismatchException;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.dialect.DB2Dialect;
+import org.hibernate.dialect.HSQLDialect;
+import org.hibernate.dialect.IngresDialect;
+import org.hibernate.dialect.MySQLDialect;
+import org.hibernate.dialect.Oracle8iDialect;
+import org.hibernate.dialect.PostgreSQLDialect;
+import org.hibernate.dialect.SQLServerDialect;
+import org.hibernate.dialect.Sybase11Dialect;
+import org.hibernate.dialect.SybaseASE15Dialect;
+import org.hibernate.dialect.SybaseAnywhereDialect;
+import org.hibernate.dialect.SybaseDialect;
+import org.hibernate.hql.ast.ASTQueryTranslatorFactory;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.persister.entity.DiscriminatorType;
+import org.hibernate.stat.QueryStatistics;
+import org.hibernate.test.any.IntegerPropertyValue;
+import org.hibernate.test.any.PropertySet;
+import org.hibernate.test.any.PropertyValue;
+import org.hibernate.test.any.StringPropertyValue;
+import org.hibernate.test.cid.Customer;
+import org.hibernate.test.cid.LineItem;
+import org.hibernate.test.cid.Order;
+import org.hibernate.test.cid.Product;
+import org.hibernate.test.cid.LineItem.Id;
+import org.hibernate.transform.DistinctRootEntityResultTransformer;
+import org.hibernate.transform.Transformers;
+import org.hibernate.type.ComponentType;
+import org.hibernate.type.ManyToOneType;
+import org.hibernate.type.Type;
+import org.hibernate.util.StringHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Tests the integration of the new AST parser into the loading of query results using
+ * the Hibernate persisters and loaders.
+ * <p/>
+ * Also used to test the syntax of the resulting sql against the underlying
+ * database, specifically for functionality not supported by the classic
+ * parser.
+ *
+ * @author Steve
+ */
+public class ASTParserLoadingTest extends FunctionalTestCase {
+
+	private static final Logger log = LoggerFactory.getLogger( ASTParserLoadingTest.class );
+
+	private List createdAnimalIds = new ArrayList();
+
+	public ASTParserLoadingTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] {
+				"hql/Animal.hbm.xml",
+				"hql/FooBarCopy.hbm.xml",
+				"hql/SimpleEntityWithAssociation.hbm.xml",
+				"hql/CrazyIdFieldNames.hbm.xml",
+				"hql/Image.hbm.xml",
+				"hql/ComponentContainer.hbm.xml",
+				"hql/VariousKeywordPropertyEntity.hbm.xml",
+				"batchfetch/ProductLine.hbm.xml",
+				"cid/Customer.hbm.xml",
+				"cid/Order.hbm.xml",
+				"cid/LineItem.hbm.xml",
+				"cid/Product.hbm.xml",
+				"any/Properties.hbm.xml",
+				"legacy/Commento.hbm.xml",
+				"legacy/Marelo.hbm.xml"
+		};
+	}
+
+	public void configure(Configuration cfg) {
+		super.configure( cfg );
+		cfg.setProperty( Environment.USE_QUERY_CACHE, "true" );
+		cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
+		cfg.setProperty( Environment.QUERY_TRANSLATOR, ASTQueryTranslatorFactory.class.getName() );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( ASTParserLoadingTest.class );
+	}
+
+	public void testJpaTypeOperator() {
+		// just checking syntax here...
+		Session s = openSession();
+		s.beginTransaction();
+
+		///////////////////////////////////////////////////////////////
+		// where clause
+		// control
+		s.createQuery( "from Animal a where a.class = Dog" ).list();
+        // test
+		s.createQuery( "from Animal a where type(a) = Dog" ).list();
+
+		///////////////////////////////////////////////////////////////
+		// select clause (at some point we should unify these)
+		// control
+		Query query = s.createQuery( "select a.class from Animal a where a.class = Dog" );
+		query.list(); // checks syntax
+		assertEquals( 1, query.getReturnTypes().length );
+		assertEquals( Integer.class, query.getReturnTypes()[0].getReturnedClass() ); // always integer for joined
+        // test
+		query = s.createQuery( "select type(a) from Animal a where type(a) = Dog" );
+		query.list(); // checks syntax
+		assertEquals( 1, query.getReturnTypes().length );
+		assertEquals( DiscriminatorType.class, query.getReturnTypes()[0].getClass() );
+		assertEquals( Class.class, query.getReturnTypes()[0].getReturnedClass() );
+
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testComponentJoins() {
+		Session s = openSession();
+		s.beginTransaction();
+		ComponentContainer root = new ComponentContainer(
+				new ComponentContainer.Address(
+						"123 Main",
+						"Anywhere",
+						"USA",
+						new ComponentContainer.Address.Zip( 12345, 6789 )
+				)
+		);
+		s.save( root );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		List result = s.createQuery( "select a from ComponentContainer c join c.address a" ).list();
+		assertEquals( 1, result.size() );
+		assertTrue( ComponentContainer.Address.class.isInstance( result.get( 0 ) ) );
+
+		result = s.createQuery( "select a.zip from ComponentContainer c join c.address a" ).list();
+		assertEquals( 1, result.size() );
+		assertTrue( ComponentContainer.Address.Zip.class.isInstance( result.get( 0 ) ) );
+
+		result = s.createQuery( "select z from ComponentContainer c join c.address a join a.zip z" ).list();
+		assertEquals( 1, result.size() );
+		assertTrue( ComponentContainer.Address.Zip.class.isInstance( result.get( 0 ) ) );
+
+		result = s.createQuery( "select z.code from ComponentContainer c join c.address a join a.zip z" ).list();
+		assertEquals( 1, result.size() );
+		assertTrue( Integer.class.isInstance( result.get( 0 ) ) );
+		s.delete( root );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testJPAQLQualifiedIdentificationVariablesControl() {
+		// just checking syntax here...
+		Session s = openSession();
+		s.beginTransaction();
+		s.createQuery( "from VariousKeywordPropertyEntity where type = 'something'" ).list();
+		s.createQuery( "from VariousKeywordPropertyEntity where value = 'something'" ).list();
+		s.createQuery( "from VariousKeywordPropertyEntity where key = 'something'" ).list();
+		s.createQuery( "from VariousKeywordPropertyEntity where entry = 'something'" ).list();
+
+		s.createQuery( "from VariousKeywordPropertyEntity e where e.type = 'something'" ).list();
+		s.createQuery( "from VariousKeywordPropertyEntity e where e.value = 'something'" ).list();
+		s.createQuery( "from VariousKeywordPropertyEntity e where e.key = 'something'" ).list();
+		s.createQuery( "from VariousKeywordPropertyEntity e where e.entry = 'something'" ).list();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testJPAQLQualifiedIdentificationVariables() {
+		Session s = openSession();
+		s.beginTransaction();
+		Human me = new Human();
+		me.setName( new Name( "Steve", null, "Ebersole" ) );
+		Human joe = new Human();
+		me.setName( new Name( "Joe", null, "Ebersole" ) );
+		me.setFamily( new HashMap() );
+		me.getFamily().put( "son", joe );
+		s.save( me );
+		s.save( joe );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		List results = s.createQuery( "select entry(h.family) from Human h" ).list();
+		assertEquals( 1, results.size() );
+		Object result = results.get(0);
+		assertTrue( Map.Entry.class.isAssignableFrom( result.getClass() ) );
+		Map.Entry entry = (Map.Entry) result;
+		assertTrue( String.class.isAssignableFrom( entry.getKey().getClass() ) );
+		assertTrue( Human.class.isAssignableFrom( entry.getValue().getClass() ) );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		results = s.createQuery( "select distinct key(h.family) from Human h" ).list();
+		assertEquals( 1, results.size() );
+		Object key = results.get(0);
+		assertTrue( String.class.isAssignableFrom( key.getClass() ) );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.delete( me );
+		s.delete( joe );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testPaginationWithPolymorphicQuery() {
+		if ( getDialect() instanceof IngresDialect ) {
+			// HHH-4961 Ingres does not support this scoping in 9.3.
+			return;
+		}
+		Session s = openSession();
+		s.beginTransaction();
+		Human h = new Human();
+		h.setName( new Name( "Steve", null, "Ebersole" ) );
+		s.save( h );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		List results = s.createQuery( "from java.lang.Object" ).setMaxResults( 2 ).list();
+		assertEquals( 1, results.size() );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.delete( h );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testComponentNullnessChecks() {
+		Session s = openSession();
+		s.beginTransaction();
+		Human h = new Human();
+		h.setName( new Name( "Johnny", 'B', "Goode" ) );
+		s.save( h );
+		h = new Human();
+		h.setName( new Name( "Steve", null, "Ebersole" ) );
+		s.save( h );
+		h = new Human();
+		h.setName( new Name( "Bono", null, null ) );
+		s.save( h );
+		h = new Human();
+		h.setName( new Name( null, null, null ) );
+		s.save( h );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		List results = s.createQuery( "from Human where name is null" ).list();
+		assertEquals( 1, results.size() );
+		results = s.createQuery( "from Human where name is not null" ).list();
+		assertEquals( 3, results.size() );
+		String query =
+				getDialect() instanceof DB2Dialect ?
+						"from Human where cast(? as string) is null" :
+						"from Human where ? is null"
+				;
+		s.createQuery( query ).setParameter( 0, null ).list();
+
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.createQuery( "delete Human" ).executeUpdate();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testInvalidCollectionDereferencesFail() {
+		Session s = openSession();
+		s.beginTransaction();
+
+		// control group...
+		s.createQuery( "from Animal a join a.offspring o where o.description = 'xyz'" ).list();
+		s.createQuery( "from Animal a join a.offspring o where o.father.description = 'xyz'" ).list();
+		s.createQuery( "from Animal a join a.offspring o order by o.description" ).list();
+		s.createQuery( "from Animal a join a.offspring o order by o.father.description" ).list();
+
+		try {
+			s.createQuery( "from Animal a where a.offspring.description = 'xyz'" ).list();
+			fail( "illegal collection dereference semantic did not cause failure" );
+		}
+		catch( QueryException qe ) {
+			log.trace( "expected failure...", qe );
+		}
+
+		try {
+			s.createQuery( "from Animal a where a.offspring.father.description = 'xyz'" ).list();
+			fail( "illegal collection dereference semantic did not cause failure" );
+		}
+		catch( QueryException qe ) {
+			log.trace( "expected failure...", qe );
+		}
+
+		try {
+			s.createQuery( "from Animal a order by a.offspring.description" ).list();
+			fail( "illegal collection dereference semantic did not cause failure" );
+		}
+		catch( QueryException qe ) {
+			log.trace( "expected failure...", qe );
+		}
+
+		try {
+			s.createQuery( "from Animal a order by a.offspring.father.description" ).list();
+			fail( "illegal collection dereference semantic did not cause failure" );
+		}
+		catch( QueryException qe ) {
+			log.trace( "expected failure...", qe );
+		}
+
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	/**
+	 * Copied from {@link HQLTest#testConcatenation}
+	 */
+	public void testConcatenation() {
+		// simple syntax checking...
+		Session s = openSession();
+		s.beginTransaction();
+		s.createQuery( "from Human h where h.nickName = '1' || 'ov' || 'tha' || 'few'" ).list();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	/**
+	 * Copied from {@link HQLTest#testExpressionWithParamInFunction}
+	 */
+	public void testExpressionWithParamInFunction() {
+		Session s = openSession();
+		s.beginTransaction();
+		s.createQuery( "from Animal a where abs(a.bodyWeight-:param) < 2.0" ).setLong( "param", 1 ).list();
+		s.createQuery( "from Animal a where abs(:param - a.bodyWeight) < 2.0" ).setLong( "param", 1 ).list();
+		if ( ( getDialect() instanceof HSQLDialect ) || ( getDialect() instanceof DB2Dialect ) ) {
+			// HSQLDB and DB2 don't like the abs(? - ?) syntax. bit work if at least one parameter is typed...
+			s.createQuery( "from Animal where abs(cast(:x as long) - :y) < 2.0" ).setLong( "x", 1 ).setLong( "y", 1 ).list();
+			s.createQuery( "from Animal where abs(:x - cast(:y as long)) < 2.0" ).setLong( "x", 1 ).setLong( "y", 1 ).list();
+			s.createQuery( "from Animal where abs(cast(:x as long) - cast(:y as long)) < 2.0" ).setLong( "x", 1 ).setLong( "y", 1 ).list();			
+		} 
+		else {
+			s.createQuery( "from Animal where abs(:x - :y) < 2.0" ).setLong( "x", 1 ).setLong( "y", 1 ).list();
+		}
+
+		if ( getDialect() instanceof DB2Dialect ) {
+			s.createQuery( "from Animal where lower(upper(cast(:foo as string))) like 'f%'" ).setString( "foo", "foo" ).list();			
+		}
+		else {
+			s.createQuery( "from Animal where lower(upper(:foo)) like 'f%'" ).setString( "foo", "foo" ).list();
+		}
+		s.createQuery( "from Animal a where abs(abs(a.bodyWeight - 1.0 + :param) * abs(length('ffobar')-3)) = 3.0" ).setLong( "param", 1 ).list();
+		if ( getDialect() instanceof DB2Dialect ) {
+			s.createQuery( "from Animal where lower(upper('foo') || upper(cast(:bar as string))) like 'f%'" ).setString( "bar", "xyz" ).list();			
+		}
+		else {
+			s.createQuery( "from Animal where lower(upper('foo') || upper(:bar)) like 'f%'" ).setString( "bar", "xyz" ).list();
+		}
+		if ( ! ( getDialect() instanceof PostgreSQLDialect || getDialect() instanceof MySQLDialect ) ) {
+			s.createQuery( "from Animal where abs(cast(1 as float) - cast(:param as float)) = 1.0" ).setLong( "param", 1 ).list();
+		}
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testCrazyIdFieldNames() {
+		MoreCrazyIdFieldNameStuffEntity top = new MoreCrazyIdFieldNameStuffEntity( "top" );
+		HeresAnotherCrazyIdFieldName next = new HeresAnotherCrazyIdFieldName( "next" );
+		top.setHeresAnotherCrazyIdFieldName( next );
+		MoreCrazyIdFieldNameStuffEntity other = new MoreCrazyIdFieldNameStuffEntity( "other" );
+		Session s = openSession();
+		s.beginTransaction();
+		s.save( next );
+		s.save( top );
+		s.save( other );
+		s.flush();
+
+		List results = s.createQuery( "select e.heresAnotherCrazyIdFieldName from MoreCrazyIdFieldNameStuffEntity e where e.heresAnotherCrazyIdFieldName is not null" ).list();
+		assertEquals( 1, results.size() );
+		Object result = results.get( 0 );
+		assertClassAssignability( HeresAnotherCrazyIdFieldName.class, result.getClass() );
+		assertSame( next, result );
+
+		results = s.createQuery( "select e.heresAnotherCrazyIdFieldName.heresAnotherCrazyIdFieldName from MoreCrazyIdFieldNameStuffEntity e where e.heresAnotherCrazyIdFieldName is not null" ).list();
+		assertEquals( 1, results.size() );
+		result = results.get( 0 );
+		assertClassAssignability( Long.class, result.getClass() );
+		assertEquals( next.getHeresAnotherCrazyIdFieldName(), result );
+
+		results = s.createQuery( "select e.heresAnotherCrazyIdFieldName from MoreCrazyIdFieldNameStuffEntity e" ).list();
+		assertEquals( 1, results.size() );
+		Iterator itr = s.createQuery( "select e.heresAnotherCrazyIdFieldName from MoreCrazyIdFieldNameStuffEntity e" ).iterate();
+		assertTrue( itr.hasNext() ); itr.next(); assertFalse( itr.hasNext() );
+
+		s.delete( top );
+		s.delete( next );
+		s.delete( other );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testImplicitJoinsInDifferentClauses() {
+		// HHH-2257 :
+		// both the classic and ast translators output the same syntactically valid sql
+		// for all of these cases; the issue is that shallow (iterate) and
+		// non-shallow (list/scroll) queries return different results because the
+		// shallow skips the inner join which "weeds out" results from the non-shallow queries.
+		// The results were initially different depending upon the clause(s) in which the
+		// implicit join occurred
+		Session s = openSession();
+		s.beginTransaction();
+		SimpleEntityWithAssociation owner = new SimpleEntityWithAssociation( "owner" );
+		SimpleAssociatedEntity e1 = new SimpleAssociatedEntity( "thing one", owner );
+		SimpleAssociatedEntity e2 = new SimpleAssociatedEntity( "thing two" );
+		s.save( e1 );
+		s.save( e2 );
+		s.save( owner );
+		s.getTransaction().commit();
+		s.close();
+
+		checkCounts( "select e.owner from SimpleAssociatedEntity e", 1, "implicit-join in select clause" );
+		checkCounts( "select e.id, e.owner from SimpleAssociatedEntity e", 1, "implicit-join in select clause" );
+
+		// resolved to a "id short cut" when part of the order by clause -> no inner join = no weeding out...
+		checkCounts( "from SimpleAssociatedEntity e order by e.owner", 2, "implicit-join in order-by clause" );
+		// resolved to a "id short cut" when part of the group by clause -> no inner join = no weeding out...
+		checkCounts( "select e.owner.id, count(*) from SimpleAssociatedEntity e group by e.owner", 2, "implicit-join in select and group-by clauses" );
+
+	 	s = openSession();
+		s.beginTransaction();
+		s.delete( e1 );
+		s.delete( e2 );
+		s.delete( owner );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testRowValueConstructorSyntaxInInList() {
+		Session s = openSession();
+		s.beginTransaction();
+		Product product = new Product();
+		product.setDescription( "My Product" );
+		product.setNumberAvailable( 10 );
+		product.setPrice( new BigDecimal( 123 ) );
+		product.setProductId( "4321" );
+		s.save( product );
+		
+
+		Customer customer = new Customer();
+		customer.setCustomerId( "123456789" );
+		customer.setName( "My customer" );
+		customer.setAddress( "somewhere" );
+		s.save( customer );
+
+		Order order = customer.generateNewOrder( new BigDecimal( 1234 ) );
+		s.save( order );
+
+		LineItem li = order.generateLineItem( product, 5 );
+		s.save( li );
+		product = new Product();
+		product.setDescription( "My Product" );
+		product.setNumberAvailable( 10 );
+		product.setPrice( new BigDecimal( 123 ) );
+		product.setProductId( "1234" );
+		s.save( product );
+		li = order.generateLineItem( product, 10 );
+		s.save( li );
+
+		s.flush();
+		Query query = s.createQuery( "from LineItem l where l.id in (:idList)" );
+		List list = new ArrayList();
+		list.add( new Id("123456789", order.getId().getOrderNumber(), "4321") );
+		list.add( new Id("123456789", order.getId().getOrderNumber(), "1234") );
+		query.setParameterList( "idList", list );
+		assertEquals( 2, query.list().size() );
+		s.getTransaction().rollback();
+		s.close();
+		
+	}
+	private void checkCounts(String hql, int expected, String testCondition) {
+		Session s = openSession();
+		s.beginTransaction();
+		int count = determineCount( s.createQuery( hql ).list().iterator() );
+		assertEquals( "list() [" + testCondition + "]", expected, count );
+		count = determineCount( s.createQuery( hql ).iterate() );
+		assertEquals( "iterate() [" + testCondition + "]", expected, count );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testImplicitSelectEntityAssociationInShallowQuery() {
+		// HHH-2257 :
+		// both the classic and ast translators output the same syntactically valid sql.
+		// the issue is that shallow and non-shallow queries return different
+		// results because the shallow skips the inner join which "weeds out" results
+		// from the non-shallow queries...
+		Session s = openSession();
+		s.beginTransaction();
+		SimpleEntityWithAssociation owner = new SimpleEntityWithAssociation( "owner" );
+		SimpleAssociatedEntity e1 = new SimpleAssociatedEntity( "thing one", owner );
+		SimpleAssociatedEntity e2 = new SimpleAssociatedEntity( "thing two" );
+		s.save( e1 );
+		s.save( e2 );
+		s.save( owner );
+		s.getTransaction().commit();
+		s.close();
+
+	 	s = openSession();
+		s.beginTransaction();
+		int count = determineCount( s.createQuery( "select e.id, e.owner from SimpleAssociatedEntity e" ).list().iterator() );
+		assertEquals( 1, count ); // thing two would be removed from the result due to the inner join
+		count = determineCount( s.createQuery( "select e.id, e.owner from SimpleAssociatedEntity e" ).iterate() );
+		assertEquals( 1, count );
+		s.getTransaction().commit();
+		s.close();
+
+	 	s = openSession();
+		s.beginTransaction();
+		s.delete( e1 );
+		s.delete( e2 );
+		s.delete( owner );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	private int determineCount(Iterator iterator) {
+		int count = 0;
+		while( iterator.hasNext() ) {
+			count++;
+			iterator.next();
+		}
+		return count;
+	}
+
+	public void testEntityAndOneToOneReturnedByQuery() {
+		Session s = openSession();
+		s.beginTransaction();
+		Human h = new Human();
+		h.setName( new Name( "Gail", null, "Badner" ) );
+		s.save( h );
+		User u = new User();
+		u.setUserName(  "gbadner" );
+		u.setHuman( h );
+		s.save( u );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		Object [] result = ( Object [] ) s.createQuery( "from User u, Human h where u.human = h" ).uniqueResult();
+		assertNotNull( result );
+		assertEquals( u.getUserName(), ( ( User ) result[ 0 ] ).getUserName() );
+		assertEquals( h.getName().getFirst(), ( ( Human ) result[ 1 ] ).getName().getFirst() );
+		assertSame( ( ( User ) result[ 0 ] ).getHuman(), result[ 1 ] );
+		s.createQuery( "delete User" ).executeUpdate();
+		s.createQuery( "delete Human" ).executeUpdate();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testNestedComponentIsNull() {
+		// (1) From MapTest originally...
+		// (2) Was then moved into HQLTest...
+		// (3) However, a bug fix to EntityType#getIdentifierOrUniqueKeyType (HHH-2138)
+		// 		caused the classic parser to suddenly start throwing exceptions on
+		//		this query, apparently relying on the buggy behavior somehow; thus
+		//		moved here to at least get some syntax checking...
+		//
+		// fyi... found and fixed the problem in the classic parser; still
+		// leaving here for syntax checking
+		new SyntaxChecker( "from Commento c where c.marelo.commento.mcompr is null" ).checkAll();
+	}
+
+	public void testSpecialClassPropertyReference() {
+		// this is a long standing bug in Hibernate when applied to joined-subclasses;
+		//  see HHH-939 for details and history
+		new SyntaxChecker( "from Zoo zoo where zoo.class = PettingZoo" ).checkAll();
+		new SyntaxChecker( "select a.description from Animal a where a.class = Mammal" ).checkAll();
+		new SyntaxChecker( "select a.class from Animal a" ).checkAll();
+		new SyntaxChecker( "from DomesticAnimal an where an.class = Dog" ).checkAll();
+		new SyntaxChecker( "from Animal an where an.class = Dog" ).checkAll();
+	}
+
+	public void testSpecialClassPropertyReferenceFQN() {
+		// tests relating to HHH-2376
+		new SyntaxChecker( "from Zoo zoo where zoo.class = org.hibernate.test.hql.PettingZoo" ).checkAll();
+		new SyntaxChecker( "select a.description from Animal a where a.class = org.hibernate.test.hql.Mammal" ).checkAll();
+		new SyntaxChecker( "from DomesticAnimal an where an.class = org.hibernate.test.hql.Dog" ).checkAll();
+		new SyntaxChecker( "from Animal an where an.class = org.hibernate.test.hql.Dog" ).checkAll();
+	}
+
+	public void testSubclassOrSuperclassPropertyReferenceInJoinedSubclass() {
+		// this is a long standing bug in Hibernate; see HHH-1631 for details and history
+		//
+		// (1) pregnant is defined as a property of the class (Mammal) itself
+		// (2) description is defined as a property of the superclass (Animal)
+		// (3) name is defined as a property of a particular subclass (Human)
+
+		new SyntaxChecker( "from Zoo z join z.mammals as m where m.name.first = 'John'" ).checkIterate();
+
+		new SyntaxChecker( "from Zoo z join z.mammals as m where m.pregnant = false" ).checkAll();
+		new SyntaxChecker( "select m.pregnant from Zoo z join z.mammals as m where m.pregnant = false" ).checkAll();
+
+		new SyntaxChecker( "from Zoo z join z.mammals as m where m.description = 'tabby'" ).checkAll();
+		new SyntaxChecker( "select m.description from Zoo z join z.mammals as m where m.description = 'tabby'" ).checkAll();
+
+		new SyntaxChecker( "from Zoo z join z.mammals as m where m.name.first = 'John'" ).checkAll();
+		new SyntaxChecker( "select m.name from Zoo z join z.mammals as m where m.name.first = 'John'" ).checkAll();
+
+		new SyntaxChecker( "select m.pregnant from Zoo z join z.mammals as m" ).checkAll();
+		new SyntaxChecker( "select m.description from Zoo z join z.mammals as m" ).checkAll();
+		new SyntaxChecker( "select m.name from Zoo z join z.mammals as m" ).checkAll();
+
+		new SyntaxChecker( "from DomesticAnimal da join da.owner as o where o.nickName = 'Gavin'" ).checkAll();
+		new SyntaxChecker( "select da.father from DomesticAnimal da join da.owner as o where o.nickName = 'Gavin'" ).checkAll();
+	}
+
+	public void testSimpleSelectWithLimitAndOffset() throws Exception {
+		if ( ! ( getDialect().supportsLimit() && getDialect().supportsLimitOffset() ) ) {
+			reportSkip( "dialect does not support offset and limit combo", "limit and offset combination" );
+			return;
+		}
+
+		// just checking correctness of param binding code...
+		Session session = openSession();
+		session.createQuery( "from Animal" )
+				.setFirstResult( 2 )
+				.setMaxResults( 1 )
+				.list();
+		session.close();
+	}
+
+	public void testJPAPositionalParameterList() {
+		Session s = openSession();
+		s.beginTransaction();
+		ArrayList params = new ArrayList();
+		params.add( "Doe" );
+		params.add( "Public" );
+		s.createQuery( "from Human where name.last in (?1)" )
+				.setParameterList( "1", params )
+				.list();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testComponentQueries() {
+		Session s = openSession();
+		s.beginTransaction();
+
+		Type[] types = s.createQuery( "select h.name from Human h" ).getReturnTypes();
+		assertEquals( 1, types.length );
+		assertTrue( types[0] instanceof ComponentType );
+
+		// Test the ability to perform comparisions between component values
+		s.createQuery( "from Human h where h.name = h.name" ).list();
+		s.createQuery( "from Human h where h.name = :name" ).setParameter( "name", new Name() ).list();
+		s.createQuery( "from Human where name = :name" ).setParameter( "name", new Name() ).list();
+		s.createQuery( "from Human h where :name = h.name" ).setParameter( "name", new Name() ).list();
+		s.createQuery( "from Human h where :name <> h.name" ).setParameter( "name", new Name() ).list();
+
+		// Test the ability to perform comparisions between a component and an explicit row-value
+		s.createQuery( "from Human h where h.name = ('John', 'X', 'Doe')" ).list();
+		s.createQuery( "from Human h where ('John', 'X', 'Doe') = h.name" ).list();
+		s.createQuery( "from Human h where ('John', 'X', 'Doe') <> h.name" ).list();
+		s.createQuery( "from Human h where ('John', 'X', 'Doe') >= h.name" ).list();
+
+		s.createQuery( "from Human h order by h.name" ).list();
+
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testComponentParameterBinding() {
+		if ( getDialect() instanceof IngresDialect ) {
+			// HHH-4970 Subselects are not supported within select target lists
+			// in Ingres
+			return;
+		}
+		// HHH-1774 : parameters are bound incorrectly with component parameters...
+		Session s = openSession();
+		s.beginTransaction();
+
+		Order.Id oId = new Order.Id( "1234", 1 );
+
+		// control
+		s.createQuery("from Order o where o.customer.name =:name and o.id = :id")
+				.setParameter( "name", "oracle" )
+				.setParameter( "id", oId )
+				.list();
+
+		// this is the form that caused problems in the original case...
+		s.createQuery("from Order o where o.id = :id and o.customer.name =:name ")
+				.setParameter( "id", oId )
+				.setParameter( "name", "oracle" )
+				.list();
+
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testAnyMappingReference() {
+		Session s = openSession();
+		s.beginTransaction();
+
+		PropertyValue redValue = new StringPropertyValue( "red" );
+		PropertyValue lonliestNumberValue = new IntegerPropertyValue( 1 );
+
+		Long id;
+		PropertySet ps = new PropertySet( "my properties" );
+		ps.setSomeSpecificProperty( redValue );
+		ps.getGeneralProperties().put( "the lonliest number", lonliestNumberValue );
+		ps.getGeneralProperties().put( "i like", new StringPropertyValue( "pina coladas" ) );
+		ps.getGeneralProperties().put( "i also like", new StringPropertyValue( "getting caught in the rain" ) );
+		s.save( ps );
+
+		s.getTransaction().commit();
+		id = ps.getId();
+		s.clear();
+		s.beginTransaction();
+
+		// TODO : setEntity() currently will not work here, but that would be *very* nice
+		// does not work because the corresponding EntityType is then used as the "bind type" rather
+		// than the "discovered" AnyType...
+		s.createQuery( "from PropertySet p where p.someSpecificProperty = :ssp" ).setParameter( "ssp", redValue ).list();
+
+		s.createQuery( "from PropertySet p where p.someSpecificProperty.id is not null" ).list();
+
+		s.createQuery( "from PropertySet p join p.generalProperties gp where gp.id is not null" ).list();
+
+		s.delete( s.load( PropertySet.class, id ) );
+
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testJdkEnumStyleEnumConstant() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+
+		s.createQuery( "from Zoo z where z.classification = org.hibernate.test.hql.Classification.LAME" ).list();
+
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testParameterTypeMismatchFailureExpected() {
+		Session s = openSession();
+		s.beginTransaction();
+
+		Query query = s.createQuery( "from Animal a where a.description = :nonstring" )
+				.setParameter( "nonstring", new Integer(1) );
+		try {
+			query.list();
+			fail( "query execution should have failed" );
+		}
+		catch( TypeMismatchException tme ) {
+			// expected behavior
+		}
+
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testMultipleBagFetchesFail() {
+		Session s = openSession();
+		s.beginTransaction();
+		try {
+			s.createQuery( "from Human h join fetch h.friends f join fetch f.friends fof" ).list();
+			fail( "failure expected" );
+		}
+		catch( HibernateException e ) {
+			assertTrue( "unexpected failure reason : " + e, e.getMessage().indexOf( "multiple bags" ) > 0 );
+		}
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testCollectionJoinsInSubselect() {
+		// HHH-1248 : initially FromElementFactory treated any explicit join
+		// as an implied join so that theta-style joins would always be used.
+		// This was because correlated subqueries cannot use ANSI-style joins
+		// for the correlation.  However, this special treatment was not limited
+		// to only correlated subqueries; it was applied to any subqueries ->
+		// which in-and-of-itself is not necessarily bad.  But somewhere later
+		// the choices made there caused joins to be dropped.
+		Session s = openSession();
+		String qryString =
+				"select a.id, a.description" +
+				" from Animal a" +
+				"       left join a.offspring" +
+				" where a in (" +
+				"       select a1 from Animal a1" +
+				"           left join a1.offspring o" +
+				"       where a1.id=1" +
+		        ")";
+		s.createQuery( qryString ).list();
+		qryString =
+				"select h.id, h.description" +
+		        " from Human h" +
+				"      left join h.friends" +
+				" where h in (" +
+				"      select h1" +
+				"      from Human h1" +
+				"          left join h1.friends f" +
+				"      where h1.id=1" +
+				")";
+		s.createQuery( qryString ).list();
+		qryString =
+				"select h.id, h.description" +
+		        " from Human h" +
+				"      left join h.friends f" +
+				" where f in (" +
+				"      select h1" +
+				"      from Human h1" +
+				"          left join h1.friends f1" +
+				"      where h = f1" +
+				")";
+		s.createQuery( qryString ).list();
+		s.close();
+	}
+
+	public void testCollectionFetchWithDistinctionAndLimit() {
+		// create some test data...
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		int parentCount = 30;
+		for ( int i = 0; i < parentCount; i++ ) {
+			Animal child1 = new Animal();
+			child1.setDescription( "collection fetch distinction (child1 - parent" + i + ")" );
+			s.persist( child1 );
+			Animal child2 = new Animal();
+			child2.setDescription( "collection fetch distinction (child2 - parent " + i + ")" );
+			s.persist( child2 );
+			Animal parent = new Animal();
+			parent.setDescription( "collection fetch distinction (parent" + i + ")" );
+			parent.setSerialNumber( "123-" + i );
+			parent.addOffspring( child1 );
+			parent.addOffspring( child2 );
+			s.persist( parent );
+		}
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		// Test simple distinction
+		List results;
+		results = s.createQuery( "select distinct p from Animal p inner join fetch p.offspring" ).list();
+		assertEquals( "duplicate list() returns", 30, results.size() );
+		// Test first/max
+		results = s.createQuery( "select p from Animal p inner join fetch p.offspring order by p.id" )
+				.setFirstResult( 5 )
+				.setMaxResults( 20 )
+				.list();
+		assertEquals( "duplicate returns", 20, results.size() );
+		Animal firstReturn = ( Animal ) results.get( 0 );
+		assertEquals( "firstResult not applied correctly", "123-5", firstReturn.getSerialNumber() );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery( "delete Animal where mother is not null" ).executeUpdate();
+		s.createQuery( "delete Animal" ).executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	public void testFetchInSubqueryFails() {
+		Session s = openSession();
+		try {
+			s.createQuery( "from Animal a where a.mother in (select m from Animal a1 inner join a1.mother as m join fetch m.mother)" ).list();
+			fail( "fetch join allowed in subquery" );
+		}
+		catch( QueryException expected ) {
+			// expected behavior
+		}
+		s.close();
+	}
+
+	public void testQueryMetadataRetrievalWithFetching() {
+		// HHH-1464 : there was a problem due to the fact they we polled
+		// the shallow version of the query plan to get the metadata.
+		Session s = openSession();
+		Query query = s.createQuery( "from Animal a inner join fetch a.mother" );
+		assertEquals( 1, query.getReturnTypes().length );
+		assertNull( query.getReturnAliases() );
+		s.close();
+	}
+
+	public void testSuperclassPropertyReferenceAfterCollectionIndexedAccess() {
+		// note: simply performing syntax checking in the db
+		// test for HHH-429
+		Session s = openSession();
+		s.beginTransaction();
+		Mammal tiger = new Mammal();
+		tiger.setDescription( "Tiger" );
+		s.persist( tiger );
+		Mammal mother = new Mammal();
+		mother.setDescription( "Tiger's mother" );
+		mother.setBodyWeight( 4.0f );
+		mother.addOffspring( tiger );
+		s.persist( mother );
+		Zoo zoo = new Zoo();
+		zoo.setName( "Austin Zoo" );
+		zoo.setMammals( new HashMap() );
+		zoo.getMammals().put( "tiger", tiger );
+		s.persist( zoo );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		List results = s.createQuery( "from Zoo zoo where zoo.mammals['tiger'].mother.bodyWeight > 3.0f" ).list();
+		assertEquals( 1, results.size() );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.delete( tiger );
+		s.delete( mother );
+		s.delete( zoo );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testJoinFetchCollectionOfValues() {
+		// note: simply performing syntax checking in the db
+		Session s = openSession();
+		s.beginTransaction();
+		s.createQuery( "select h from Human as h join fetch h.nickNames" ).list();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testIntegerLiterals() {
+		// note: simply performing syntax checking in the db
+		Session s = openSession();
+		s.beginTransaction();
+		s.createQuery( "from Foo where long = 1" ).list();
+		s.createQuery( "from Foo where long = " + Integer.MIN_VALUE ).list();
+		s.createQuery( "from Foo where long = " + Integer.MAX_VALUE ).list();
+		s.createQuery( "from Foo where long = 1L" ).list();
+		s.createQuery( "from Foo where long = " + (Long.MIN_VALUE + 1) + "L" ).list();
+		s.createQuery( "from Foo where long = " + Long.MAX_VALUE + "L" ).list();
+		s.createQuery( "from Foo where integer = " + (Long.MIN_VALUE + 1) ).list();
+// currently fails due to HHH-1387
+//		s.createQuery( "from Foo where long = " + Long.MIN_VALUE ).list();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testDecimalLiterals() {
+		// note: simply performing syntax checking in the db
+		Session s = openSession();
+		s.beginTransaction();
+		s.createQuery( "from Animal where bodyWeight > 100.0e-10" ).list();
+		s.createQuery( "from Animal where bodyWeight > 100.0E-10" ).list();
+		s.createQuery( "from Animal where bodyWeight > 100.001f" ).list();
+		s.createQuery( "from Animal where bodyWeight > 100.001F" ).list();
+		s.createQuery( "from Animal where bodyWeight > 100.001d" ).list();
+		s.createQuery( "from Animal where bodyWeight > 100.001D" ).list();
+		s.createQuery( "from Animal where bodyWeight > .001f" ).list();
+		s.createQuery( "from Animal where bodyWeight > 100e-10" ).list();
+		s.createQuery( "from Animal where bodyWeight > .01E-10" ).list();
+		s.createQuery( "from Animal where bodyWeight > 1e-38" ).list();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testNakedPropertyRef() {
+		// note: simply performing syntax and column/table resolution checking in the db
+		Session s = openSession();
+		s.beginTransaction();
+		s.createQuery( "from Animal where bodyWeight = bodyWeight" ).list();
+		s.createQuery( "select bodyWeight from Animal" ).list();
+		s.createQuery( "select max(bodyWeight) from Animal" ).list();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testNakedComponentPropertyRef() {
+		// note: simply performing syntax and column/table resolution checking in the db
+		Session s = openSession();
+		s.beginTransaction();
+		s.createQuery( "from Human where name.first = 'Gavin'" ).list();
+		s.createQuery( "select name from Human" ).list();
+		s.createQuery( "select upper(h.name.first) from Human as h" ).list();
+		s.createQuery( "select upper(name.first) from Human" ).list();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testNakedImplicitJoins() {
+		// note: simply performing syntax and column/table resolution checking in the db
+		Session s = openSession();
+		s.beginTransaction();
+		s.createQuery( "from Animal where mother.father.id = 1" ).list();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testNakedEntityAssociationReference() {
+		// note: simply performing syntax and column/table resolution checking in the db
+		Session s = openSession();
+		s.beginTransaction();
+		s.createQuery( "from Animal where mother = :mother" ).setParameter( "mother", null ).list();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testNakedMapIndex() throws Exception {
+		// note: simply performing syntax and column/table resolution checking in the db
+		Session s = openSession();
+		s.beginTransaction();
+		s.createQuery( "from Zoo where mammals['dog'].description like '%black%'" ).list();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testInvalidFetchSemantics() {
+		Session s = openSession();
+		s.beginTransaction();
+
+		try {
+			s.createQuery( "select mother from Human a left join fetch a.mother mother" ).list();
+			fail( "invalid fetch semantic allowed!" );
+		}
+		catch( QueryException e ) {
+		}
+
+		try {
+			s.createQuery( "select mother from Human a left join fetch a.mother mother" ).list();
+			fail( "invalid fetch semantic allowed!" );
+		}
+		catch( QueryException e ) {
+		}
+
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testArithmetic() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Zoo zoo = new Zoo();
+		zoo.setName("Melbourne Zoo");
+		s.persist(zoo);
+		s.createQuery("select 2*2*2*2*(2*2) from Zoo").uniqueResult();
+		s.createQuery("select 2 / (1+1) from Zoo").uniqueResult();
+		int result0 = ( (Integer) s.createQuery("select 2 - (1+1) from Zoo").uniqueResult() ).intValue();
+		int result1 = ( (Integer) s.createQuery("select 2 - 1 + 1 from Zoo").uniqueResult() ).intValue();
+		int result2 = ( (Integer) s.createQuery("select 2 * (1-1) from Zoo").uniqueResult() ).intValue();
+		int result3 = ( (Integer) s.createQuery("select 4 / (2 * 2) from Zoo").uniqueResult() ).intValue();
+		int result4 = ( (Integer) s.createQuery("select 4 / 2 * 2 from Zoo").uniqueResult() ).intValue();
+		int result5 = ( (Integer) s.createQuery("select 2 * (2/2) from Zoo").uniqueResult() ).intValue();
+		int result6 = ( (Integer) s.createQuery("select 2 * (2/2+1) from Zoo").uniqueResult() ).intValue();
+		assertEquals(result0, 0);
+		assertEquals(result1, 2);
+		assertEquals(result2, 0);
+		assertEquals(result3, 1);
+		assertEquals(result4, 4);
+		assertEquals(result5, 2);
+		assertEquals(result6, 4);
+		s.delete(zoo);
+		t.commit();
+		s.close();
+	}
+
+	public void testNestedCollectionFetch() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.createQuery("from Animal a left join fetch a.offspring o left join fetch o.offspring where a.mother.id = 1 order by a.description").list();
+		s.createQuery("from Zoo z left join fetch z.animals a left join fetch a.offspring where z.name ='MZ' order by a.description").list();
+		s.createQuery("from Human h left join fetch h.pets a left join fetch a.offspring where h.name.first ='Gavin' order by a.description").list();
+		t.commit();
+		s.close();
+	}
+
+	public void testSelectClauseSubselect() {
+		if ( getDialect() instanceof IngresDialect ) {
+			// HHH-4973 Ingres 9.3 does not support sub-selects in the select
+			// list.
+			return;
+		}
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Zoo zoo = new Zoo();
+		zoo.setName("Melbourne Zoo");
+		zoo.setMammals( new HashMap() );
+		zoo.setAnimals( new HashMap() );
+		Mammal plat = new Mammal();
+		plat.setBodyWeight( 11f );
+		plat.setDescription( "Platypus" );
+		plat.setZoo(zoo);
+		plat.setSerialNumber("plat123");
+		zoo.getMammals().put("Platypus", plat);
+		zoo.getAnimals().put("plat123", plat);
+		s.persist( plat );
+		s.persist(zoo);
+
+		s.createQuery("select (select max(z.id) from a.zoo z) from Animal a").list();
+		s.createQuery("select (select max(z.id) from a.zoo z where z.name=:name) from Animal a")
+			.setParameter("name", "Melbourne Zoo").list();
+
+		s.delete(plat);
+		s.delete(zoo);
+		t.commit();
+		s.close();
+	}
+
+	public void testInitProxy() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Mammal plat = new Mammal();
+		plat.setBodyWeight( 11f );
+		plat.setDescription( "Platypus" );
+		s.persist( plat );
+		s.flush();
+		s.clear();
+		plat = (Mammal) s.load(Mammal.class, plat.getId() );
+		assertFalse( Hibernate.isInitialized(plat) );
+		Object plat2 = s.createQuery("from Animal a").uniqueResult();
+		assertSame(plat, plat2);
+		assertTrue( Hibernate.isInitialized(plat) );
+		s.delete(plat);
+		t.commit();
+		s.close();
+	}
+
+	public void testSelectClauseImplicitJoin() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Zoo zoo = new Zoo();
+		zoo.setName("The Zoo");
+		zoo.setMammals( new HashMap() );
+		zoo.setAnimals( new HashMap() );
+		Mammal plat = new Mammal();
+		plat.setBodyWeight( 11f );
+		plat.setDescription( "Platypus" );
+		plat.setZoo(zoo);
+		plat.setSerialNumber("plat123");
+		zoo.getMammals().put("Platypus", plat);
+		zoo.getAnimals().put("plat123", plat);
+		s.persist( plat );
+		s.persist(zoo);
+		s.flush();
+		s.clear();
+		Query q = s.createQuery("select distinct a.zoo from Animal a where a.zoo is not null");
+		Type type = q.getReturnTypes()[0];
+		assertTrue( type instanceof ManyToOneType );
+		assertEquals( ( (ManyToOneType) type ).getAssociatedEntityName(), "org.hibernate.test.hql.Zoo" );
+		zoo = (Zoo) q.list().get(0);
+		assertEquals( zoo.getMammals().size(), 1 );
+		assertEquals( zoo.getAnimals().size(), 1 );
+		s.clear();
+		s.delete(plat);
+		s.delete(zoo);
+		t.commit();
+		s.close();
+	}
+
+	public void testSelectClauseImplicitJoinWithIterate() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Zoo zoo = new Zoo();
+		zoo.setName("The Zoo");
+		zoo.setMammals( new HashMap() );
+		zoo.setAnimals( new HashMap() );
+		Mammal plat = new Mammal();
+		plat.setBodyWeight( 11f );
+		plat.setDescription( "Platypus" );
+		plat.setZoo(zoo);
+		plat.setSerialNumber("plat123");
+		zoo.getMammals().put("Platypus", plat);
+		zoo.getAnimals().put("plat123", plat);
+		s.persist( plat );
+		s.persist(zoo);
+		s.flush();
+		s.clear();
+		Query q = s.createQuery("select distinct a.zoo from Animal a where a.zoo is not null");
+		Type type = q.getReturnTypes()[0];
+		assertTrue( type instanceof ManyToOneType );
+		assertEquals( ( (ManyToOneType) type ).getAssociatedEntityName(), "org.hibernate.test.hql.Zoo" );
+		zoo = (Zoo) q
+			.iterate().next();
+		assertEquals( zoo.getMammals().size(), 1 );
+		assertEquals( zoo.getAnimals().size(), 1 );
+		s.clear();
+		s.delete(plat);
+		s.delete(zoo);
+		t.commit();
+		s.close();
+	}
+
+	public void testComponentOrderBy() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Long id1 = ( Long ) s.save( genSimpleHuman( "John", "Jacob" ) );
+		Long id2 = ( Long ) s.save( genSimpleHuman( "Jingleheimer", "Schmidt" ) );
+
+		s.flush();
+
+		// the component is defined with the firstName column first...
+		List results = s.createQuery( "from Human as h order by h.name" ).list();
+		assertEquals( "Incorrect return count", 2, results.size() );
+
+		Human h1 = ( Human ) results.get( 0 );
+		Human h2 = ( Human ) results.get( 1 );
+
+		assertEquals( "Incorrect ordering", id2, h1.getId() );
+		assertEquals( "Incorrect ordering", id1, h2.getId() );
+
+		s.delete( h1 );
+		s.delete( h2 );
+
+		t.commit();
+		s.close();
+	}
+	
+	public void testOrderedWithCustomColumnReadAndWrite() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		SimpleEntityWithAssociation first = new SimpleEntityWithAssociation();
+		first.setNegatedNumber(1);
+		s.save(first);
+		SimpleEntityWithAssociation second = new SimpleEntityWithAssociation();
+		second.setNegatedNumber(2);
+		s.save(second);
+		s.flush();
+
+		// Check order via SQL. Numbers are negated in the DB, so second comes first.
+		List listViaSql = s.createSQLQuery("select id from simple_1 order by negated_num").list();
+		assertEquals(2, listViaSql.size());
+		assertEquals(second.getId().longValue(), ((Number)listViaSql.get(0)).longValue());
+		assertEquals(first.getId().longValue(), ((Number)listViaSql.get(1)).longValue());
+		
+		// Check order via HQL. Now first comes first b/c the read negates the DB negation.
+		List listViaHql = s.createQuery("from SimpleEntityWithAssociation order by negatedNumber").list();
+		assertEquals(2, listViaHql.size());
+		assertEquals(first.getId(), ((SimpleEntityWithAssociation)listViaHql.get(0)).getId());
+		assertEquals(second.getId(), ((SimpleEntityWithAssociation)listViaHql.get(1)).getId());
+		
+		s.delete(first);
+		s.delete(second);
+		t.commit();
+		s.close();
+		
+	}
+	
+	public void testHavingWithCustomColumnReadAndWrite() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		SimpleEntityWithAssociation first = new SimpleEntityWithAssociation();
+		first.setNegatedNumber(5);
+		first.setName("simple");
+		s.save(first);
+		SimpleEntityWithAssociation second = new SimpleEntityWithAssociation();
+		second.setNegatedNumber(10);
+		second.setName("simple");
+		s.save(second);
+		SimpleEntityWithAssociation third = new SimpleEntityWithAssociation();
+		third.setNegatedNumber(20);
+		third.setName("complex");
+		s.save(third);
+		s.flush();
+
+		// Check order via HQL. Now first comes first b/c the read negates the DB negation.
+		Number r = (Number)s.createQuery("select sum(negatedNumber) from SimpleEntityWithAssociation " +
+				"group by name having sum(negatedNumber) < 20").uniqueResult();
+		assertEquals(r.intValue(), 15);
+		
+		s.delete(first);
+		s.delete(second);
+		s.delete(third);
+		t.commit();
+		s.close();
+		
+	}
+	
+	public void testLoadSnapshotWithCustomColumnReadAndWrite() {
+		// Exercises entity snapshot load when select-before-update is true.
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		final double SIZE_IN_KB = 1536d;
+		final double SIZE_IN_MB = SIZE_IN_KB / 1024d;
+		Image image = new Image();
+		image.setName("picture.gif");
+		image.setSizeKb(SIZE_IN_KB);
+		s.persist(image);
+		s.flush();
+		
+		Double sizeViaSql = (Double)s.createSQLQuery("select size_mb from image").uniqueResult();
+		assertEquals(SIZE_IN_MB, sizeViaSql, 0.01d);
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		final double NEW_SIZE_IN_KB = 2048d;
+		final double NEW_SIZE_IN_MB = NEW_SIZE_IN_KB / 1024d;
+		image.setSizeKb(NEW_SIZE_IN_KB);
+		s.update(image);
+		s.flush();
+
+		sizeViaSql = (Double)s.createSQLQuery("select size_mb from image").uniqueResult();
+		assertEquals(NEW_SIZE_IN_MB, sizeViaSql, 0.01d);		
+		
+		s.delete(image);
+		t.commit();
+		s.close();
+		
+	}
+		
+
+	private Human genSimpleHuman(String fName, String lName) {
+		Human h = new Human();
+		h.setName( new Name( fName, 'X', lName ) );
+
+		return h;
+	}
+
+	public void testCastInSelect() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Animal a = new Animal();
+		a.setBodyWeight(12.4f);
+		a.setDescription("an animal");
+		s.persist(a);
+		Object bodyWeight = s.createQuery("select cast(bodyWeight as integer) from Animal").uniqueResult();
+		assertTrue( Integer.class.isInstance( bodyWeight ) );
+		assertEquals( 12, bodyWeight );
+
+		bodyWeight = s.createQuery("select cast(bodyWeight as big_decimal) from Animal").uniqueResult();
+		assertTrue( BigDecimal.class.isInstance( bodyWeight ) );
+		assertEquals( a.getBodyWeight(), ( (BigDecimal) bodyWeight ).floatValue() );
+
+		Object literal = s.createQuery("select cast(10000000 as big_integer) from Animal").uniqueResult();
+		assertTrue( BigInteger.class.isInstance( literal ) );
+		assertEquals( BigInteger.valueOf( 10000000 ), literal );
+		s.delete(a);
+		t.commit();
+		s.close();
+	}
+
+	/**
+	 * Test the numeric expression rules specified in section 4.8.6 of the JPA 2 specification
+	 */
+	public void testNumericExpressionReturnTypes() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Animal a = new Animal();
+		a.setBodyWeight(12.4f);
+		a.setDescription("an animal");
+		s.persist(a);
+
+		Object result;
+
+		// addition ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+		result = s.createQuery( "select 1 + 1 from Animal as a" ).uniqueResult();
+		assertTrue( "int + int", Integer.class.isInstance( result ) );
+		assertEquals( 2, result );
+
+		result = s.createQuery( "select 1 + 1L from Animal a" ).uniqueResult();
+		assertTrue( "int + long", Long.class.isInstance( result ) );
+		assertEquals( Long.valueOf( 2 ), result );
+
+		result = s.createQuery( "select 1 + 1BI from Animal a" ).uniqueResult();
+		assertTrue( "int + BigInteger", BigInteger.class.isInstance( result ) );
+		assertEquals( BigInteger.valueOf( 2 ), result );
+
+		result = s.createQuery( "select 1 + 1F from Animal a" ).uniqueResult();
+		assertTrue( "int + float", Float.class.isInstance( result ) );
+		assertEquals( Float.valueOf( 2 ), result );
+
+		result = s.createQuery( "select 1 + 1D from Animal a" ).uniqueResult();
+		assertTrue( "int + double", Double.class.isInstance( result ) );
+		assertEquals( Double.valueOf( 2 ), result );
+
+		result = s.createQuery( "select 1 + 1BD from Animal a" ).uniqueResult();
+		assertTrue( "int + BigDecimal", BigDecimal.class.isInstance( result ) );
+		assertEquals( BigDecimal.valueOf( 2 ), result );
+
+		result = s.createQuery( "select 1F + 1D from Animal a" ).uniqueResult();
+		assertTrue( "float + double", Double.class.isInstance( result ) );
+		assertEquals( Double.valueOf( 2 ), result );
+
+		result = s.createQuery( "select 1F + 1BD from Animal a" ).uniqueResult();
+		assertTrue( "float + BigDecimal", Float.class.isInstance( result ) );
+		assertEquals( Float.valueOf( 2 ), result );
+
+		// subtraction ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+		result = s.createQuery( "select 1 - 1 from Animal as a" ).uniqueResult();
+		assertTrue( "int - int", Integer.class.isInstance( result ) );
+		assertEquals( 0, result );
+
+		result = s.createQuery( "select 1 - 1L from Animal a" ).uniqueResult();
+		assertTrue( "int - long", Long.class.isInstance( result ) );
+		assertEquals( Long.valueOf( 0 ), result );
+
+		result = s.createQuery( "select 1 - 1BI from Animal a" ).uniqueResult();
+		assertTrue( "int - BigInteger", BigInteger.class.isInstance( result ) );
+		assertEquals( BigInteger.valueOf( 0 ), result );
+
+		result = s.createQuery( "select 1 - 1F from Animal a" ).uniqueResult();
+		assertTrue( "int - float", Float.class.isInstance( result ) );
+		assertEquals( Float.valueOf( 0 ), result );
+
+		result = s.createQuery( "select 1 - 1D from Animal a" ).uniqueResult();
+		assertTrue( "int - double", Double.class.isInstance( result ) );
+		assertEquals( Double.valueOf( 0 ), result );
+
+		result = s.createQuery( "select 1 - 1BD from Animal a" ).uniqueResult();
+		assertTrue( "int - BigDecimal", BigDecimal.class.isInstance( result ) );
+		assertEquals( BigDecimal.valueOf( 0 ), result );
+
+		result = s.createQuery( "select 1F - 1D from Animal a" ).uniqueResult();
+		assertTrue( "float - double", Double.class.isInstance( result ) );
+		assertEquals( Double.valueOf( 0 ), result );
+
+		result = s.createQuery( "select 1F - 1BD from Animal a" ).uniqueResult();
+		assertTrue( "float - BigDecimal", Float.class.isInstance( result ) );
+		assertEquals( Float.valueOf( 0 ), result );
+
+		// multiplication ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+		result = s.createQuery( "select 1 * 1 from Animal as a" ).uniqueResult();
+		assertTrue( "int * int", Integer.class.isInstance( result ) );
+		assertEquals( 1, result );
+
+		result = s.createQuery( "select 1 * 1L from Animal a" ).uniqueResult();
+		assertTrue( "int * long", Long.class.isInstance( result ) );
+		assertEquals( Long.valueOf( 1 ), result );
+
+		result = s.createQuery( "select 1 * 1BI from Animal a" ).uniqueResult();
+		assertTrue( "int * BigInteger", BigInteger.class.isInstance( result ) );
+		assertEquals( BigInteger.valueOf( 1 ), result );
+
+		result = s.createQuery( "select 1 * 1F from Animal a" ).uniqueResult();
+		assertTrue( "int * float", Float.class.isInstance( result ) );
+		assertEquals( Float.valueOf( 1 ), result );
+
+		result = s.createQuery( "select 1 * 1D from Animal a" ).uniqueResult();
+		assertTrue( "int * double", Double.class.isInstance( result ) );
+		assertEquals( Double.valueOf( 1 ), result );
+
+		result = s.createQuery( "select 1 * 1BD from Animal a" ).uniqueResult();
+		assertTrue( "int * BigDecimal", BigDecimal.class.isInstance( result ) );
+		assertEquals( BigDecimal.valueOf( 1 ), result );
+
+		s.delete(a);
+		t.commit();
+		s.close();
+	}
+
+	public void testAliases() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Animal a = new Animal();
+		a.setBodyWeight(12.4f);
+		a.setDescription("an animal");
+		s.persist(a);
+		String[] aliases1 = s.createQuery("select a.bodyWeight as abw, a.description from Animal a").getReturnAliases();
+		assertEquals(aliases1[0], "abw");
+		assertEquals(aliases1[1], "1");
+		String[] aliases2 = s.createQuery("select count(*), avg(a.bodyWeight) as avg from Animal a").getReturnAliases();
+		assertEquals(aliases2[0], "0");
+		assertEquals(aliases2[1], "avg");
+		s.delete(a);
+		t.commit();
+		s.close();
+	}
+
+	public void testParameterMixing() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.createQuery( "from Animal a where a.description = ? and a.bodyWeight = ? or a.bodyWeight = :bw" )
+				.setString( 0, "something" )
+				.setFloat( 1, 12345f )
+				.setFloat( "bw", 123f )
+				.list();
+		t.commit();
+		s.close();
+	}
+
+	public void testOrdinalParameters() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.createQuery( "from Animal a where a.description = ? and a.bodyWeight = ?" )
+				.setString( 0, "something" )
+				.setFloat( 1, 123f )
+				.list();
+		s.createQuery( "from Animal a where a.bodyWeight in (?, ?)" )
+				.setFloat( 0, 999f )
+				.setFloat( 1, 123f )
+				.list();
+		t.commit();
+		s.close();
+	}
+
+	public void testIndexParams() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.createQuery("from Zoo zoo where zoo.mammals[:name] = :id")
+			.setParameter("name", "Walrus")
+			.setParameter("id", new Long(123))
+			.list();
+		s.createQuery("from Zoo zoo where zoo.mammals[:name].bodyWeight > :w")
+			.setParameter("name", "Walrus")
+			.setParameter("w", new Float(123.32))
+			.list();
+		s.createQuery("from Zoo zoo where zoo.animals[:sn].mother.bodyWeight < :mw")
+			.setParameter("sn", "ant-123")
+			.setParameter("mw", new Float(23.32))
+			.list();
+		/*s.createQuery("from Zoo zoo where zoo.animals[:sn].description like :desc and zoo.animals[:sn].bodyWeight > :wmin and zoo.animals[:sn].bodyWeight < :wmax")
+			.setParameter("sn", "ant-123")
+			.setParameter("desc", "%big%")
+			.setParameter("wmin", new Float(123.32))
+			.setParameter("wmax", new Float(167.89))
+			.list();*/
+		/*s.createQuery("from Human where addresses[:type].city = :city and addresses[:type].country = :country")
+			.setParameter("type", "home")
+			.setParameter("city", "Melbourne")
+			.setParameter("country", "Australia")
+			.list();*/
+		t.commit();
+		s.close();
+	}
+
+	public void testAggregation() {
+		Session s = openSession();
+		s.beginTransaction();
+		Human h = new Human();
+		h.setBodyWeight( (float) 74.0 );
+		h.setHeightInches(120.5);
+		h.setDescription("Me");
+		h.setName( new Name("Gavin", 'A', "King") );
+		h.setNickName("Oney");
+		s.persist(h);
+		Double sum = (Double) s.createQuery("select sum(h.bodyWeight) from Human h").uniqueResult();
+		Double avg = (Double) s.createQuery("select avg(h.heightInches) from Human h").uniqueResult();	// uses custom read and write for column
+		assertEquals(sum.floatValue(), 74.0, 0.01);
+		assertEquals(avg.doubleValue(), 120.5, 0.01);
+		Long id = (Long) s.createQuery("select max(a.id) from Animal a").uniqueResult();
+		assertNotNull( id );
+		s.delete( h );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		h = new Human();
+		h.setFloatValue( 2.5F );
+		h.setIntValue( 1 );
+		s.persist( h );
+		Human h2 = new Human();
+		h2.setFloatValue( 2.5F );
+		h2.setIntValue( 2 );
+		s.persist( h2 );
+		Object[] results = (Object[]) s.createQuery( "select sum(h.floatValue), avg(h.floatValue), sum(h.intValue), avg(h.intValue) from Human h" )
+				.uniqueResult();
+		// spec says sum() on a float or double value should result in double
+		assertTrue( Double.class.isInstance( results[0] ) );
+		assertEquals( 5D, results[0] );
+		// avg() should return a double
+		assertTrue( Double.class.isInstance( results[1] ) );
+		assertEquals( 2.5D, results[1] );
+		// spec says sum() on short, int or long should result in long
+		assertTrue( Long.class.isInstance( results[2] ) );
+		assertEquals( 3L, results[2] );
+		// avg() should return a double
+		assertTrue( Double.class.isInstance( results[3] ) );
+		assertEquals( 1.5D, results[3] );
+		s.delete(h);
+		s.delete(h2);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testSelectClauseCase() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Human h = new Human();
+		h.setBodyWeight( (float) 74.0 );
+		h.setHeightInches(120.5);
+		h.setDescription("Me");
+		h.setName( new Name("Gavin", 'A', "King") );
+		h.setNickName("Oney");
+		s.persist(h);
+		String name = (String) s.createQuery("select case nickName when 'Oney' then 'gavin' when 'Turin' then 'christian' else nickName end from Human").uniqueResult();
+		assertEquals(name, "gavin");
+		String result = (String) s.createQuery("select case when bodyWeight > 100 then 'fat' else 'skinny' end from Human").uniqueResult();
+		assertEquals(result, "skinny");
+		s.delete(h);
+		t.commit();
+		s.close();
+	}
+
+	public void testImplicitPolymorphism() {
+		if(getDialect() instanceof IngresDialect){
+			//HHH-4976 Ingres 9.3 does not support sub-selects in the select list.
+			return;
+		}
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Product product = new Product();
+		product.setDescription( "My Product" );
+		product.setNumberAvailable( 10 );
+		product.setPrice( new BigDecimal( 123 ) );
+		product.setProductId( "4321" );
+		s.save( product );
+
+		List list = s.createQuery("from java.lang.Comparable").list();
+		assertEquals( list.size(), 0 );
+
+		list = s.createQuery("from java.lang.Object").list();
+		assertEquals( list.size(), 1 );
+
+		s.delete(product);
+
+		list = s.createQuery("from java.lang.Object").list();
+		assertEquals( list.size(), 0 );
+
+		t.commit();
+		s.close();
+	}
+
+	public void testCoalesce() {
+		Session session = openSession();
+		Transaction txn = session.beginTransaction();
+		session.createQuery("from Human h where coalesce(h.nickName, h.name.first, h.name.last) = 'max'").list();
+		session.createQuery("select nullif(nickName, '1e1') from Human").list();
+		txn.commit();
+		session.close();
+	}
+
+	public void testStr() {
+		Session session = openSession();
+		Transaction txn = session.beginTransaction();
+		Animal an = new Animal();
+		an.setBodyWeight(123.45f);
+		session.persist(an);
+		String str = (String) session.createQuery("select str(an.bodyWeight) from Animal an where str(an.bodyWeight) like '%1%'").uniqueResult();
+		if ( getDialect() instanceof DB2Dialect ) {
+			assertTrue( str.startsWith("1.234") );
+		}
+		else if ( getDialect() instanceof SybaseDialect || getDialect() instanceof Sybase11Dialect || getDialect() instanceof SybaseASE15Dialect || getDialect() instanceof SybaseAnywhereDialect || getDialect() instanceof SQLServerDialect ) {
+			// str(val) on sybase assumes a default of 10 characters with no decimal point or decimal values
+			// str(val) on sybase result is right-justified
+			assertEquals( str.length(), 10 );
+			assertTrue( str.endsWith("123") );
+			str = (String) session.createQuery("select str(an.bodyWeight, 8, 3) from Animal an where str(an.bodyWeight, 8, 3) like '%1%'").uniqueResult();
+			assertEquals( str.length(), 8 );
+			assertTrue( str.endsWith( "123.450" ) );
+		}
+		else {
+			assertTrue( str.startsWith("123.4") );
+		}
+		if ( ! ( getDialect() instanceof SybaseDialect ) && ! ( getDialect() instanceof Sybase11Dialect ) && ! ( getDialect() instanceof SybaseASE15Dialect ) && ! ( getDialect() instanceof SybaseAnywhereDialect ) && ! ( getDialect() instanceof SQLServerDialect ) ) {
+			// In TransactSQL (the variant spoken by Sybase and SQLServer), the str() function
+			// is explicitly intended for numeric values only...
+			String dateStr1 = (String) session.createQuery("select str(current_date) from Animal").uniqueResult();
+			String dateStr2 = (String) session.createQuery("select str(year(current_date))||'-'||str(month(current_date))||'-'||str(day(current_date)) from Animal").uniqueResult();
+			System.out.println(dateStr1 + '=' + dateStr2);
+			if ( ! ( getDialect() instanceof Oracle8iDialect ) ) { //Oracle renders the name of the month :(
+				String[] dp1 = StringHelper.split("-", dateStr1);
+				String[] dp2 = StringHelper.split("-", dateStr2);
+				for (int i=0; i<3; i++) {
+					if ( dp1[i].startsWith( "0" ) ) {
+						dp1[i] = dp1[i].substring( 1 );
+					}
+					assertEquals( dp1[i], dp2[i] );
+				}
+			}
+		}
+		session.delete(an);
+		txn.commit();
+		session.close();
+	}
+
+	public void testCast() {
+		if ( ( getDialect() instanceof MySQLDialect ) || ( getDialect() instanceof DB2Dialect ) ) {
+			return;
+		}
+		Session session = openSession();
+		Transaction txn = session.beginTransaction();
+		session.createQuery("from Human h where h.nickName like 'G%'").list();
+		session.createQuery("from Animal a where cast(a.bodyWeight as string) like '1.%'").list();
+		session.createQuery("from Animal a where cast(a.bodyWeight as integer) = 1").list();
+		txn.commit();
+		session.close();
+	}
+
+	public void testExtract() {
+		Session session = openSession();
+		Transaction txn = session.beginTransaction();
+		session.createQuery("select second(current_timestamp()), minute(current_timestamp()), hour(current_timestamp()) from Mammal m").list();
+		session.createQuery("select day(m.birthdate), month(m.birthdate), year(m.birthdate) from Mammal m").list();
+		if ( !(getDialect() instanceof DB2Dialect) ) { //no ANSI extract
+			session.createQuery("select extract(second from current_timestamp()), extract(minute from current_timestamp()), extract(hour from current_timestamp()) from Mammal m").list();
+			session.createQuery("select extract(day from m.birthdate), extract(month from m.birthdate), extract(year from m.birthdate) from Mammal m").list();
+		}
+		txn.commit();
+		session.close();
+	}
+
+	public void testOneToManyFilter() throws Throwable {
+		if ( getDialect() instanceof IngresDialect ) {
+			// HHH-4977 Ingres 9.3 does not support sub-selects in the select
+			// list.
+			return;
+		}
+		Session session = openSession();
+		Transaction txn = session.beginTransaction();
+
+		Product product = new Product();
+		product.setDescription( "My Product" );
+		product.setNumberAvailable( 10 );
+		product.setPrice( new BigDecimal( 123 ) );
+		product.setProductId( "4321" );
+		session.save( product );
+
+		Customer customer = new Customer();
+		customer.setCustomerId( "123456789" );
+		customer.setName( "My customer" );
+		customer.setAddress( "somewhere" );
+		session.save( customer );
+
+		Order order = customer.generateNewOrder( new BigDecimal( 1234 ) );
+		session.save( order );
+
+		LineItem li = order.generateLineItem( product, 5 );
+		session.save( li );
+
+		session.flush();
+
+		assertEquals( session.createFilter( customer.getOrders(), "" ).list().size(), 1 );
+
+		assertEquals( session.createFilter( order.getLineItems(), "" ).list().size(), 1 );
+		assertEquals( session.createFilter( order.getLineItems(), "where this.quantity > :quantity" ).setInteger( "quantity", 5 ).list().size(), 0 );
+
+		session.delete(li);
+		session.delete(order);
+		session.delete(product);
+		session.delete(customer);
+		txn.commit();
+		session.close();
+	}
+
+	public void testManyToManyFilter() throws Throwable {
+		Session session = openSession();
+		Transaction txn = session.beginTransaction();
+
+		Human human = new Human();
+		human.setName( new Name( "Steve", 'L', "Ebersole" ) );
+		session.save( human );
+
+		Human friend = new Human();
+		friend.setName( new Name( "John", 'Q', "Doe" ) );
+		friend.setBodyWeight( 11.0f );
+		session.save( friend );
+
+		human.setFriends( new ArrayList() );
+		friend.setFriends( new ArrayList() );
+		human.getFriends().add( friend );
+		friend.getFriends().add( human );
+
+		session.flush();
+
+		assertEquals( session.createFilter( human.getFriends(), "" ).list().size(), 1 );
+		assertEquals( session.createFilter( human.getFriends(), "where this.bodyWeight > ?" ).setFloat( 0, 10f ).list().size(), 1 );
+		assertEquals( session.createFilter( human.getFriends(), "where this.bodyWeight < ?" ).setFloat( 0, 10f ).list().size(), 0 );
+
+		session.delete(human);
+		session.delete(friend);
+
+		txn.commit();
+		session.close();
+	}
+	
+	public void testFilterWithCustomColumnReadAndWrite() {
+		Session session = openSession();
+		Transaction txn = session.beginTransaction();
+
+		Human human = new Human();
+		human.setName( new Name( "Steve", 'L', "Ebersole" ) );
+		human.setHeightInches(73d);
+		session.save( human );
+
+		Human friend = new Human();
+		friend.setName( new Name( "John", 'Q', "Doe" ) );
+		friend.setHeightInches(50d);
+		session.save( friend );
+
+		human.setFriends( new ArrayList() );
+		friend.setFriends( new ArrayList() );
+		human.getFriends().add( friend );
+		friend.getFriends().add( human );
+
+		session.flush();
+
+		assertEquals( session.createFilter( human.getFriends(), "" ).list().size(), 1 );
+		assertEquals( session.createFilter( human.getFriends(), "where this.heightInches < ?" ).setDouble( 0, 51d ).list().size(), 1 );
+		assertEquals( session.createFilter( human.getFriends(), "where this.heightInches > ?" ).setDouble( 0, 51d ).list().size(), 0 );
+		assertEquals( session.createFilter( human.getFriends(), "where this.heightInches between 49 and 51" ).list().size(), 1 );
+		assertEquals( session.createFilter( human.getFriends(), "where this.heightInches not between 49 and 51" ).list().size(), 0 );
+
+		session.delete(human);
+		session.delete(friend);
+
+		txn.commit();
+		session.close();		
+	}
+
+	public void testSelectExpressions() {
+		createTestBaseData();
+		Session session = openSession();
+		Transaction txn = session.beginTransaction();
+		Human h = new Human();
+		h.setName( new Name("Gavin", 'A', "King") );
+		h.setNickName("Oney");
+		h.setBodyWeight(1.0f);
+		session.persist(h);
+		List results = session.createQuery("select 'found', lower(h.name.first) from Human h where lower(h.name.first) = 'gavin'").list();
+		results = session.createQuery("select 'found', lower(h.name.first) from Human h where concat(h.name.first, ' ', h.name.initial, ' ', h.name.last) = 'Gavin A King'").list();
+		results = session.createQuery("select 'found', lower(h.name.first) from Human h where h.name.first||' '||h.name.initial||' '||h.name.last = 'Gavin A King'").list();
+		results = session.createQuery("select a.bodyWeight + m.bodyWeight from Animal a join a.mother m").list();
+		results = session.createQuery("select 2.0 * (a.bodyWeight + m.bodyWeight) from Animal a join a.mother m").list();
+		results = session.createQuery("select sum(a.bodyWeight + m.bodyWeight) from Animal a join a.mother m").list();
+		results = session.createQuery("select sum(a.mother.bodyWeight * 2.0) from Animal a").list();
+		results = session.createQuery("select concat(h.name.first, ' ', h.name.initial, ' ', h.name.last) from Human h").list();
+		results = session.createQuery("select h.name.first||' '||h.name.initial||' '||h.name.last from Human h").list();
+		results = session.createQuery("select nickName from Human").list();
+		results = session.createQuery("select lower(nickName) from Human").list();
+		results = session.createQuery("select abs(bodyWeight*-1) from Human").list();
+		results = session.createQuery("select upper(h.name.first||' ('||h.nickName||')') from Human h").list();
+		results = session.createQuery("select abs(a.bodyWeight-:param) from Animal a").setParameter("param", new Float(2.0)).list();
+		results = session.createQuery("select abs(:param - a.bodyWeight) from Animal a").setParameter("param", new Float(2.0)).list();
+		results = session.createQuery("select lower(upper('foo')) from Animal").list();
+		results = session.createQuery("select lower(upper('foo') || upper('bar')) from Animal").list();
+		results = session.createQuery("select sum(abs(bodyWeight - 1.0) * abs(length('ffobar')-3)) from Animal").list();
+		session.delete(h);
+		txn.commit();
+		session.close();
+		destroyTestBaseData();
+	}
+
+	private void createTestBaseData() {
+		Session session = openSession();
+		Transaction txn = session.beginTransaction();
+
+		Mammal m1 = new Mammal();
+		m1.setBodyWeight( 11f );
+		m1.setDescription( "Mammal #1" );
+
+		session.save( m1 );
+
+		Mammal m2 = new Mammal();
+		m2.setBodyWeight( 9f );
+		m2.setDescription( "Mammal #2" );
+		m2.setMother( m1 );
+
+		session.save( m2 );
+
+		txn.commit();
+		session.close();
+
+		createdAnimalIds.add( m1.getId() );
+		createdAnimalIds.add( m2.getId() );
+	}
+
+	private void destroyTestBaseData() {
+		Session session = openSession();
+		Transaction txn = session.beginTransaction();
+
+		for ( int i = 0; i < createdAnimalIds.size(); i++ ) {
+			Animal animal = ( Animal ) session.load( Animal.class, ( Long ) createdAnimalIds.get( i ) );
+			session.delete( animal );
+		}
+
+		txn.commit();
+		session.close();
+	}
+
+	public void testImplicitJoin() throws Exception {
+		Session session = openSession();
+		Transaction t = session.beginTransaction();
+		Animal a = new Animal();
+		a.setBodyWeight(0.5f);
+		a.setBodyWeight(1.5f);
+		Animal b = new Animal();
+		Animal mother = new Animal();
+		mother.setBodyWeight(10.0f);
+		mother.addOffspring(a);
+		mother.addOffspring(b);
+		session.persist(a);
+		session.persist(b);
+		session.persist(mother);
+		List list = session.createQuery("from Animal a where a.mother.bodyWeight < 2.0 or a.mother.bodyWeight > 9.0").list();
+		assertEquals( list.size(), 2 );
+		list = session.createQuery("from Animal a where a.mother.bodyWeight > 2.0 and a.mother.bodyWeight > 9.0").list();
+		assertEquals( list.size(), 2 );
+		session.delete(b);
+		session.delete(a);
+		session.delete(mother);
+		t.commit();
+		session.close();
+	}
+
+	public void testFromOnly() throws Exception {
+
+		createTestBaseData();
+
+		Session session = openSession();
+
+		List results = session.createQuery( "from Animal" ).list();
+		assertEquals( "Incorrect result size", 2, results.size() );
+		assertTrue( "Incorrect result return type", results.get( 0 ) instanceof Animal );
+
+		session.close();
+
+		destroyTestBaseData();
+	}
+
+	public void testSimpleSelect() throws Exception {
+
+		createTestBaseData();
+
+		Session session = openSession();
+
+		List results = session.createQuery( "select a from Animal as a" ).list();
+		assertEquals( "Incorrect result size", 2, results.size() );
+		assertTrue( "Incorrect result return type", results.get( 0 ) instanceof Animal );
+
+		session.close();
+
+		destroyTestBaseData();
+	}
+
+	public void testEntityPropertySelect() throws Exception {
+
+		createTestBaseData();
+
+		Session session = openSession();
+
+		List results = session.createQuery( "select a.mother from Animal as a" ).list();
+//		assertEquals("Incorrect result size", 2, results.size());
+		assertTrue( "Incorrect result return type", results.get( 0 ) instanceof Animal );
+
+		session.close();
+
+		destroyTestBaseData();
+	}
+
+	public void testWhere() throws Exception {
+
+		createTestBaseData();
+
+		Session session = openSession();
+		List results = null;
+
+		results = session.createQuery( "from Animal an where an.bodyWeight > 10" ).list();
+		assertEquals( "Incorrect result size", 1, results.size() );
+
+		results = session.createQuery( "from Animal an where not an.bodyWeight > 10" ).list();
+		assertEquals( "Incorrect result size", 1, results.size() );
+
+		results = session.createQuery( "from Animal an where an.bodyWeight between 0 and 10" ).list();
+		assertEquals( "Incorrect result size", 1, results.size() );
+
+		results = session.createQuery( "from Animal an where an.bodyWeight not between 0 and 10" ).list();
+		assertEquals( "Incorrect result size", 1, results.size() );
+
+		results = session.createQuery( "from Animal an where sqrt(an.bodyWeight)/2 > 10" ).list();
+		assertEquals( "Incorrect result size", 0, results.size() );
+
+		results = session.createQuery( "from Animal an where (an.bodyWeight > 10 and an.bodyWeight < 100) or an.bodyWeight is null" ).list();
+		assertEquals( "Incorrect result size", 1, results.size() );
+
+		session.close();
+
+		destroyTestBaseData();
+	}
+
+	public void testEntityFetching() throws Exception {
+
+		createTestBaseData();
+
+		Session session = openSession();
+
+		List results = session.createQuery( "from Animal an join fetch an.mother" ).list();
+		assertEquals( "Incorrect result size", 1, results.size() );
+		assertTrue( "Incorrect result return type", results.get( 0 ) instanceof Animal );
+		Animal mother = ( ( Animal ) results.get( 0 ) ).getMother();
+		assertTrue( "fetch uninitialized", mother != null && Hibernate.isInitialized( mother ) );
+
+		results = session.createQuery( "select an from Animal an join fetch an.mother" ).list();
+		assertEquals( "Incorrect result size", 1, results.size() );
+		assertTrue( "Incorrect result return type", results.get( 0 ) instanceof Animal );
+		mother = ( ( Animal ) results.get( 0 ) ).getMother();
+		assertTrue( "fetch uninitialized", mother != null && Hibernate.isInitialized( mother ) );
+
+		session.close();
+
+		destroyTestBaseData();
+	}
+
+	public void testCollectionFetching() throws Exception {
+
+		createTestBaseData();
+
+		Session session = openSession();
+		List results = session.createQuery( "from Animal an join fetch an.offspring" ).list();
+		assertEquals( "Incorrect result size", 1, results.size() );
+		assertTrue( "Incorrect result return type", results.get( 0 ) instanceof Animal );
+		Collection os = ( ( Animal ) results.get( 0 ) ).getOffspring();
+		assertTrue( "fetch uninitialized", os != null && Hibernate.isInitialized( os ) && os.size() == 1 );
+
+		results = session.createQuery( "select an from Animal an join fetch an.offspring" ).list();
+		assertEquals( "Incorrect result size", 1, results.size() );
+		assertTrue( "Incorrect result return type", results.get( 0 ) instanceof Animal );
+		os = ( ( Animal ) results.get( 0 ) ).getOffspring();
+		assertTrue( "fetch uninitialized", os != null && Hibernate.isInitialized( os ) && os.size() == 1 );
+
+		session.close();
+
+		destroyTestBaseData();
+	}
+
+	public void testProjectionQueries() throws Exception {
+
+		createTestBaseData();
+
+		Session session = openSession();
+
+		List results = session.createQuery( "select an.mother.id, max(an.bodyWeight) from Animal an group by an.mother.id" ).list();
+		// mysql returns nulls in this group by
+		assertEquals( "Incorrect result size", 2, results.size() );
+		assertTrue( "Incorrect return type", results.get( 0 ) instanceof Object[] );
+		assertEquals( "Incorrect return dimensions", 2, ( ( Object[] ) results.get( 0 ) ).length );
+
+		session.close();
+
+		destroyTestBaseData();
+
+	}
+
+	public void testStandardFunctions() throws Exception {
+		Session session = openSession();
+		Transaction t = session.beginTransaction();
+		Product p = new Product();
+		p.setDescription("a product");
+		p.setPrice( new BigDecimal(1.0) );
+		p.setProductId("abc123");
+		session.persist(p);
+		Object[] result = (Object[]) session
+			.createQuery("select current_time(), current_date(), current_timestamp() from Product")
+			.uniqueResult();
+		assertTrue( result[0] instanceof Time );
+		assertTrue( result[1] instanceof Date );
+		assertTrue( result[2] instanceof Timestamp );
+		assertNotNull( result[0] );
+		assertNotNull( result[1] );
+		assertNotNull( result[2] );
+		session.delete(p);
+		t.commit();
+		session.close();
+
+	}
+
+	public void testDynamicInstantiationQueries() throws Exception {
+
+		createTestBaseData();
+
+		Session session = openSession();
+
+		List results = session.createQuery( "select new Animal(an.description, an.bodyWeight) from Animal an" ).list();
+		assertEquals( "Incorrect result size", 2, results.size() );
+		assertClassAssignability( results.get( 0 ).getClass(), Animal.class );
+
+		Iterator iter = session.createQuery( "select new Animal(an.description, an.bodyWeight) from Animal an" ).iterate();
+		assertTrue( "Incorrect result size", iter.hasNext() );
+		assertTrue( "Incorrect return type", iter.next() instanceof Animal );
+
+		results = session.createQuery( "select new list(an.description, an.bodyWeight) from Animal an" ).list();
+		assertEquals( "Incorrect result size", 2, results.size() );
+		assertTrue( "Incorrect return type", results.get( 0 ) instanceof List );
+		assertEquals( "Incorrect return type", ( (List) results.get( 0 ) ).size(), 2 );
+
+		results = session.createQuery( "select new list(an.description, an.bodyWeight) from Animal an" ).list();
+		assertEquals( "Incorrect result size", 2, results.size() );
+		assertTrue( "Incorrect return type", results.get( 0 ) instanceof List );
+		assertEquals( "Incorrect return type", ( (List) results.get( 0 ) ).size(), 2 );
+
+		iter = session.createQuery( "select new list(an.description, an.bodyWeight) from Animal an" ).iterate();
+		assertTrue( "Incorrect result size", iter.hasNext() );
+		Object obj = iter.next();
+		assertTrue( "Incorrect return type", obj instanceof List );
+		assertEquals( "Incorrect return type", ( (List) obj ).size(), 2 );
+
+		iter = ( ( org.hibernate.classic.Session ) session ).createQuery(
+				"select new list(an.description, an.bodyWeight) from Animal an"
+		).iterate();
+		assertTrue( "Incorrect result size", iter.hasNext() );
+		obj = iter.next();
+		assertTrue( "Incorrect return type", obj instanceof List );
+		assertEquals( "Incorrect return type", ( (List) obj ).size(), 2 );
+
+		results = session.createQuery( "select new map(an.description, an.bodyWeight) from Animal an" ).list();
+		assertEquals( "Incorrect result size", 2, results.size() );
+		assertTrue( "Incorrect return type", results.get( 0 ) instanceof Map );
+		assertEquals( "Incorrect return type", ( (Map) results.get( 0 ) ).size(), 2 );
+		assertTrue( ( (Map) results.get( 0 ) ).containsKey("0") );
+		assertTrue( ( (Map) results.get( 0 ) ).containsKey("1") );
+
+		results = session.createQuery( "select new map(an.description as descr, an.bodyWeight as bw) from Animal an" ).list();
+		assertEquals( "Incorrect result size", 2, results.size() );
+		assertTrue( "Incorrect return type", results.get( 0 ) instanceof Map );
+		assertEquals( "Incorrect return type", ( (Map) results.get( 0 ) ).size(), 2 );
+		assertTrue( ( (Map) results.get( 0 ) ).containsKey("descr") );
+		assertTrue( ( (Map) results.get( 0 ) ).containsKey("bw") );
+
+		iter = session.createQuery( "select new map(an.description, an.bodyWeight) from Animal an" ).iterate();
+		assertTrue( "Incorrect result size", iter.hasNext() );
+		obj = iter.next();
+		assertTrue( "Incorrect return type", obj instanceof Map );
+		assertEquals( "Incorrect return type", ( (Map) obj ).size(), 2 );
+
+		ScrollableResults sr = session.createQuery( "select new map(an.description, an.bodyWeight) from Animal an" ).scroll();
+		assertTrue( "Incorrect result size", sr.next() );
+		obj = sr.get(0);
+		assertTrue( "Incorrect return type", obj instanceof Map );
+		assertEquals( "Incorrect return type", ( (Map) obj ).size(), 2 );
+		sr.close();
+
+		sr = session.createQuery( "select new Animal(an.description, an.bodyWeight) from Animal an" ).scroll();
+		assertTrue( "Incorrect result size", sr.next() );
+		assertTrue( "Incorrect return type", sr.get(0) instanceof Animal );
+		sr.close();
+
+		// caching...
+		QueryStatistics stats = getSessions().getStatistics().getQueryStatistics( "select new Animal(an.description, an.bodyWeight) from Animal an" );
+		results = session.createQuery( "select new Animal(an.description, an.bodyWeight) from Animal an" )
+				.setCacheable( true )
+				.list();
+		assertEquals( "incorrect result size", 2, results.size() );
+		assertClassAssignability( Animal.class, results.get( 0 ).getClass() );
+		long initCacheHits = stats.getCacheHitCount();
+		results = session.createQuery( "select new Animal(an.description, an.bodyWeight) from Animal an" )
+				.setCacheable( true )
+				.list();
+		assertEquals( "dynamic intantiation query not served from cache", initCacheHits + 1, stats.getCacheHitCount() );
+		assertEquals( "incorrect result size", 2, results.size() );
+		assertClassAssignability( Animal.class, results.get( 0 ).getClass() );
+
+		session.close();
+
+		destroyTestBaseData();
+	}
+
+	public void testIllegalMixedTransformerQueries() {
+		Session session = openSession();
+
+		try {
+			getSelectNewQuery( session ).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list();
+			fail("'select new' together with a resulttransformer should result in error!");
+		} catch(QueryException he) {
+			assertTrue(he.getMessage().indexOf("ResultTransformer")==0);
+		}
+
+		try {
+			getSelectNewQuery( session ).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).iterate();
+			fail("'select new' together with a resulttransformer should result in error!");
+		} catch(HibernateException he) {
+			assertTrue(he.getMessage().indexOf("ResultTransformer")==0);
+		}
+
+		try {
+			getSelectNewQuery( session ).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).scroll();
+			fail("'select new' together with a resulttransformer should result in error!");
+		} catch(HibernateException he) {
+			assertTrue(he.getMessage().indexOf("ResultTransformer")==0);
+		}
+
+		session.close();
+	}
+
+	private Query getSelectNewQuery(Session session) {
+		return session.createQuery( "select new Animal(an.description, an.bodyWeight) from Animal an" );
+	}
+	public void testResultTransformerScalarQueries() throws Exception {
+
+		createTestBaseData();
+
+		String query = "select an.description as description, an.bodyWeight as bodyWeight from Animal an order by bodyWeight desc";
+
+		Session session = openSession();
+
+		List results = session.createQuery( query )
+		.setResultTransformer(Transformers.aliasToBean(Animal.class)).list();
+		assertEquals( "Incorrect result size", results.size(), 2 );
+		assertTrue( "Incorrect return type", results.get(0) instanceof Animal );
+		Animal firstAnimal = (Animal) results.get(0);
+		Animal secondAnimal = (Animal) results.get(1);
+		assertEquals("Mammal #1", firstAnimal.getDescription());
+		assertEquals("Mammal #2", secondAnimal.getDescription());
+		assertFalse(session.contains(firstAnimal));
+		session.close();
+
+		session = openSession();
+
+		Iterator iter = session.createQuery( query )
+	     .setResultTransformer(Transformers.aliasToBean(Animal.class)).iterate();
+		assertTrue( "Incorrect result size", iter.hasNext() );
+		assertTrue( "Incorrect return type", iter.next() instanceof Animal );
+
+		session.close();
+
+		session = openSession();
+
+		ScrollableResults sr = session.createQuery( query )
+	     .setResultTransformer(Transformers.aliasToBean(Animal.class)).scroll();
+		assertTrue( "Incorrect result size", sr.next() );
+		assertTrue( "Incorrect return type", sr.get(0) instanceof Animal );
+		assertFalse(session.contains(sr.get(0)));
+		sr.close();
+
+		session.close();
+
+		session = openSession();
+
+		results = session.createQuery( "select a from Animal a, Animal b order by a.id" )
+				.setResultTransformer( DistinctRootEntityResultTransformer.INSTANCE )
+				.list();
+		assertEquals( "Incorrect result size", 2, results.size());
+		assertTrue( "Incorrect return type", results.get(0) instanceof Animal );
+		firstAnimal = (Animal) results.get(0);
+		secondAnimal = (Animal) results.get(1);
+		assertEquals("Mammal #1", firstAnimal.getDescription());
+		assertEquals("Mammal #2", secondAnimal.getDescription());
+
+		session.close();
+
+		destroyTestBaseData();
+	}
+
+	public void testResultTransformerEntityQueries() throws Exception {
+
+		createTestBaseData();
+
+		String query = "select an as an from Animal an order by bodyWeight desc";
+
+		Session session = openSession();
+
+		List results = session.createQuery( query )
+		.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list();
+		assertEquals( "Incorrect result size", results.size(), 2 );
+		assertTrue( "Incorrect return type", results.get(0) instanceof Map );
+		Map map = ((Map) results.get(0));
+		assertEquals(1, map.size());
+		Animal firstAnimal = (Animal) map.get("an");
+		map = ((Map) results.get(1));
+		Animal secondAnimal = (Animal) map.get("an");
+		assertEquals("Mammal #1", firstAnimal.getDescription());
+		assertEquals("Mammal #2", secondAnimal.getDescription());
+		assertTrue(session.contains(firstAnimal));
+		assertSame(firstAnimal, session.get(Animal.class,firstAnimal.getId()));
+		session.close();
+
+		session = openSession();
+
+		Iterator iter = session.createQuery( query )
+	     .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).iterate();
+		assertTrue( "Incorrect result size", iter.hasNext() );
+		map = (Map) iter.next();
+		firstAnimal = (Animal) map.get("an");
+		assertEquals("Mammal #1", firstAnimal.getDescription());
+		assertTrue( "Incorrect result size", iter.hasNext() );
+
+		session.close();
+
+		session = openSession();
+
+		ScrollableResults sr = session.createQuery( query )
+	     .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).scroll();
+		assertTrue( "Incorrect result size", sr.next() );
+		assertTrue( "Incorrect return type", sr.get(0) instanceof Map );
+		assertFalse(session.contains(sr.get(0)));
+		sr.close();
+
+		session.close();
+
+		destroyTestBaseData();
+	}
+
+	public void testEJBQLFunctions() throws Exception {
+		Session session = openSession();
+
+		String hql = "from Animal a where a.description = concat('1', concat('2','3'), '4'||'5')||'0'";
+		session.createQuery(hql).list();
+
+		hql = "from Animal a where substring(a.description, 1, 3) = 'cat'";
+		session.createQuery(hql).list();
+
+		hql = "select substring(a.description, 1, 3) from Animal a";
+		session.createQuery(hql).list();
+
+		hql = "from Animal a where lower(a.description) = 'cat'";
+		session.createQuery(hql).list();
+
+		hql = "select lower(a.description) from Animal a";
+		session.createQuery(hql).list();
+
+		hql = "from Animal a where upper(a.description) = 'CAT'";
+		session.createQuery(hql).list();
+
+		hql = "select upper(a.description) from Animal a";
+		session.createQuery(hql).list();
+
+		hql = "from Animal a where length(a.description) = 5";
+		session.createQuery(hql).list();
+
+		hql = "select length(a.description) from Animal a";
+		session.createQuery(hql).list();
+
+		//note: postgres and db2 don't have a 3-arg form, it gets transformed to 2-args
+		hql = "from Animal a where locate('abc', a.description, 2) = 2";
+		session.createQuery(hql).list();
+
+		hql = "from Animal a where locate('abc', a.description) = 2";
+		session.createQuery(hql).list();
+
+		hql = "select locate('cat', a.description, 2) from Animal a";
+		session.createQuery(hql).list();
+
+		if ( !( getDialect() instanceof DB2Dialect ) ) {
+			hql = "from Animal a where trim(trailing '_' from a.description) = 'cat'";
+			session.createQuery(hql).list();
+
+			hql = "select trim(trailing '_' from a.description) from Animal a";
+			session.createQuery(hql).list();
+
+			hql = "from Animal a where trim(leading '_' from a.description) = 'cat'";
+			session.createQuery(hql).list();
+
+			hql = "from Animal a where trim(both from a.description) = 'cat'";
+			session.createQuery(hql).list();
+		}
+
+		if ( !(getDialect() instanceof HSQLDialect) ) { //HSQL doesn't like trim() without specification
+			hql = "from Animal a where trim(a.description) = 'cat'";
+			session.createQuery(hql).list();
+		}
+
+		hql = "from Animal a where abs(a.bodyWeight) = sqrt(a.bodyWeight)";
+		session.createQuery(hql).list();
+
+		hql = "from Animal a where mod(16, 4) = 4";
+		session.createQuery(hql).list();
+		/**
+		 * PostgreSQL >= 8.3.7 typecasts are no longer automatically allowed 
+		 * <link>http://www.postgresql.org/docs/current/static/release-8-3.html</link>
+		 */
+		if(getDialect() instanceof PostgreSQLDialect){
+			hql = "from Animal a where bit_length(str(a.bodyWeight)) = 24";
+		}else{
+			hql = "from Animal a where bit_length(a.bodyWeight) = 24";
+		}
+		
+		session.createQuery(hql).list();
+		if(getDialect() instanceof PostgreSQLDialect){
+			hql = "select bit_length(str(a.bodyWeight)) from Animal a";
+		}else{
+			hql = "select bit_length(a.bodyWeight) from Animal a";
+		}
+		
+		session.createQuery(hql).list();
+
+		/*hql = "select object(a) from Animal a where CURRENT_DATE = :p1 or CURRENT_TIME = :p2 or CURRENT_TIMESTAMP = :p3";
+		session.createQuery(hql).list();*/
+
+		// todo the following is not supported
+		//hql = "select CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP from Animal a";
+		//parse(hql, true);
+		//System.out.println("sql: " + toSql(hql));
+
+		hql = "from Animal a where a.description like '%a%'";
+		session.createQuery(hql).list();
+
+		hql = "from Animal a where a.description not like '%a%'";
+		session.createQuery(hql).list();
+
+		hql = "from Animal a where a.description like 'x%ax%' escape 'x'";
+		session.createQuery(hql).list();
+
+		session.close();
+	}
+
+	public void testSubselectBetween() {
+		if ( supportsSubselectOnLeftSideIn() ) {
+			assertResultSize( "from Animal x where (select max(a.bodyWeight) from Animal a) in (1,2,3)", 0 );
+			assertResultSize( "from Animal x where (select max(a.bodyWeight) from Animal a) between 0 and 100", 0 );
+			assertResultSize( "from Animal x where (select max(a.description) from Animal a) like 'big%'", 0 );
+			assertResultSize( "from Animal x where (select max(a.bodyWeight) from Animal a) is not null", 0 );
+		}
+		assertResultSize( "from Animal x where exists (select max(a.bodyWeight) from Animal a)", 0 );
+	}
+
+	private void assertResultSize(String hql, int size) {
+		Session session = openSession();
+		Transaction txn = session.beginTransaction();
+		assertEquals( size, session.createQuery(hql).list().size() );
+		txn.commit();
+		session.close();
+	}
+
+	private interface QueryPreparer {
+		public void prepare(Query query);
+	}
+
+	private static final QueryPreparer DEFAULT_PREPARER = new QueryPreparer() {
+		public void prepare(Query query) {
+		}
+	};
+
+	private class SyntaxChecker {
+		private final String hql;
+		private final QueryPreparer preparer;
+
+		public SyntaxChecker(String hql) {
+			this( hql, DEFAULT_PREPARER );
+		}
+
+		public SyntaxChecker(String hql, QueryPreparer preparer) {
+			this.hql = hql;
+			this.preparer = preparer;
+		}
+
+		public void checkAll() {
+			checkList();
+			checkIterate();
+			checkScroll();
+		}
+
+		public SyntaxChecker checkList() {
+			Session s = openSession();
+			s.beginTransaction();
+			Query query = s.createQuery( hql );
+			preparer.prepare( query );
+			query.list();
+			s.getTransaction().commit();
+			s.close();
+			return this;
+		}
+
+		public SyntaxChecker checkScroll() {
+			Session s = openSession();
+			s.beginTransaction();
+			Query query = s.createQuery( hql );
+			preparer.prepare( query );
+			query.scroll();
+			s.getTransaction().commit();
+			s.close();
+			return this;
+		}
+
+		public SyntaxChecker checkIterate() {
+			Session s = openSession();
+			s.beginTransaction();
+			Query query = s.createQuery( hql );
+			preparer.prepare( query );
+			query.iterate();
+			s.getTransaction().commit();
+			s.close();
+			return this;
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/ASTParserLoadingTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Address.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Address.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Address.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,55 @@
+// $Id: Address.java 7996 2005-08-22 14:49:57Z steveebersole $
+package org.hibernate.test.hql;
+
+/**
+ * Implementation of Address.
+ *
+ * @author Steve Ebersole
+ */
+public class Address {
+	private String street;
+	private String city;
+	private String postalCode;
+	private String country;
+	private StateProvince stateProvince;
+
+	public String getStreet() {
+		return street;
+	}
+
+	public void setStreet(String street) {
+		this.street = street;
+	}
+
+	public String getCity() {
+		return city;
+	}
+
+	public void setCity(String city) {
+		this.city = city;
+	}
+
+	public String getPostalCode() {
+		return postalCode;
+	}
+
+	public void setPostalCode(String postalCode) {
+		this.postalCode = postalCode;
+	}
+
+	public String getCountry() {
+		return country;
+	}
+
+	public void setCountry(String country) {
+		this.country = country;
+	}
+
+	public StateProvince getStateProvince() {
+		return stateProvince;
+	}
+
+	public void setStateProvince(StateProvince stateProvince) {
+		this.stateProvince = stateProvince;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Address.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Animal.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Animal.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Animal.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,154 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+<hibernate-mapping
+	package="org.hibernate.test.hql"
+	default-access="field">
+
+	<class name="Animal">
+		<id name="id">
+			<generator class="native"/>
+		</id>
+		<property name="description"/>
+		<property name="bodyWeight" column="body_weight"/>
+		<many-to-one name="mother" column="mother_id"/>
+		<many-to-one name="father" column="father_id"/>
+		<many-to-one name="zoo" column="zoo_id"/>
+		<property name="serialNumber"/>
+		<set name="offspring" order-by="father_id">
+			<key column="mother_id"/>
+			<one-to-many class="Animal"/>
+		</set>
+		<joined-subclass name="Reptile">
+			<key column="animal"/>
+			<property name="bodyTemperature"/>
+			<joined-subclass name="Lizard">
+				<key column="reptile"/>
+			</joined-subclass>
+		</joined-subclass>
+		<joined-subclass name="Mammal">
+			<key column="animal"/>
+			<property name="pregnant"/>
+			<property name="birthdate" type="date"/>
+			<joined-subclass name="DomesticAnimal">
+				<key column="mammal"/>
+				<many-to-one name="owner"/>
+				<joined-subclass name="Cat">
+					<key column="mammal"/>
+				</joined-subclass>
+				<joined-subclass name="Dog">
+					<key column="mammal"/>
+				</joined-subclass>
+			</joined-subclass>
+			<joined-subclass name="Human">
+				<key column="mammal"/>
+				<component name="name">
+					<property name="first" column="name_first"/>
+					<property name="initial" column="name_initial"/>
+					<property name="last" column="name_last"/>
+				</component>
+				<property name="nickName"/>
+				<property name="heightInches">
+					<column name="height_centimeters" 
+						not-null="true" 
+						read="height_centimeters / 2.54" 
+						write="? * 2.54"/>
+				</property>   
+				<property name="intValue"/>
+				<property name="floatValue"/>
+				<property name="bigDecimalValue"/>
+				<property name="bigIntegerValue"/>
+
+				<bag name="friends">
+					<key column="human1"/>
+					<many-to-many column="human2" class="Human"/>
+				</bag>
+				<map name="family">
+					<key column="human1"/>
+					<map-key column="relationship" type="string"/>
+					<many-to-many column="human2" class="Human"/>
+				</map>
+				<bag name="pets" inverse="true">
+					<key column="owner"/>
+					<one-to-many class="DomesticAnimal"/>
+				</bag>
+				<set name="nickNames" lazy="false" table="human_nick_names" sort="natural">
+					<key column="human"/>
+					<element column="nick_name" type="string" not-null="true"/>
+				</set>
+				<map name="addresses" table="addresses">
+					<key column="human"/>
+					<map-key type="string" column="type"/>
+					<composite-element class="Address">
+						<property name="street"/>
+						<property name="city"/>
+						<property name="postalCode"/>
+						<property name="country"/>
+                        <many-to-one name="stateProvince" column="state_prov_id" class="StateProvince"/>
+					</composite-element>
+				</map>
+			</joined-subclass>
+		</joined-subclass>
+	</class>
+
+	<class name="User" table="`User`">
+		<id name="id">
+			<generator class="foreign">
+				<param name="property">human</param>
+			</generator>
+		</id>
+		<property name="userName"/>
+		<one-to-one name="human" constrained="true"/>
+		<list name="permissions">
+			<key column="userId"/>
+			<list-index column="permissionId"/>
+			<element type="string" column="permissionName"/>
+		</list>
+	</class>
+
+	<class name="Zoo" discriminator-value="Z">
+		<id name="id">
+			<generator class="native"/>
+		</id>
+		<discriminator column="zooType" type="character"/>
+		<property name="name" type="string"/>
+        <property name="classification" type="org.hibernate.test.hql.ClassificationType"/>
+        <map name="mammals">
+			<key column="mammalZoo_id"/>
+			<index type="string" column="name"/>
+			<one-to-many class="Mammal"/>
+		</map>
+		<map name="animals" inverse="true">
+			<key column="zoo_id"/>
+			<index type="string" column="serialNumber"/>
+			<one-to-many class="Animal"/>
+		</map>
+        <component name="address" class="Address">
+            <property name="street"/>
+            <property name="city"/>
+            <property name="postalCode"/>
+            <property name="country"/>
+            <many-to-one name="stateProvince" column="state_prov_id" class="StateProvince"/>
+        </component>
+		<subclass name="PettingZoo" discriminator-value="P"/>
+	</class>
+
+    <class name="StateProvince">
+        <id name="id">
+            <generator class="native"/>
+        </id>
+        <property name="name"/>
+        <property name="isoCode"/>
+    </class>
+
+	<class name="Joiner">
+		<id name="id">
+			<generator class="native"/>
+		</id>
+		<property name="name"/>
+		<join table="JOINED">
+			<key column="ID"/>
+			<property name="joinedName"/>
+		</join>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Animal.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Animal.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Animal.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Animal.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,99 @@
+//$Id: Animal.java 7445 2005-07-10 16:51:17Z oneovthafew $
+package org.hibernate.test.hql;
+
+import java.util.Set;
+import java.util.HashSet;
+
+/**
+ * @author Gavin King
+ */
+public class Animal {
+	private Long id;
+	private float bodyWeight;
+	private Set offspring;
+	private Animal mother;
+	private Animal father;
+	private String description;
+	private Zoo zoo;
+	private String serialNumber;
+
+	public Animal() {
+	}
+
+	public Animal(String description, float bodyWeight) {
+		this.description = description;
+		this.bodyWeight = bodyWeight;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public float getBodyWeight() {
+		return bodyWeight;
+	}
+
+	public void setBodyWeight(float bodyWeight) {
+		this.bodyWeight = bodyWeight;
+	}
+
+	public Set getOffspring() {
+		return offspring;
+	}
+
+	public void addOffspring(Animal offspring) {
+		if ( this.offspring == null ) {
+			this.offspring = new HashSet();
+		}
+
+		this.offspring.add( offspring );
+	}
+
+	public void setOffspring(Set offspring) {
+		this.offspring = offspring;
+	}
+
+	public Animal getMother() {
+		return mother;
+	}
+
+	public void setMother(Animal mother) {
+		this.mother = mother;
+	}
+
+	public Animal getFather() {
+		return father;
+	}
+
+	public void setFather(Animal father) {
+		this.father = father;
+	}
+
+	public String getDescription() {
+		return description;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
+	public Zoo getZoo() {
+		return zoo;
+	}
+
+	public void setZoo(Zoo zoo) {
+		this.zoo = zoo;
+	}
+
+	public String getSerialNumber() {
+		return serialNumber;
+	}
+
+	public void setSerialNumber(String serialNumber) {
+		this.serialNumber = serialNumber;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Animal.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/BooleanLiteralEntity.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/BooleanLiteralEntity.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/BooleanLiteralEntity.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<hibernate-mapping package="org.hibernate.test.hql" default-access="field">
+
+	<class name="BooleanLiteralEntity">
+		<id name="id">
+			<generator class="native"/>
+		</id>
+        <property name="yesNoBoolean" column="Y_N_BOOL" type="yes_no"/>
+        <property name="trueFalseBoolean" column="T_F_BOOL" type="true_false"/>
+        <property name="zeroOneBoolean" column="NUM_BOOL" type="boolean"/>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/BooleanLiteralEntity.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/BooleanLiteralEntity.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/BooleanLiteralEntity.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/BooleanLiteralEntity.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,45 @@
+package org.hibernate.test.hql;
+
+/**
+ * todo: describe BooleanLiteralEntity
+ *
+ * @author Steve Ebersole
+ */
+public class BooleanLiteralEntity {
+	private Long id;
+	private boolean yesNoBoolean;
+	private boolean trueFalseBoolean;
+	private boolean zeroOneBoolean;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public boolean isYesNoBoolean() {
+		return yesNoBoolean;
+	}
+
+	public void setYesNoBoolean(boolean yesNoBoolean) {
+		this.yesNoBoolean = yesNoBoolean;
+	}
+
+	public boolean isTrueFalseBoolean() {
+		return trueFalseBoolean;
+	}
+
+	public void setTrueFalseBoolean(boolean trueFalseBoolean) {
+		this.trueFalseBoolean = trueFalseBoolean;
+	}
+
+	public boolean isZeroOneBoolean() {
+		return zeroOneBoolean;
+	}
+
+	public void setZeroOneBoolean(boolean zeroOneBoolean) {
+		this.zeroOneBoolean = zeroOneBoolean;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/BooleanLiteralEntity.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/BulkManipulationTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/BulkManipulationTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/BulkManipulationTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,1233 @@
+// $Id: BulkManipulationTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.hql;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.QueryException;
+import org.hibernate.Transaction;
+import org.hibernate.classic.Session;
+import org.hibernate.dialect.MySQLDialect;
+import org.hibernate.hql.ast.HqlSqlWalker;
+import org.hibernate.id.IdentifierGenerator;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.persister.entity.EntityPersister;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * Tests execution of bulk UPDATE/DELETE statements through the new AST parser.
+ *
+ * @author Steve Ebersole
+ */
+public class BulkManipulationTest extends FunctionalTestCase {
+
+	private static final Logger log = LoggerFactory.getLogger( BulkManipulationTest.class );
+
+	public BulkManipulationTest(String name) {
+		super( name );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( BulkManipulationTest.class );
+	}
+
+	public String[] getMappings() {
+		return new String[] {
+				"hql/Animal.hbm.xml",
+		        "hql/Vehicle.hbm.xml",
+		        "hql/KeyManyToOneEntity.hbm.xml",
+		        "hql/Versions.hbm.xml",
+				"hql/FooBarCopy.hbm.xml",
+				"legacy/Multi.hbm.xml",
+				"hql/EntityWithCrazyCompositeKey.hbm.xml",
+				"hql/SimpleEntityWithAssociation.hbm.xml",
+				"hql/BooleanLiteralEntity.hbm.xml"
+		};
+	}
+
+
+	// Non-exists ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+	public void testDeleteNonExistentEntity() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		try {
+			s.createQuery( "delete NonExistentEntity" ).executeUpdate();
+			fail( "no exception thrown" );
+		}
+		catch( QueryException e ) {
+			log.debug( "Caught expected error type : " + e.getMessage() );
+		}
+
+		t.commit();
+		s.close();
+	}
+
+	public void testUpdateNonExistentEntity() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		try {
+			s.createQuery( "update NonExistentEntity e set e.someProp = ?" ).executeUpdate();
+			fail( "no exception thrown" );
+		}
+		catch( QueryException e ) {
+			log.debug( "Caught expected error type : " + e.getMessage() );
+		}
+
+		t.commit();
+		s.close();
+	}
+
+	public void testTempTableGenerationIsolation() throws Throwable{
+		Session s = openSession();
+		s.beginTransaction();
+
+		Truck truck = new Truck();
+		truck.setVin( "123t" );
+		truck.setOwner( "Steve" );
+		s.save( truck );
+
+		// manually flush the session to ensure the insert happens
+		s.flush();
+
+		// now issue a bulk delete against Car which should force the temp table to be
+		// created.  we need to test to ensure that this does not cause the transaction
+		// to be committed...
+		s.createQuery( "delete from Vehicle" ).executeUpdate();
+
+		s.getTransaction().rollback();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		List list = s.createQuery( "from Car" ).list();
+		assertEquals( "temp table gen caused premature commit", 0, list.size() );
+		s.createQuery( "delete from Car" ).executeUpdate();
+		s.getTransaction().rollback();
+		s.close();
+	}
+
+
+	// BOOLEAN HANDLING ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+	public void testBooleanHandling() {
+		TestData data = new TestData();
+		data.prepare();
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		// currently, we need the three different binds because they are different underlying types...
+		int count = s.createQuery( "update BooleanLiteralEntity set yesNoBoolean = :b1, trueFalseBoolean = :b2, zeroOneBoolean = :b3" )
+				.setBoolean( "b1", true )
+				.setBoolean( "b2", true )
+				.setBoolean( "b3", true )
+				.executeUpdate();
+		assertEquals( 1, count );
+		BooleanLiteralEntity entity = ( BooleanLiteralEntity ) s.createQuery( "from BooleanLiteralEntity" ).uniqueResult();
+		assertTrue( entity.isYesNoBoolean() );
+		assertTrue( entity.isTrueFalseBoolean() );
+		assertTrue( entity.isZeroOneBoolean() );
+		s.clear();
+
+		count = s.createQuery( "update BooleanLiteralEntity set yesNoBoolean = true, trueFalseBoolean = true, zeroOneBoolean = true" )
+				.executeUpdate();
+		assertEquals( 1, count );
+		entity = ( BooleanLiteralEntity ) s.createQuery( "from BooleanLiteralEntity" ).uniqueResult();
+		assertTrue( entity.isYesNoBoolean() );
+		assertTrue( entity.isTrueFalseBoolean() );
+		assertTrue( entity.isZeroOneBoolean() );
+
+		t.commit();
+		s.close();
+
+		data.cleanup();
+	}
+
+
+	// INSERTS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+	public void testSimpleInsert() {
+		TestData data = new TestData();
+		data.prepare();
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		s.createQuery( "insert into Pickup (id, vin, owner) select id, vin, owner from Car" ).executeUpdate();
+		
+		t.commit();
+		t = s.beginTransaction();
+
+		s.createQuery( "delete Vehicle" ).executeUpdate();
+		
+		t.commit();
+		s.close();
+
+		data.cleanup();
+	}
+
+	public void testSimpleNativeSQLInsert() {
+		TestData data = new TestData();
+		data.prepare();
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		List l = s.createQuery("from Vehicle").list();
+		assertEquals(l.size(),4);
+
+		s.createSQLQuery( "insert into Pickup (id, vin, owner) select id, vin, owner from Car" ).executeUpdate();
+
+		l = s.createQuery("from Vehicle").list();
+		assertEquals(l.size(),5);
+
+		t.commit();
+		t = s.beginTransaction();
+
+		s.createSQLQuery( "delete from Truck" ).executeUpdate();
+
+		l = s.createQuery("from Vehicle").list();
+		assertEquals(l.size(),4);
+
+		Car c = (Car) s.createQuery( "from Car where owner = 'Kirsten'" ).uniqueResult();
+		c.setOwner("NotKirsten");
+		assertEquals(0,s.getNamedQuery( "native-delete-car" ).setString( 0, "Kirsten" ).executeUpdate());
+		assertEquals(1,s.getNamedQuery( "native-delete-car" ).setString( 0, "NotKirsten" ).executeUpdate());
+		
+		
+		assertEquals(0,s.createSQLQuery( "delete from SUV where owner = :owner" ).setString( "owner", "NotThere" ).executeUpdate());
+		assertEquals(1,s.createSQLQuery( "delete from SUV where owner = :owner" ).setString( "owner", "Joe" ).executeUpdate());
+		s.createSQLQuery( "delete from Pickup" ).executeUpdate();
+
+		l = s.createQuery("from Vehicle").list();
+		assertEquals(l.size(),0);
+
+
+		t.commit();
+		s.close();
+
+
+		data.cleanup();
+	}
+	
+	public void testInsertWithManyToOne() {
+		TestData data = new TestData();
+		data.prepare();
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		s.createQuery( "insert into Animal (description, bodyWeight, mother) select description, bodyWeight, mother from Human" ).executeUpdate();
+
+		t.commit();
+		t = s.beginTransaction();
+
+		t.commit();
+		s.close();
+
+		data.cleanup();
+	}
+
+	public void testInsertWithMismatchedTypes() {
+		TestData data = new TestData();
+		data.prepare();
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		try {
+			s.createQuery( "insert into Pickup (owner, vin, id) select id, vin, owner from Car" ).executeUpdate();
+			fail( "mismatched types did not error" );
+		}
+		catch( QueryException e ) {
+			// expected result
+		}
+
+		t.commit();
+		t = s.beginTransaction();
+
+		s.createQuery( "delete Vehicle" ).executeUpdate();
+
+		t.commit();
+		s.close();
+
+		data.cleanup();
+	}
+
+	public void testInsertIntoSuperclassPropertiesFails() {
+		TestData data = new TestData();
+		data.prepare();
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		try {
+			s.createQuery( "insert into Human (id, bodyWeight) select id, bodyWeight from Lizard" ).executeUpdate();
+			fail( "superclass prop insertion did not error" );
+		}
+		catch( QueryException e ) {
+			// expected result
+		}
+
+		t.commit();
+		t = s.beginTransaction();
+
+		s.createQuery( "delete Animal where mother is not null" ).executeUpdate();
+		s.createQuery( "delete Animal where father is not null" ).executeUpdate();
+		s.createQuery( "delete Animal" ).executeUpdate();
+
+		t.commit();
+		s.close();
+
+		data.cleanup();
+	}
+
+	public void testInsertAcrossMappedJoinFails() {
+		TestData data = new TestData();
+		data.prepare();
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		try {
+			s.createQuery( "insert into Joiner (name, joinedName) select vin, owner from Car" ).executeUpdate();
+			fail( "mapped-join insertion did not error" );
+		}
+		catch( QueryException e ) {
+			// expected result
+		}
+
+		t.commit();
+		t = s.beginTransaction();
+
+		s.createQuery( "delete Joiner" ).executeUpdate();
+		s.createQuery( "delete Vehicle" ).executeUpdate();
+
+		t.commit();
+		s.close();
+
+		data.cleanup();
+	}
+
+	protected boolean supportsBulkInsertIdGeneration(Class entityClass) {
+		EntityPersister persister = sfi().getEntityPersister( entityClass.getName() );
+		IdentifierGenerator generator = persister.getIdentifierGenerator();
+		return HqlSqlWalker.supportsIdGenWithBulkInsertion( generator );
+	}
+
+	public void testInsertWithGeneratedId() {
+		// Make sure the env supports bulk inserts with generated ids...
+		if ( !supportsBulkInsertIdGeneration( PettingZoo.class ) ) {
+			reportSkip( "bulk id generation not supported", "test bulk inserts with generated id and generated timestamp");
+			return;
+		}
+
+		// create a Zoo
+		Zoo zoo = new Zoo();
+		zoo.setName( "zoo" );
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.save( zoo );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		int count = s.createQuery( "insert into PettingZoo (name) select name from Zoo" ).executeUpdate();
+		t.commit();
+		s.close();
+
+		assertEquals( "unexpected insertion count", 1, count );
+
+		s = openSession();
+		t = s.beginTransaction();
+		PettingZoo pz = ( PettingZoo ) s.createQuery( "from PettingZoo" ).uniqueResult();
+		t.commit();
+		s.close();
+
+		assertEquals( zoo.getName(), pz.getName() );
+		assertTrue( !zoo.getId().equals( pz.getId() ) );
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery( "delete Zoo" ).executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	public void testInsertWithGeneratedVersionAndId() {
+		// Make sure the env supports bulk inserts with generated ids...
+		if ( !supportsBulkInsertIdGeneration( IntegerVersioned.class ) ) {
+			reportSkip( "bulk id generation not supported", "test bulk inserts with generated id and generated timestamp");
+			return;
+		}
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		IntegerVersioned entity = new IntegerVersioned( "int-vers" );
+		s.save( entity );
+		s.createQuery( "select id, name, version from IntegerVersioned" ).list();
+		t.commit();
+		s.close();
+
+		Long initialId = entity.getId();
+		int initialVersion = entity.getVersion();
+
+		s = openSession();
+		t = s.beginTransaction();
+		int count = s.createQuery( "insert into IntegerVersioned ( name ) select name from IntegerVersioned" ).executeUpdate();
+		t.commit();
+		s.close();
+
+		assertEquals( "unexpected insertion count", 1, count );
+
+		s = openSession();
+		t = s.beginTransaction();
+		IntegerVersioned created = ( IntegerVersioned ) s.createQuery( "from IntegerVersioned where id <> :initialId" )
+				.setLong( "initialId", initialId.longValue() )
+				.uniqueResult();
+		t.commit();
+		s.close();
+
+		assertEquals( "version was not seeded", initialVersion, created.getVersion() );
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery( "delete IntegerVersioned" ).executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	public void testInsertWithGeneratedTimestampVersion() {
+		// Make sure the env supports bulk inserts with generated ids...
+		if ( !supportsBulkInsertIdGeneration( TimestampVersioned.class ) ) {
+			reportSkip( "bulk id generation not supported", "test bulk inserts with generated id and generated timestamp");
+			return;
+		}
+
+		// dialects which do not allow a parameter in the select portion of an INSERT ... SELECT statement
+		// will also be problematic for this test because the timestamp here is vm-based as opposed to
+		// db-based.
+		if ( ! getDialect().supportsParametersInInsertSelect() ) {
+			reportSkip( "dialect does not support parameter in INSERT ... SELECT",
+				"test bulk inserts with generated id and generated timestamp");
+			return;
+		}
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		TimestampVersioned entity = new TimestampVersioned( "int-vers" );
+		s.save( entity );
+		s.createQuery( "select id, name, version from TimestampVersioned" ).list();
+		t.commit();
+		s.close();
+
+		Long initialId = entity.getId();
+		//Date initialVersion = entity.getVersion();
+
+		s = openSession();
+		t = s.beginTransaction();
+		int count = s.createQuery( "insert into TimestampVersioned ( name ) select name from TimestampVersioned" ).executeUpdate();
+		t.commit();
+		s.close();
+
+		assertEquals( "unexpected insertion count", 1, count );
+
+		s = openSession();
+		t = s.beginTransaction();
+		TimestampVersioned created = ( TimestampVersioned ) s.createQuery( "from TimestampVersioned where id <> :initialId" )
+				.setLong( "initialId", initialId.longValue() )
+				.uniqueResult();
+		t.commit();
+		s.close();
+
+		assertNotNull( created.getVersion() );
+		//assertEquals( "version was not seeded", initialVersion, created.getVersion() );
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery( "delete TimestampVersioned" ).executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	public void testInsertWithSelectListUsingJoins() {
+		// this is just checking parsing and syntax...
+		Session s = openSession();
+		s.beginTransaction();
+		s.createQuery( "insert into Animal (description, bodyWeight) select h.description, h.bodyWeight from Human h where h.mother.mother is not null" ).executeUpdate();
+		s.createQuery( "insert into Animal (description, bodyWeight) select h.description, h.bodyWeight from Human h join h.mother m where m.mother is not null" ).executeUpdate();
+		s.createQuery( "delete from Animal" ).executeUpdate();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+
+	// UPDATES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+	public void testIncorrectSyntax() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		try {
+			s.createQuery( "update Human set Human.description = 'xyz' where Human.id = 1 and Human.description is null" );
+			fail( "expected failure" );
+		}
+		catch( QueryException expected ) {
+			// ignore : expected behavior
+		}
+		t.commit();
+		s.close();
+	}
+
+	public void testUpdateWithWhereExistsSubquery() {
+		// multi-table ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Human joe = new Human();
+		joe.setName( new Name( "Joe", 'Q', "Public" ) );
+		s.save( joe );
+		Human doll = new Human();
+		doll.setName( new Name( "Kyu", 'P', "Doll" ) );
+		doll.setFriends( new ArrayList() );
+		doll.getFriends().add( joe );
+		s.save( doll );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		String updateQryString = "update Human h " +
+		                         "set h.description = 'updated' " +
+		                         "where exists (" +
+		                         "      select f.id " +
+		                         "      from h.friends f " +
+		                         "      where f.name.last = 'Public' " +
+		                         ")";
+		int count = s.createQuery( updateQryString ).executeUpdate();
+		assertEquals( 1, count );
+		s.delete( doll );
+		s.delete( joe );
+		t.commit();
+		s.close();
+
+		// single-table (one-to-many & many-to-many) ~~~~~~~~~~~~~~~~~~~~~~~~~~
+		s = openSession();
+		t = s.beginTransaction();
+		SimpleEntityWithAssociation entity = new SimpleEntityWithAssociation();
+		SimpleEntityWithAssociation other = new SimpleEntityWithAssociation();
+		entity.setName( "main" );
+		other.setName( "many-to-many-association" );
+		entity.getManyToManyAssociatedEntities().add( other );
+		entity.addAssociation( "one-to-many-association" );
+		s.save( entity );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		// one-to-many test
+		updateQryString = "update SimpleEntityWithAssociation e " +
+		                         "set e.name = 'updated' " +
+		                         "where exists (" +
+		                         "      select a.id " +
+		                         "      from e.associatedEntities a " +
+		                         "      where a.name = 'one-to-many-association' " +
+		                         ")";
+		count = s.createQuery( updateQryString ).executeUpdate();
+		assertEquals( 1, count );
+		// many-to-many test
+		if ( supportsSubqueryOnMutatingTable() ) {
+			updateQryString = "update SimpleEntityWithAssociation e " +
+									 "set e.name = 'updated' " +
+									 "where exists (" +
+									 "      select a.id " +
+									 "      from e.manyToManyAssociatedEntities a " +
+									 "      where a.name = 'many-to-many-association' " +
+									 ")";
+			count = s.createQuery( updateQryString ).executeUpdate();
+			assertEquals( 1, count );
+		}
+		s.delete( entity.getManyToManyAssociatedEntities().iterator().next() );
+		s.delete( entity );
+		t.commit();
+		s.close();
+	}
+
+	public void testIncrementCounterVersion() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		IntegerVersioned entity = new IntegerVersioned( "int-vers" );
+		s.save( entity );
+		t.commit();
+		s.close();
+
+		int initialVersion = entity.getVersion();
+
+		s = openSession();
+		t = s.beginTransaction();
+		int count = s.createQuery( "update versioned IntegerVersioned set name = name" ).executeUpdate();
+		assertEquals( "incorrect exec count", 1, count );
+		t.commit();
+
+		t = s.beginTransaction();
+		entity = ( IntegerVersioned ) s.load( IntegerVersioned.class, entity.getId() );
+		assertEquals( "version not incremented", initialVersion + 1, entity.getVersion() );
+
+		s.delete( entity );
+		t.commit();
+		s.close();
+	}
+
+	public void testIncrementTimestampVersion() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		TimestampVersioned entity = new TimestampVersioned( "ts-vers" );
+		s.save( entity );
+		t.commit();
+		s.close();
+
+		Date initialVersion = entity.getVersion();
+
+		synchronized (this) {
+			try {
+				wait(1500);
+			}
+			catch (InterruptedException ie) {}
+		}
+
+		s = openSession();
+		t = s.beginTransaction();
+		int count = s.createQuery( "update versioned TimestampVersioned set name = name" ).executeUpdate();
+		assertEquals( "incorrect exec count", 1, count );
+		t.commit();
+
+		t = s.beginTransaction();
+		entity = ( TimestampVersioned ) s.load( TimestampVersioned.class, entity.getId() );
+		assertTrue( "version not incremented", entity.getVersion().after( initialVersion ) );
+
+		s.delete( entity );
+		t.commit();
+		s.close();
+	}
+
+	public void testUpdateOnComponent() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Human human = new Human();
+		human.setName( new Name( "Stevee", 'X', "Ebersole" ) );
+
+		s.save( human );
+		s.flush();
+
+		t.commit();
+
+		String correctName = "Steve";
+
+		t = s.beginTransaction();
+
+		int count = s.createQuery( "update Human set name.first = :correction where id = :id" )
+				.setString( "correction", correctName )
+				.setLong( "id", human.getId().longValue() )
+				.executeUpdate();
+
+		assertEquals( "Incorrect update count", 1, count );
+
+		t.commit();
+
+		t = s.beginTransaction();
+
+		s.refresh( human );
+
+		assertEquals( "Update did not execute properly", correctName, human.getName().getFirst() );
+
+		s.createQuery( "delete Human" ).executeUpdate();
+		t.commit();
+
+		s.close();
+	}
+
+	public void testUpdateOnManyToOne() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		s.createQuery( "update Animal a set a.mother = null where a.id = 2" ).executeUpdate();
+		if ( ! ( getDialect() instanceof MySQLDialect ) ) {
+			// MySQL does not support (even un-correlated) subqueries against the update-mutating table
+			s.createQuery( "update Animal a set a.mother = (from Animal where id = 1) where a.id = 2" ).executeUpdate();
+		}
+
+		t.commit();
+		s.close();
+	}
+
+	public void testUpdateOnImplicitJoinFails() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Human human = new Human();
+		human.setName( new Name( "Steve", 'E', null ) );
+
+		Human mother = new Human();
+		mother.setName( new Name( "Jane", 'E', null ) );
+		human.setMother( mother );
+
+		s.save( human );
+		s.save( mother );
+		s.flush();
+
+		t.commit();
+
+		t = s.beginTransaction();
+		try {
+			s.createQuery( "update Human set mother.name.initial = :initial" ).setString( "initial", "F" ).executeUpdate();
+			fail( "update allowed across implicit join" );
+		}
+		catch( QueryException e ) {
+			log.debug( "TEST (OK) : " + e.getMessage() );
+			// expected condition
+		}
+
+		s.createQuery( "delete Human where mother is not null" ).executeUpdate();
+		s.createQuery( "delete Human" ).executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	public void testUpdateOnDiscriminatorSubclass() {
+		TestData data = new TestData();
+		data.prepare();
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		int count = s.createQuery( "update PettingZoo set name = name" ).executeUpdate();
+		assertEquals( "Incorrect discrim subclass update count", 1, count );
+
+		t.rollback();
+		t = s.beginTransaction();
+
+		count = s.createQuery( "update PettingZoo pz set pz.name = pz.name where pz.id = :id" )
+				.setLong( "id", data.pettingZoo.getId().longValue() )
+				.executeUpdate();
+		assertEquals( "Incorrect discrim subclass update count", 1, count );
+
+		t.rollback();
+		t = s.beginTransaction();
+
+		count = s.createQuery( "update Zoo as z set z.name = z.name" ).executeUpdate();
+		assertEquals( "Incorrect discrim subclass update count", 2, count );
+
+		t.rollback();
+		t = s.beginTransaction();
+
+		// TODO : not so sure this should be allowed.  Seems to me that if they specify an alias,
+		// property-refs should be required to be qualified.
+		count = s.createQuery( "update Zoo as z set name = name where id = :id" )
+				.setLong( "id", data.zoo.getId().longValue() )
+				.executeUpdate();
+		assertEquals( "Incorrect discrim subclass update count", 1, count );
+
+		t.commit();
+		s.close();
+
+		data.cleanup();
+	}
+
+	public void testUpdateOnAnimal() {
+		TestData data = new TestData();
+		data.prepare();
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		int count = s.createQuery( "update Animal set description = description where description = :desc" )
+				.setString( "desc", data.frog.getDescription() )
+				.executeUpdate();
+		assertEquals( "Incorrect entity-updated count", 1, count );
+
+		count = s.createQuery( "update Animal set description = :newDesc where description = :desc" )
+				.setString( "desc", data.polliwog.getDescription() )
+				.setString( "newDesc", "Tadpole" )
+				.executeUpdate();
+		assertEquals( "Incorrect entity-updated count", 1, count );
+
+		Animal tadpole = ( Animal ) s.load( Animal.class, data.polliwog.getId() );
+		assertEquals( "Update did not take effect", "Tadpole", tadpole.getDescription() );
+
+		count = s.createQuery( "update Animal set bodyWeight = bodyWeight + :w1 + :w2" )
+				.setDouble( "w1", 1 )
+				.setDouble( "w2", 2 )
+				.executeUpdate();
+		assertEquals( "incorrect count on 'complex' update assignment", count, 6 );
+
+		if ( ! ( getDialect() instanceof MySQLDialect ) ) {
+			// MySQL does not support (even un-correlated) subqueries against the update-mutating table
+			s.createQuery( "update Animal set bodyWeight = ( select max(bodyWeight) from Animal )" )
+					.executeUpdate();
+		}
+
+		t.commit();
+		s.close();
+
+		data.cleanup();
+	}
+
+	public void testUpdateOnMammal() {
+		TestData data = new TestData();
+		data.prepare();
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		int count = s.createQuery( "update Mammal set description = description" ).executeUpdate();
+		assertEquals( "incorrect update count against 'middle' of joined-subclass hierarchy", 2, count );
+
+		count = s.createQuery( "update Mammal set bodyWeight = 25" ).executeUpdate();
+		assertEquals( "incorrect update count against 'middle' of joined-subclass hierarchy", 2, count );
+
+		if ( ! ( getDialect() instanceof MySQLDialect ) ) {
+			// MySQL does not support (even un-correlated) subqueries against the update-mutating table
+			count = s.createQuery( "update Mammal set bodyWeight = ( select max(bodyWeight) from Animal )" ).executeUpdate();
+			assertEquals( "incorrect update count against 'middle' of joined-subclass hierarchy", 2, count );
+		}
+
+		t.commit();
+		s.close();
+
+		data.cleanup();
+	}
+
+	public void testUpdateSetNullUnionSubclass() {
+		TestData data = new TestData();
+		data.prepare();
+
+		// These should reach out into *all* subclass tables...
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		int count = s.createQuery( "update Vehicle set owner = 'Steve'" ).executeUpdate();
+		assertEquals( "incorrect restricted update count", 4, count );
+		count = s.createQuery( "update Vehicle set owner = null where owner = 'Steve'" ).executeUpdate();
+		assertEquals( "incorrect restricted update count", 4, count );
+
+		count = s.createQuery( "delete Vehicle where owner is null" ).executeUpdate();
+		assertEquals( "incorrect restricted update count", 4, count );
+
+		t.commit();
+		s.close();
+
+		data.cleanup();
+	}
+
+	public void testUpdateSetNullOnDiscriminatorSubclass() {
+		TestData data = new TestData();
+		data.prepare();
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		int count = s.createQuery( "update PettingZoo set address.city = null" ).executeUpdate();
+		assertEquals( "Incorrect discrim subclass delete count", 1, count );
+		count = s.createQuery( "delete Zoo where address.city is null" ).executeUpdate();
+		assertEquals( "Incorrect discrim subclass delete count", 1, count );
+
+		count = s.createQuery( "update Zoo set address.city = null" ).executeUpdate();
+		assertEquals( "Incorrect discrim subclass delete count", 1, count );
+		count = s.createQuery( "delete Zoo where address.city is null" ).executeUpdate();
+		assertEquals( "Incorrect discrim subclass delete count", 1, count );
+
+		t.commit();
+		s.close();
+
+		data.cleanup();
+	}
+
+	public void testUpdateSetNullOnJoinedSubclass() {
+		TestData data = new TestData();
+		data.prepare();
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		int count = s.createQuery( "update Mammal set bodyWeight = null" ).executeUpdate();
+		assertEquals( "Incorrect deletion count on joined subclass", 2, count );
+
+		count = s.createQuery( "delete Animal where bodyWeight = null" ).executeUpdate();
+		assertEquals( "Incorrect deletion count on joined subclass", 2, count );
+
+		t.commit();
+		s.close();
+
+		data.cleanup();
+	}
+
+
+	// DELETES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+	public void testDeleteWithSubquery() {
+		// setup the test data...
+		Session s = openSession();
+		s.beginTransaction();
+		SimpleEntityWithAssociation owner = new SimpleEntityWithAssociation( "myEntity-1" );
+		owner.addAssociation( "assoc-1" );
+		owner.addAssociation( "assoc-2" );
+		owner.addAssociation( "assoc-3" );
+		s.save( owner );
+		SimpleEntityWithAssociation owner2 = new SimpleEntityWithAssociation( "myEntity-2" );
+		owner2.addAssociation( "assoc-1" );
+		owner2.addAssociation( "assoc-2" );
+		owner2.addAssociation( "assoc-3" );
+		owner2.addAssociation( "assoc-4" );
+		s.save( owner2 );
+		SimpleEntityWithAssociation owner3 = new SimpleEntityWithAssociation( "myEntity-3" );
+		s.save( owner3 );
+		s.getTransaction().commit();
+		s.close();
+
+		// now try the bulk delete
+		s = openSession();
+		s.beginTransaction();
+		int count = s.createQuery( "delete SimpleEntityWithAssociation e where size( e.associatedEntities ) = 0 and e.name like '%'" ).executeUpdate();
+		assertEquals( "incorrect delete count", 1, count );
+		s.getTransaction().commit();
+		s.close();
+
+		// finally, clean up
+		s = openSession();
+		s.beginTransaction();
+		s.createQuery( "delete SimpleAssociatedEntity" ).executeUpdate();
+		s.createQuery( "delete SimpleEntityWithAssociation" ).executeUpdate();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testSimpleDeleteOnAnimal() {
+		if ( getDialect().hasSelfReferentialForeignKeyBug() ) {
+			reportSkip( "self referential FK bug", "HQL delete testing" );
+			return;
+		}
+
+		TestData data = new TestData();
+		data.prepare();
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		int count = s.createQuery( "delete from Animal as a where a.id = :id" )
+				.setLong( "id", data.polliwog.getId().longValue() )
+				.executeUpdate();
+		assertEquals( "Incorrect delete count", 1, count );
+
+		count = s.createQuery( "delete Animal where id = :id" )
+				.setLong( "id", data.catepillar.getId().longValue() )
+				.executeUpdate();
+		assertEquals( "incorrect delete count", 1, count );
+
+		// HHH-873...
+		if ( supportsSubqueryOnMutatingTable() ) {
+			count = s.createQuery( "delete from User u where u not in (select u from User u)" ).executeUpdate();
+			assertEquals( 0, count );
+		}
+
+		count = s.createQuery( "delete Animal a" ).executeUpdate();
+		assertEquals( "Incorrect delete count", 4, count );
+
+		List list = s.createQuery( "select a from Animal as a" ).list();
+		assertTrue( "table not empty", list.isEmpty() );
+
+		t.commit();
+		s.close();
+		data.cleanup();
+	}
+
+	public void testDeleteOnDiscriminatorSubclass() {
+		TestData data = new TestData();
+		data.prepare();
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		int count = s.createQuery( "delete PettingZoo" ).executeUpdate();
+		assertEquals( "Incorrect discrim subclass delete count", 1, count );
+
+		count = s.createQuery( "delete Zoo" ).executeUpdate();
+		assertEquals( "Incorrect discrim subclass delete count", 1, count );
+
+		t.commit();
+		s.close();
+
+		data.cleanup();
+	}
+
+	public void testDeleteOnJoinedSubclass() {
+		TestData data = new TestData();
+		data.prepare();
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		int count = s.createQuery( "delete Mammal where bodyWeight > 150" ).executeUpdate();
+		assertEquals( "Incorrect deletion count on joined subclass", 1, count );
+
+		count = s.createQuery( "delete Mammal" ).executeUpdate();
+		assertEquals( "Incorrect deletion count on joined subclass", 1, count );
+
+		count = s.createQuery( "delete SubMulti" ).executeUpdate();
+		assertEquals( "Incorrect deletion count on joined subclass", 0, count );
+
+		t.commit();
+		s.close();
+
+		data.cleanup();
+	}
+
+	public void testDeleteOnMappedJoin() {
+		TestData data = new TestData();
+		data.prepare();
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		int count = s.createQuery( "delete Joiner where joinedName = :joinedName" ).setString( "joinedName", "joined-name" ).executeUpdate();
+		assertEquals( "Incorrect deletion count on joined subclass", 1, count );
+
+		t.commit();
+		s.close();
+
+		data.cleanup();
+	}
+	
+	public void testDeleteUnionSubclassAbstractRoot() {
+		TestData data = new TestData();
+		data.prepare();
+
+		// These should reach out into *all* subclass tables...
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		int count = s.createQuery( "delete Vehicle where owner = :owner" ).setString( "owner", "Steve" ).executeUpdate();
+		assertEquals( "incorrect restricted update count", 1, count );
+
+		count = s.createQuery( "delete Vehicle" ).executeUpdate();
+		assertEquals( "incorrect update count", 3, count );
+		t.commit();
+		s.close();
+
+		data.cleanup();
+	}
+
+	public void testDeleteUnionSubclassConcreteSubclass() {
+		TestData data = new TestData();
+		data.prepare();
+
+		// These should only affect the given table
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		int count = s.createQuery( "delete Truck where owner = :owner" ).setString( "owner", "Steve" ).executeUpdate();
+		assertEquals( "incorrect restricted update count", 1, count );
+
+		count = s.createQuery( "delete Truck" ).executeUpdate();
+		assertEquals( "incorrect update count", 2, count );
+		t.commit();
+		s.close();
+
+		data.cleanup();
+	}
+
+	public void testDeleteUnionSubclassLeafSubclass() {
+		TestData data = new TestData();
+		data.prepare();
+
+		// These should only affect the given table
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		int count = s.createQuery( "delete Car where owner = :owner" ).setString( "owner", "Kirsten" ).executeUpdate();
+		assertEquals( "incorrect restricted update count", 1, count );
+
+		count = s.createQuery( "delete Car" ).executeUpdate();
+		assertEquals( "incorrect update count", 0, count );
+		t.commit();
+		s.close();
+
+		data.cleanup();
+	}
+
+	public void testDeleteWithMetadataWhereFragments() throws Throwable {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		// Note: we are just checking the syntax here...
+		s.createQuery("delete from Bar").executeUpdate();
+		s.createQuery("delete from Bar where barString = 's'").executeUpdate();
+
+		t.commit();
+		s.close();
+	}
+
+	public void testDeleteRestrictedOnManyToOne() {
+		TestData data = new TestData();
+		data.prepare();
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		int count = s.createQuery( "delete Animal where mother = :mother" )
+				.setEntity( "mother", data.butterfly )
+				.executeUpdate();
+		assertEquals( 1, count );
+
+		t.commit();
+		s.close();
+
+		data.cleanup();
+	}
+
+	public void testDeleteSyntaxWithCompositeId() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		s.createQuery( "delete EntityWithCrazyCompositeKey where id.id = 1 and id.otherId = 2" ).executeUpdate();
+		s.createQuery( "delete from EntityWithCrazyCompositeKey where id.id = 1 and id.otherId = 2" ).executeUpdate();
+		s.createQuery( "delete from EntityWithCrazyCompositeKey e where e.id.id = 1 and e.id.otherId = 2" ).executeUpdate();
+
+		t.commit();
+		s.close();
+	}
+
+	private class TestData {
+
+		private Animal polliwog;
+		private Animal catepillar;
+		private Animal frog;
+		private Animal butterfly;
+
+		private Zoo zoo;
+		private Zoo pettingZoo;
+
+		private void prepare() {
+			Session s = openSession();
+			Transaction txn = s.beginTransaction();
+
+			polliwog = new Animal();
+			polliwog.setBodyWeight( 12 );
+			polliwog.setDescription( "Polliwog" );
+
+			catepillar = new Animal();
+			catepillar.setBodyWeight( 10 );
+			catepillar.setDescription( "Catepillar" );
+
+			frog = new Animal();
+			frog.setBodyWeight( 34 );
+			frog.setDescription( "Frog" );
+
+			polliwog.setFather( frog );
+			frog.addOffspring( polliwog );
+
+			butterfly = new Animal();
+			butterfly.setBodyWeight( 9 );
+			butterfly.setDescription( "Butterfly" );
+
+			catepillar.setMother( butterfly );
+			butterfly.addOffspring( catepillar );
+
+			s.save( frog );
+			s.save( polliwog );
+			s.save( butterfly );
+			s.save( catepillar );
+
+			Dog dog = new Dog();
+			dog.setBodyWeight( 200 );
+			dog.setDescription( "dog" );
+			s.save( dog );
+
+			Cat cat = new Cat();
+			cat.setBodyWeight( 100 );
+			cat.setDescription( "cat" );
+			s.save( cat );
+
+			zoo = new Zoo();
+			zoo.setName( "Zoo" );
+			Address add = new Address();
+			add.setCity("MEL");
+			add.setCountry("AU");
+			add.setStreet("Main st");
+			add.setPostalCode("3000");
+			zoo.setAddress(add);
+			
+			pettingZoo = new PettingZoo();
+			pettingZoo.setName( "Petting Zoo" );
+			Address addr = new Address();
+			addr.setCity("Sydney");
+			addr.setCountry("AU");
+			addr.setStreet("High st");
+			addr.setPostalCode("2000");
+			pettingZoo.setAddress(addr);
+
+			s.save( zoo );
+			s.save( pettingZoo );
+
+			Joiner joiner = new Joiner();
+			joiner.setJoinedName( "joined-name" );
+			joiner.setName( "name" );
+			s.save( joiner );
+
+			Car car = new Car();
+			car.setVin( "123c" );
+			car.setOwner( "Kirsten" );
+			s.save( car );
+
+			Truck truck = new Truck();
+			truck.setVin( "123t" );
+			truck.setOwner( "Steve" );
+			s.save( truck );
+
+			SUV suv = new SUV();
+			suv.setVin( "123s" );
+			suv.setOwner( "Joe" );
+			s.save( suv );
+
+			Pickup pickup = new Pickup();
+			pickup.setVin( "123p" );
+			pickup.setOwner( "Cecelia" );
+			s.save( pickup );
+
+			BooleanLiteralEntity bool = new BooleanLiteralEntity();
+			s.save( bool );
+
+			txn.commit();
+			s.close();
+		}
+
+		private void cleanup() {
+			Session s = openSession();
+			Transaction txn = s.beginTransaction();
+
+			// workaround awesome HSQLDB "feature"
+			s.createQuery( "delete from Animal where mother is not null or father is not null" ).executeUpdate();
+			s.createQuery( "delete from Animal" ).executeUpdate();
+			s.createQuery( "delete from Zoo" ).executeUpdate();
+			s.createQuery( "delete from Joiner" ).executeUpdate();
+			s.createQuery( "delete from Vehicle" ).executeUpdate();
+			s.createQuery( "delete from BooleanLiteralEntity" ).executeUpdate();
+
+			txn.commit();
+			s.close();
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/BulkManipulationTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Car.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Car.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Car.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,10 @@
+// $Id: Car.java 7087 2005-06-08 18:23:44Z steveebersole $
+package org.hibernate.test.hql;
+
+/**
+ * Implementation of Car.
+ *
+ * @author Steve Ebersole
+ */
+public class Car extends Vehicle {
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Car.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Cat.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Cat.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Cat.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,9 @@
+//$Id: Cat.java 4476 2004-09-02 02:28:13Z oneovthafew $
+package org.hibernate.test.hql;
+
+/**
+ * @author Gavin King
+ */
+public class Cat extends DomesticAnimal {
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Cat.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/ClassicTranslatorTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/ClassicTranslatorTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/ClassicTranslatorTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,64 @@
+package org.hibernate.test.hql;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.hql.classic.ClassicQueryTranslatorFactory;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Some simple test queries using the classic translator explicitly
+ * to ensure that code is not broken in changes for the new translator.
+ * <p/>
+ * Only really checking translation and syntax, not results.
+ *
+ * @author Steve Ebersole
+ */
+public class ClassicTranslatorTest extends QueryTranslatorTestCase {
+
+	public ClassicTranslatorTest(String x) {
+		super( x );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( ClassicTranslatorTest.class );
+	}
+
+	public void configure(Configuration cfg) {
+		super.configure( cfg );
+		cfg.setProperty( Environment.QUERY_TRANSLATOR, ClassicQueryTranslatorFactory.class.getName() );
+	}
+
+
+	public boolean createSchema() {
+		return true;
+	}
+
+	public boolean recreateSchemaAfterFailure() {
+		return true;
+	}
+
+	public void testQueries() {
+		Session session = openSession();
+		session.beginTransaction();
+
+		session.createQuery( "from Animal" ).list();
+
+		session.createQuery( "select a from Animal as a" ).list();
+		session.createQuery( "select a.mother from Animal as a" ).list();
+		session.createQuery( "select m from Animal as a inner join a.mother as m" ).list();
+		session.createQuery( "select a from Animal as a inner join fetch a.mother" ).list();
+
+		session.createQuery( "from Animal as a where a.description = ?" ).setString( 0, "jj" ).list();
+		session.createQuery( "from Animal as a where a.description = :desc" ).setString( "desc", "jr" ).list();
+		session.createQuery( "from Animal as a where a.description = ? or a.description = :desc" )
+				.setString( 0, "jj" )
+				.setString( "desc", "jr" )
+				.list();
+
+		session.getTransaction().commit();
+		session.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/ClassicTranslatorTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Classification.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Classification.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Classification.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,78 @@
+package org.hibernate.test.hql;
+
+import java.io.Serializable;
+import java.util.HashMap;
+
+/**
+ * Mimic a JDK 5 enum.
+ *
+ * @author Steve Ebersole
+ */
+public class Classification implements Serializable, Comparable {
+
+	public static final Classification COOL = new Classification( "COOL", 0 );
+	public static final Classification LAME = new Classification( "LAME", 1 );
+
+	private static final HashMap INSTANCES = new HashMap();
+	static {
+		INSTANCES.put( COOL.name, COOL );
+		INSTANCES.put( LAME.name, LAME );
+	}
+
+	private final String name;
+	private final int ordinal;
+	private final int hashCode;
+
+	private Classification(String name, int ordinal) {
+		this.name = name;
+		this.ordinal = ordinal;
+
+		int hashCode = name.hashCode();
+		hashCode = 29 * hashCode + ordinal;
+		this.hashCode = hashCode;
+	}
+
+	public String name() {
+		return name;
+	}
+
+	public int ordinal() {
+		return ordinal;
+	}
+
+	public boolean equals(Object obj) {
+		return compareTo( obj ) == 0;
+	}
+
+	public int compareTo(Object o) {
+		int otherOrdinal = ( ( Classification ) o ).ordinal;
+		if ( ordinal == otherOrdinal ) {
+			return 0;
+		}
+		else if ( ordinal > otherOrdinal ) {
+			return 1;
+		}
+		else {
+			return -1;
+		}
+	}
+
+	public int hashCode() {
+		return hashCode;
+	}
+
+	public static Classification valueOf(String name) {
+		return ( Classification ) INSTANCES.get( name );
+	}
+
+	public static Classification valueOf(Integer ordinal) {
+		if ( ordinal == null ) {
+			return null;
+		}
+		switch ( ordinal.intValue() ) {
+			case 0: return COOL;
+			case 1: return LAME;
+			default: throw new IllegalArgumentException( "unknown classification ordinal [" + ordinal + "]" );
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Classification.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/ClassificationType.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/ClassificationType.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/ClassificationType.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,102 @@
+package org.hibernate.test.hql;
+
+import org.hibernate.type.IntegerType;
+import org.hibernate.usertype.EnhancedUserType;
+import org.hibernate.HibernateException;
+import org.hibernate.Hibernate;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.PreparedStatement;
+import java.sql.Types;
+import java.io.Serializable;
+
+/**
+ * A custom type for mapping {@link org.hibernate.test.hql.Classification} instances
+ * to the respective db column.
+ * </p>
+ * THis is largely intended to mimic JDK5 enum support in JPA.  Here we are
+ * using the approach of storing the ordinal values, rather than the names.
+ *
+ * @author Steve Ebersole
+ */
+public class ClassificationType implements EnhancedUserType {
+
+	public int[] sqlTypes() {
+		return new int[] { Types.TINYINT };
+	}
+
+	public Class returnedClass() {
+		return Classification.class;
+	}
+
+	public boolean equals(Object x, Object y) throws HibernateException {
+		if ( x == null && y == null ) {
+			return false;
+		}
+		else if ( x != null ) {
+			return x.equals( y );
+		}
+		else {
+			return y.equals( x );
+		}
+	}
+
+	public int hashCode(Object x) throws HibernateException {
+		return x.hashCode();
+	}
+
+	public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
+		Integer ordinal = ( Integer ) IntegerType.INSTANCE.nullSafeGet( rs, names[0] );
+		return Classification.valueOf( ordinal );
+	}
+
+	public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
+		Integer ordinal = value == null ? null : new Integer( ( ( Classification ) value ).ordinal() );
+		Hibernate.INTEGER.nullSafeSet( st, ordinal, index );
+	}
+
+	public Object deepCopy(Object value) throws HibernateException {
+		return value;
+	}
+
+	public boolean isMutable() {
+		return false;
+	}
+
+	public Serializable disassemble(Object value) throws HibernateException {
+		return ( Classification ) value;
+	}
+
+	public Object assemble(Serializable cached, Object owner) throws HibernateException {
+		return cached;
+	}
+
+	public Object replace(Object original, Object target, Object owner) throws HibernateException {
+		return original;
+	}
+
+	public String objectToSQLString(Object value) {
+		return extractOrdinalString( value );
+	}
+
+	public String toXMLString(Object value) {
+		return extractName( value );
+	}
+
+	public Object fromXMLString(String xmlValue) {
+		return Classification.valueOf( xmlValue );
+	}
+
+	private String extractName(Object obj) {
+		return ( ( Classification ) obj ).name();
+	}
+
+	private int extractOrdinal(Object value) {
+		return ( ( Classification ) value ).ordinal();
+	}
+
+	private String extractOrdinalString(Object value) {
+		return Integer.toString( extractOrdinal( value ) );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/ClassificationType.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/ComponentContainer.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/ComponentContainer.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/ComponentContainer.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<hibernate-mapping package="org.hibernate.test.hql" default-access="field">
+
+    <class name="ComponentContainer" table="HQL_COMP_CONT">
+        <id name="id" type="long" column="ID">
+            <generator class="increment" />
+        </id>
+        <component name="address" class="ComponentContainer$Address">
+            <property name="street" type="string" column="STREET_ADDR" />
+            <property name="city" type="string" column="CITY_ADDR" />
+            <property name="state" type="string" column="STATE_ADDR" />
+            <component name="zip" class="ComponentContainer$Address$Zip">
+                <property name="code" type="int" column="ZIP_CODE_ADDR" />
+                <property name="plus4" type="int" column="ZIP_PLUS4_ADDR" />
+            </component>
+        </component>
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/ComponentContainer.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/ComponentContainer.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/ComponentContainer.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/ComponentContainer.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,114 @@
+package org.hibernate.test.hql;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class ComponentContainer {
+
+	private Long id;
+	private ComponentContainer.Address address;
+
+	public ComponentContainer() {
+	}
+
+	public ComponentContainer(Address address) {
+		this.address = address;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public ComponentContainer.Address getAddress() {
+		return address;
+	}
+
+	public void setAddress(ComponentContainer.Address address) {
+		this.address = address;
+	}
+
+	public static class Address {
+		private String street;
+		private String city;
+		private String state;
+		private ComponentContainer.Address.Zip zip;
+
+		public Address() {
+		}
+
+		public Address(String street, String city, String state, ComponentContainer.Address.Zip zip) {
+			this.street = street;
+			this.city = city;
+			this.state = state;
+			this.zip = zip;
+		}
+
+		public String getStreet() {
+			return street;
+		}
+
+		public void setStreet(String street) {
+			this.street = street;
+		}
+
+		public String getCity() {
+			return city;
+		}
+
+		public void setCity(String city) {
+			this.city = city;
+		}
+
+		public String getState() {
+			return state;
+		}
+
+		public void setState(String state) {
+			this.state = state;
+		}
+
+		public ComponentContainer.Address.Zip getZip() {
+			return zip;
+		}
+
+		public void setZip(ComponentContainer.Address.Zip zip) {
+			this.zip = zip;
+		}
+
+		public static class Zip {
+			private int code;
+			private int plus4;
+
+			public Zip() {
+			}
+
+			public Zip(int code, int plus4) {
+				this.code = code;
+				this.plus4 = plus4;
+			}
+
+			public int getCode() {
+				return code;
+			}
+
+			public void setCode(int code) {
+				this.code = code;
+			}
+
+			public int getPlus4() {
+				return plus4;
+			}
+
+			public void setPlus4(int plus4) {
+				this.plus4 = plus4;
+			}
+		}
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/ComponentContainer.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/CrazyCompositeKey.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/CrazyCompositeKey.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/CrazyCompositeKey.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,40 @@
+// $Id: CrazyCompositeKey.java 6970 2005-05-31 20:24:41Z oneovthafew $
+package org.hibernate.test.hql;
+
+import java.io.Serializable;
+
+/**
+ * Implementation of CrazyCompositeKey.
+ *
+ * @author Steve Ebersole
+ */
+public class CrazyCompositeKey implements Serializable {
+	private Long id;
+	private Long otherId;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Long getOtherId() {
+		return otherId;
+	}
+
+	public void setOtherId(Long otherId) {
+		this.otherId = otherId;
+	}
+	
+	public boolean equals(Object that) {
+		CrazyCompositeKey cck = (CrazyCompositeKey) that;
+		return cck.id.longValue() == id.longValue()
+			&& cck.otherId.longValue() == otherId.longValue();
+	}
+	
+	public int hashCode() {
+		return id.hashCode() + otherId.hashCode();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/CrazyCompositeKey.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/CrazyIdFieldNames.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/CrazyIdFieldNames.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/CrazyIdFieldNames.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+
+<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<hibernate-mapping package="org.hibernate.test.hql">
+
+    <class name="HeresAnotherCrazyIdFieldName" table="CRAZY_ID_NODE">
+        <id name="heresAnotherCrazyIdFieldName" column="ID" type="long">
+            <generator class="increment"/>
+        </id>
+        <property name="name" type="string"/>
+    </class>
+
+    <class name="MoreCrazyIdFieldNameStuffEntity" table="CRAZY_ID_TOP">
+        <id name="moreCrazyIdFieldNameStuffEntity" column="ID" type="long">
+            <generator class="increment"/>
+        </id>
+        <property name="name" type="string" />
+        <many-to-one name="heresAnotherCrazyIdFieldName" class="HeresAnotherCrazyIdFieldName"/>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/CrazyIdFieldNames.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/CriteriaClassicAggregationReturnTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/CriteriaClassicAggregationReturnTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/CriteriaClassicAggregationReturnTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,107 @@
+package org.hibernate.test.hql;
+
+import java.util.Collections;
+
+import junit.framework.Test;
+
+import org.hibernate.cfg.Configuration;
+import org.hibernate.dialect.function.ClassicCountFunction;
+import org.hibernate.dialect.function.ClassicAvgFunction;
+import org.hibernate.dialect.function.ClassicSumFunction;
+import org.hibernate.hql.ast.QueryTranslatorImpl;
+import org.hibernate.hql.QueryTranslator;
+import org.hibernate.hql.QueryTranslatorFactory;
+import org.hibernate.hql.classic.ClassicQueryTranslatorFactory;
+import org.hibernate.Hibernate;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class CriteriaClassicAggregationReturnTest extends QueryTranslatorTestCase {
+
+	public CriteriaClassicAggregationReturnTest(String x) {
+		super( x );
+	}
+
+	public void configure(Configuration cfg) {
+		super.configure( cfg );
+		cfg.addSqlFunction( "count", new ClassicCountFunction() );
+		cfg.addSqlFunction( "avg", new ClassicAvgFunction() );
+		cfg.addSqlFunction( "sum", new ClassicSumFunction() );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( CriteriaClassicAggregationReturnTest.class );
+	}
+
+	public void testClassicHQLAggregationReturnTypes() {
+		// EJB3: COUNT returns Long
+		QueryTranslatorImpl translator = createNewQueryTranslator( "select count(*) from Human h", sfi() );
+		assertEquals( "incorrect return type count", 1, translator.getReturnTypes().length );
+		assertEquals( "incorrect return type", Hibernate.INTEGER, translator.getReturnTypes()[0] );
+
+		translator = createNewQueryTranslator( "select count(h.heightInches) from Human h", sfi() );
+		assertEquals( "incorrect return type count", 1, translator.getReturnTypes().length );
+		assertEquals( "incorrect return type", Hibernate.INTEGER, translator.getReturnTypes()[0] );
+
+		// MAX, MIN return the type of the state-field to which they are applied.
+		translator = createNewQueryTranslator( "select max(h.heightInches) from Human h", sfi() );
+		assertEquals( "incorrect return type count", 1, translator.getReturnTypes().length );
+		assertEquals( "incorrect return type", Hibernate.DOUBLE, translator.getReturnTypes()[0] );
+
+		translator = createNewQueryTranslator( "select max(h.id) from Human h", sfi() );
+		assertEquals( "incorrect return type count", 1, translator.getReturnTypes().length );
+		assertEquals( "incorrect return type", Hibernate.LONG, translator.getReturnTypes()[0] );
+
+		// AVG returns Float integrals, and otherwise the field type.
+		translator = createNewQueryTranslator( "select avg(h.heightInches) from Human h", sfi() );
+		assertEquals( "incorrect return type count", 1, translator.getReturnTypes().length );
+		assertEquals( "incorrect return type", Hibernate.DOUBLE, translator.getReturnTypes()[0] );
+
+		translator = createNewQueryTranslator( "select avg(h.id) from Human h", sfi() );
+		assertEquals( "incorrect return type count", 1, translator.getReturnTypes().length );
+		assertEquals( "incorrect return type", Hibernate.FLOAT, translator.getReturnTypes()[0] );
+
+		translator = createNewQueryTranslator( "select avg(h.bigIntegerValue) from Human h", sfi() );
+		assertEquals( "incorrect return type count", 1, translator.getReturnTypes().length );
+		assertEquals( "incorrect return type", Hibernate.BIG_INTEGER, translator.getReturnTypes()[0] );
+
+        // SUM returns underlying type sum
+ 	    translator = createNewQueryTranslator( "select sum(h.id) from Human h", sfi() );
+		assertEquals( "incorrect return type count", 1, translator.getReturnTypes().length );
+		assertEquals( "incorrect return type", Hibernate.LONG, translator.getReturnTypes()[0] );
+
+		translator = createNewQueryTranslator( "select sum(h.intValue) from Human h", sfi() );
+		assertEquals( "incorrect return type count", 1, translator.getReturnTypes().length );
+		assertEquals( "incorrect return type", Hibernate.INTEGER, translator.getReturnTypes()[0] );
+
+		translator = createNewQueryTranslator( "select sum(h.heightInches) from Human h", sfi() );
+		assertEquals( "incorrect return type count", 1, translator.getReturnTypes().length );
+		assertEquals( "incorrect return type", Hibernate.DOUBLE, translator.getReturnTypes()[0] );
+
+		translator = createNewQueryTranslator( "select sum(h.floatValue) from Human h", sfi() );
+		assertEquals( "incorrect return type count", 1, translator.getReturnTypes().length );
+		assertEquals( "incorrect return type", Hibernate.FLOAT, translator.getReturnTypes()[0] );
+
+		translator = createNewQueryTranslator( "select sum(h.bigIntegerValue) from Human h", sfi() );
+		assertEquals( "incorrect return type count", 1, translator.getReturnTypes().length );
+		assertEquals( "incorrect return type", Hibernate.BIG_INTEGER, translator.getReturnTypes()[0] );
+
+		translator = createNewQueryTranslator( "select sum(h.bigDecimalValue) from Human h", sfi() );
+		assertEquals( "incorrect return type count", 1, translator.getReturnTypes().length );
+		assertEquals( "incorrect return type", Hibernate.BIG_DECIMAL, translator.getReturnTypes()[0] );
+
+		// special case to test classicquery special case handling of count(*)
+		QueryTranslator oldQueryTranslator = null;
+		String hql = "select count(*) from Human h";
+		QueryTranslatorFactory classic = new ClassicQueryTranslatorFactory();
+		oldQueryTranslator = classic.createQueryTranslator( hql, hql, Collections.EMPTY_MAP, sfi() );
+		oldQueryTranslator.compile( Collections.EMPTY_MAP, true);
+		assertEquals( "incorrect return type count", 1, oldQueryTranslator.getReturnTypes().length );
+		assertEquals( "incorrect return type", Hibernate.INTEGER, oldQueryTranslator.getReturnTypes()[0] );
+
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/CriteriaClassicAggregationReturnTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/CriteriaHQLAlignmentTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/CriteriaHQLAlignmentTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/CriteriaHQLAlignmentTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,338 @@
+//$Id: HQLTest.java 9873 2006-05-04 13:42:48Z max.andersen at jboss.com $
+package org.hibernate.test.hql;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.Collections;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Transaction;
+import org.hibernate.exception.SQLGrammarException;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.classic.Session;
+import org.hibernate.criterion.Projections;
+import org.hibernate.hql.QueryTranslator;
+import org.hibernate.hql.QueryTranslatorFactory;
+import org.hibernate.hql.ast.QueryTranslatorImpl;
+import org.hibernate.hql.ast.tree.SelectClause;
+import org.hibernate.hql.classic.ClassicQueryTranslatorFactory;
+
+/**
+ * Tests cases for ensuring alignment between HQL and Criteria behavior. 
+ *
+ * @author Max Rydahl Andersen
+ */
+public class CriteriaHQLAlignmentTest extends QueryTranslatorTestCase {
+
+	public CriteriaHQLAlignmentTest(String x) {
+		super( x );
+		SelectClause.VERSION2_SQL = true;
+	}
+
+	public boolean createSchema() {
+		return true; // needed for the Criteria return type test
+	}
+
+	public boolean recreateSchemaAfterFailure() {
+		return true;
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( CriteriaHQLAlignmentTest.class );
+	}
+
+	public void testHQLAggregationReturnType() {
+		// EJB3: COUNT returns Long
+		QueryTranslatorImpl translator = createNewQueryTranslator( "select count(*) from Human h" );
+		assertEquals( "incorrect return type count", 1, translator.getReturnTypes().length );
+		assertEquals( "incorrect return type", Hibernate.LONG, translator.getReturnTypes()[0] );
+		
+		translator = createNewQueryTranslator( "select count(h.heightInches) from Human h" );
+		assertEquals( "incorrect return type count", 1, translator.getReturnTypes().length );
+		assertEquals( "incorrect return type", Hibernate.LONG, translator.getReturnTypes()[0] );
+				
+		// MAX, MIN return the type of the state-field to which they are applied. 
+		translator = createNewQueryTranslator( "select max(h.heightInches) from Human h" );
+		assertEquals( "incorrect return type count", 1, translator.getReturnTypes().length );
+		assertEquals( "incorrect return type", Hibernate.DOUBLE, translator.getReturnTypes()[0] );
+		
+		translator = createNewQueryTranslator( "select max(h.id) from Human h" );
+		assertEquals( "incorrect return type count", 1, translator.getReturnTypes().length );
+		assertEquals( "incorrect return type", Hibernate.LONG, translator.getReturnTypes()[0] );
+		
+		// AVG returns Double.
+		translator = createNewQueryTranslator( "select avg(h.heightInches) from Human h" );
+		assertEquals( "incorrect return type count", 1, translator.getReturnTypes().length );
+		assertEquals( "incorrect return type", Hibernate.DOUBLE, translator.getReturnTypes()[0] );
+		
+		translator = createNewQueryTranslator( "select avg(h.id) from Human h" );
+		assertEquals( "incorrect return type count", 1, translator.getReturnTypes().length );
+		assertEquals( "incorrect return type", Hibernate.DOUBLE, translator.getReturnTypes()[0] );
+		
+		translator = createNewQueryTranslator( "select avg(h.bigIntegerValue) from Human h" );
+		assertEquals( "incorrect return type count", 1, translator.getReturnTypes().length );
+		assertEquals( "incorrect return type", Hibernate.DOUBLE, translator.getReturnTypes()[0] );
+		
+        // SUM returns Long when applied to state-fields of integral types (other than BigInteger);
+ 	    translator = createNewQueryTranslator( "select sum(h.id) from Human h" );
+		assertEquals( "incorrect return type count", 1, translator.getReturnTypes().length );
+		assertEquals( "incorrect return type", Hibernate.LONG, translator.getReturnTypes()[0] );
+		
+		translator = createNewQueryTranslator( "select sum(h.intValue) from Human h" );
+		assertEquals( "incorrect return type count", 1, translator.getReturnTypes().length );
+		assertEquals( "incorrect return type", Hibernate.LONG, translator.getReturnTypes()[0] );
+		
+		// SUM returns Double when applied to state-fields of floating point types; 
+		translator = createNewQueryTranslator( "select sum(h.heightInches) from Human h" );
+		assertEquals( "incorrect return type count", 1, translator.getReturnTypes().length );
+		assertEquals( "incorrect return type", Hibernate.DOUBLE, translator.getReturnTypes()[0] );
+
+		translator = createNewQueryTranslator( "select sum(h.floatValue) from Human h" );
+		assertEquals( "incorrect return type count", 1, translator.getReturnTypes().length );
+		assertEquals( "incorrect return type", Hibernate.DOUBLE, translator.getReturnTypes()[0] );
+		
+	    // SUM returns BigInteger when applied to state-fields of type BigInteger 
+		translator = createNewQueryTranslator( "select sum(h.bigIntegerValue) from Human h" );
+		assertEquals( "incorrect return type count", 1, translator.getReturnTypes().length );
+		assertEquals( "incorrect return type", Hibernate.BIG_INTEGER, translator.getReturnTypes()[0] );
+		
+		// SUM and BigDecimal when applied to state-fields of type BigDecimal.
+		translator = createNewQueryTranslator( "select sum(h.bigDecimalValue) from Human h" );
+		assertEquals( "incorrect return type count", 1, translator.getReturnTypes().length );
+		assertEquals( "incorrect return type", Hibernate.BIG_DECIMAL, translator.getReturnTypes()[0] );
+
+		// special case to test classicquery special case handling of count(*)
+		QueryTranslator oldQueryTranslator = null;
+		String hql = "select count(*) from Human h";
+		QueryTranslatorFactory classic = new ClassicQueryTranslatorFactory();
+		oldQueryTranslator = classic.createQueryTranslator( hql, hql, Collections.EMPTY_MAP, getSessionFactoryImplementor() );
+		oldQueryTranslator.compile( Collections.EMPTY_MAP, true);
+		assertEquals( "incorrect return type count", 1, oldQueryTranslator.getReturnTypes().length );
+		assertEquals( "incorrect return type", Hibernate.LONG, oldQueryTranslator.getReturnTypes()[0] );
+
+	}
+	
+	// HHH-1724 Align Criteria with HQL aggregation return types.
+	public void testCriteriaAggregationReturnType() {
+		Session s = openSession();
+		Human human = new Human();
+		human.setBigIntegerValue( new BigInteger("42") );
+		human.setBigDecimalValue( new BigDecimal(45) );
+		s.save(human);
+		s.flush();
+		s.clear();
+		// EJB3: COUNT returns Long
+		Long longValue = (Long) s.createCriteria( Human.class ).setProjection( Projections.rowCount()).uniqueResult();
+		assertEquals(longValue, new Long(1));
+		longValue = (Long) s.createCriteria( Human.class ).setProjection( Projections.count("heightInches")).uniqueResult();
+		assertEquals(longValue, new Long(1));
+		
+		 // MAX, MIN return the type of the state-field to which they are applied. 		
+		Double dblValue = (Double) s.createCriteria( Human.class ).setProjection( Projections.max( "heightInches" )).uniqueResult();
+		assertNotNull(dblValue);
+		
+		longValue = (Long) s.createCriteria( Human.class ).setProjection( Projections.max( "id" )).uniqueResult();
+		assertNotNull(longValue);
+		
+		// AVG returns Double.
+		dblValue = (Double) s.createCriteria( Human.class ).setProjection( Projections.avg( "heightInches" )).uniqueResult();
+		assertNotNull(dblValue);
+		
+		dblValue = (Double) s.createCriteria( Human.class ).setProjection( Projections.avg( "id" )).uniqueResult();
+		assertNotNull(dblValue);
+		
+		dblValue = (Double) s.createCriteria( Human.class ).setProjection( Projections.avg( "bigIntegerValue" )).uniqueResult();
+		assertNotNull(dblValue);
+		
+        // SUM returns Long when applied to state-fields of integral types (other than BigInteger);
+		longValue = (Long) s.createCriteria( Human.class ).setProjection( Projections.sum( "id" )).uniqueResult();
+		assertNotNull(longValue);
+		
+		longValue = (Long) s.createCriteria( Human.class ).setProjection( Projections.sum( "intValue" )).uniqueResult();
+		assertNotNull(longValue);
+		
+		// SUM returns Double when applied to state-fields of floating point types; 
+		dblValue = (Double) s.createCriteria( Human.class ).setProjection( Projections.sum( "heightInches" )).uniqueResult();
+		assertNotNull(dblValue);
+		
+		dblValue = (Double) s.createCriteria( Human.class ).setProjection( Projections.sum( "floatValue" )).uniqueResult();
+		assertNotNull(dblValue);
+		
+	    // SUM returns BigInteger when applied to state-fields of type BigInteger 
+		BigInteger bigIValue = (BigInteger) s.createCriteria( Human.class ).setProjection( Projections.sum( "bigIntegerValue" )).uniqueResult();
+		assertNotNull(bigIValue);
+		
+		// SUM and BigDecimal when applied to state-fields of type BigDecimal.
+		BigDecimal bigDValue = (BigDecimal) s.createCriteria( Human.class ).setProjection( Projections.sum( "bigDecimalValue" )).uniqueResult();
+		assertNotNull(bigDValue);
+		
+		s.delete( human );
+		s.flush();
+		s.close();
+	}
+
+	public void testCountReturnValues() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Human human1 = new Human();
+		human1.setName( new Name( "John", 'Q', "Public" ) );
+		human1.setNickName( "Johnny" );
+		s.save(human1);
+		Human human2 = new Human();
+		human2.setName( new Name( "John", 'A', "Doe" ) );
+		human2.setNickName( "Johnny" );
+		s.save( human2 );
+		Human human3 = new Human();
+		human3.setName( new Name( "John", 'A', "Doe" ) );
+		human3.setNickName( "Jack" );
+		s.save( human3 );
+		Human human4 = new Human();
+		human4.setName( new Name( "John", 'A', "Doe" ) );
+		s.save( human4 );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+
+		Long count = ( Long ) s.createQuery( "select count( * ) from Human" ).uniqueResult();
+		assertEquals( 4, count.longValue() );
+		s.clear();
+		count = ( Long ) s.createCriteria( Human.class )
+				.setProjection( Projections.rowCount() )
+				.uniqueResult();
+		assertEquals( 4, count.longValue() );
+		s.clear();
+
+		count = ( Long ) s.createQuery( "select count( nickName ) from Human" ).uniqueResult();
+		assertEquals( 3, count.longValue() );
+		s.clear();
+		count = ( Long ) s.createCriteria( Human.class )
+				.setProjection( Projections.count( "nickName" ) )
+				.uniqueResult();
+		assertEquals( 3, count.longValue() );
+		s.clear();
+
+		count = ( Long ) s.createQuery( "select count( distinct nickName ) from Human" ).uniqueResult();
+		assertEquals( 2, count.longValue() );
+		s.clear();
+		count = ( Long ) s.createCriteria( Human.class )
+				.setProjection( Projections.count( "nickName" ).setDistinct() )
+				.uniqueResult();
+		assertEquals( 2, count.longValue() );
+		s.clear();
+
+		s = openSession();
+		t = s.beginTransaction();
+		try {
+			count = ( Long ) s.createQuery( "select count( distinct name ) from Human" ).uniqueResult();
+			if ( ! getDialect().supportsTupleDistinctCounts() ) {
+				fail( "expected SQLGrammarException" );
+			}
+			assertEquals( 2, count.longValue() );
+		}
+		catch ( SQLGrammarException ex ) {
+			if ( ! getDialect().supportsTupleDistinctCounts() ) {
+				// expected
+			}
+			else {
+				throw ex;
+			}
+		}
+		finally {
+			t.rollback();
+			s.close();
+		}
+
+		s = openSession();
+		t = s.beginTransaction();
+		try {
+			count = ( Long ) s.createCriteria( Human.class )
+					.setProjection( Projections.count( "name" ).setDistinct() )
+					.uniqueResult();
+			if ( ! getDialect().supportsTupleDistinctCounts() ) {
+				fail( "expected SQLGrammarException" );
+			}
+			assertEquals( 2, count.longValue() );
+		}
+		catch ( SQLGrammarException ex ) {
+			if ( ! getDialect().supportsTupleDistinctCounts() ) {
+				// expected
+			}
+			else {
+				throw ex;
+			}
+		}
+		finally {
+			t.rollback();
+			s.close();
+		}
+
+		s = openSession();
+		t = s.beginTransaction();
+		count = ( Long ) s.createQuery( "select count( distinct name.first ) from Human" ).uniqueResult();
+		assertEquals( 1, count.longValue() );
+		s.clear();
+		count = ( Long ) s.createCriteria( Human.class )
+				.setProjection( Projections.count( "name.first" ).setDistinct() )
+				.uniqueResult();
+		assertEquals( 1, count.longValue() );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		try {
+			count = ( Long ) s.createQuery( "select count( name ) from Human" ).uniqueResult();
+			if ( ! getDialect().supportsTupleCounts() ) {
+				fail( "expected SQLGrammarException" );
+			}
+			assertEquals( 1, count.longValue() );
+		}
+		catch ( SQLGrammarException ex ) {
+			if ( ! getDialect().supportsTupleCounts() ) {
+				// expected
+			}
+			else {
+				throw ex;
+			}
+		}
+		finally {
+			t.rollback();
+			s.close();
+		}
+
+		s = openSession();
+		t = s.beginTransaction();
+		try {
+			count = ( Long ) s.createCriteria( Human.class )
+					.setProjection( Projections.count( "name" ) )
+					.uniqueResult();
+			if ( ! getDialect().supportsTupleCounts() ) {
+				fail( "expected SQLGrammarException" );
+			}
+			assertEquals( 1, count.longValue() );
+		}
+		catch ( SQLGrammarException ex ) {
+			if ( ! getDialect().supportsTupleCounts() ) {
+				// expected
+			}
+			else {
+				throw ex;
+			}
+		}
+		finally {
+			t.rollback();
+			s.close();
+		}
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery( "delete from Human" ).executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/CriteriaHQLAlignmentTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Dog.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Dog.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Dog.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,9 @@
+//$Id: Dog.java 4476 2004-09-02 02:28:13Z oneovthafew $
+package org.hibernate.test.hql;
+
+/**
+ * @author Gavin King
+ */
+public class Dog extends DomesticAnimal {
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Dog.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/DomesticAnimal.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/DomesticAnimal.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/DomesticAnimal.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,17 @@
+//$Id: DomesticAnimal.java 4899 2004-12-06 14:17:24Z pgmjsd $
+package org.hibernate.test.hql;
+
+/**
+ * @author Gavin King
+ */
+public class DomesticAnimal extends Mammal {
+	private Human owner;
+
+	public Human getOwner() {
+		return owner;
+	}
+
+	public void setOwner(Human owner) {
+		this.owner = owner;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/DomesticAnimal.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/EJBQLTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/EJBQLTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/EJBQLTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,308 @@
+//$Id: EJBQLTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.hql;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+import java.util.Collections;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.hql.QueryTranslator;
+import org.hibernate.hql.QueryTranslatorFactory;
+import org.hibernate.hql.antlr.HqlSqlTokenTypes;
+import org.hibernate.hql.ast.ASTQueryTranslatorFactory;
+import org.hibernate.hql.ast.HqlParser;
+import org.hibernate.hql.ast.QueryTranslatorImpl;
+import org.hibernate.hql.ast.util.ASTUtil;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+import antlr.RecognitionException;
+import antlr.TokenStreamException;
+import antlr.collections.AST;
+
+
+/**
+ * @author <a href="mailto:alex at jboss.org">Alexey Loubyansky</a>
+ */
+public class EJBQLTest extends FunctionalTestCase {
+
+	public EJBQLTest(String x) {
+		super( x );
+	}
+
+	public String[] getMappings() {
+		return new String[]{
+			"hql/Animal.hbm.xml",
+			"batchfetch/ProductLine.hbm.xml",
+			"cid/Customer.hbm.xml",
+			"cid/Order.hbm.xml",
+			"cid/LineItem.hbm.xml",
+			"cid/Product.hbm.xml",
+			"legacy/Glarch.hbm.xml",
+			"legacy/Fee.hbm.xml",
+			"legacy/Qux.hbm.xml",
+			"legacy/Fum.hbm.xml",
+			"legacy/Holder.hbm.xml",
+			"legacy/One.hbm.xml",
+			"legacy/FooBar.hbm.xml",
+			"legacy/Many.hbm.xml",
+			"legacy/Baz.hbm.xml",
+			"legacy/Simple.hbm.xml",
+			"legacy/Middle.hbm.xml",
+			"legacy/Category.hbm.xml",
+			"legacy/Multi.hbm.xml",
+			"legacy/Commento.hbm.xml",
+			"legacy/Marelo.hbm.xml",
+			"compositeelement/Parent.hbm.xml",
+			"legacy/Container.hbm.xml",
+		};
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( EJBQLTest.class );
+	}
+
+
+	public boolean createSchema() {
+		return false;
+	}
+
+	public void testEjb3PositionalParameters() throws Exception {
+		QueryTranslatorImpl qt = compile( "from Animal a where a.bodyWeight = ?1" );
+		AST ast = ( AST ) qt.getSqlAST();
+
+		// make certain that the ejb3-positional param got recognized as a named param
+		List namedParams = ASTUtil.collectChildren(
+		        ast,
+		        new ASTUtil.FilterPredicate() {
+			        public boolean exclude(AST n) {
+				        return n.getType() != HqlSqlTokenTypes.NAMED_PARAM;
+			        }
+		        }
+		);
+		assertTrue( "ejb3 positional param not recognized as a named param", namedParams.size() > 0 );
+	}
+
+	/**
+	 * SELECT OBJECT(identifier)
+	 */
+	public void testSelectObjectClause() throws Exception {
+		//parse("select object(m) from Model m");
+		assertEjbqlEqualsHql( "select object(m) from Model m", "from Model m" );
+	}
+
+	/**
+	 * IN(collection_valued_path) identifier
+	 */
+	public void testCollectionMemberDeclaration() throws Exception {
+		String hql = "select o from Animal a inner join a.offspring o";
+		String ejbql = "select object(o) from Animal a, in(a.offspring) o";
+		//parse(hql);
+		//parse(ejbql);
+		assertEjbqlEqualsHql( ejbql, hql );
+	}
+
+	/**
+	 * collection_valued_path IS [NOT] EMPTY
+	 */
+	public void testIsEmpty() throws Exception {
+		//String hql = "from Animal a where not exists (from a.offspring)";
+		String hql = "from Animal a where not exists elements(a.offspring)";
+		String ejbql = "select object(a) from Animal a where a.offspring is empty";
+		//parse(hql);
+		//parse(ejbql);
+		assertEjbqlEqualsHql(ejbql, hql);
+
+		hql = "from Animal a where exists (from a.mother.father.offspring)";
+		ejbql = "select object(a) from Animal a where a.mother.father.offspring is not empty";
+		assertEjbqlEqualsHql( ejbql, hql );
+	}
+
+	/**
+	 * [NOT] MEMBER OF
+	 */
+	public void testMemberOf() throws Exception {
+		String hql = "from Animal a where a.mother in (from a.offspring)";
+		//String hql = "from Animal a where a.mother in elements(a.offspring)";
+		String ejbql = "select object(a) from Animal a where a.mother member of a.offspring";
+		//parse(hql);
+		//parse(ejbql);
+		assertEjbqlEqualsHql( ejbql, hql );
+
+		hql = "from Animal a where a.mother not in (from a.offspring)";
+		//hql = "from Animal a where a.mother not in elements(a.offspring)";
+		ejbql = "select object(a) from Animal a where a.mother not member of a.offspring";
+		//parse(hql);
+		//parse(ejbql);
+		assertEjbqlEqualsHql( ejbql, hql );
+	}
+
+	/**
+	 * Various functions.
+	 * Tests just parsing for now which means it doesn't guarantee that the generated SQL is as expected or even valid.
+	 */
+	public void testEJBQLFunctions() throws Exception {
+		String hql = "select object(a) from Animal a where a.description = concat('1', concat('2','3'), '4'||'5')||0";
+		parse( hql, false );
+		System.out.println( "sql: " + toSql( hql ) );
+
+		hql = "from Animal a where substring(a.description, 1, 3) = :p1";
+		parse( hql, false );
+		System.out.println( "sql: " + toSql( hql ) );
+
+		hql = "select substring(a.description, 1, 3) from Animal a";
+		parse( hql, false );
+		System.out.println( "sql: " + toSql( hql ) );
+
+		hql = "from Animal a where lower(a.description) = :p1";
+		parse( hql, false );
+		System.out.println( "sql: " + toSql( hql ) );
+
+		hql = "select lower(a.description) from Animal a";
+		parse( hql, false );
+		System.out.println( "sql: " + toSql( hql ) );
+
+		hql = "from Animal a where upper(a.description) = :p1";
+		parse( hql, false );
+		System.out.println( "sql: " + toSql( hql ) );
+
+		hql = "select upper(a.description) from Animal a";
+		parse( hql, false );
+		System.out.println( "sql: " + toSql( hql ) );
+
+		hql = "from Animal a where length(a.description) = :p1";
+		parse( hql, false );
+		System.out.println( "sql: " + toSql( hql ) );
+
+		hql = "select length(a.description) from Animal a";
+		parse( hql, false );
+		System.out.println( "sql: " + toSql( hql ) );
+
+		hql = "from Animal a where locate(a.description, 'abc', 2) = :p1";
+		parse( hql, false );
+		System.out.println( "sql: " + toSql( hql ) );
+
+		hql = "select locate(a.description, :p1, 2) from Animal a";
+		parse( hql, false );
+		System.out.println( "sql: " + toSql( hql ) );
+
+		hql = "select object(a) from Animal a where trim(trailing '_' from a.description) = :p1";
+		parse( hql, false );
+		System.out.println( "sql: " + toSql( hql ) );
+
+		hql = "select trim(trailing '_' from a.description) from Animal a";
+		parse( hql, false );
+		System.out.println( "sql: " + toSql( hql ) );
+
+		hql = "select object(a) from Animal a where trim(leading '_' from a.description) = :p1";
+		parse( hql, false );
+		System.out.println( "sql: " + toSql( hql ) );
+
+		hql = "select object(a) from Animal a where trim(both a.description) = :p1";
+		parse( hql, false );
+		System.out.println( "sql: " + toSql( hql ) );
+
+		hql = "select object(a) from Animal a where trim(a.description) = :p1";
+		parse( hql, false );
+		System.out.println( "sql: " + toSql( hql ) );
+
+		hql = "select object(a) from Animal a where abs(a.bodyWeight) = sqrt(a.bodyWeight)";
+		parse( hql, false );
+		System.out.println( "sql: " + toSql( hql ) );
+
+		hql = "select object(a) from Animal a where mod(a.bodyWeight, a.mother.bodyWeight) = :p1";
+		parse( hql, false );
+		System.out.println( "sql: " + toSql( hql ) );
+
+		hql = "select object(a) from Animal a where BIT_LENGTH(a.bodyWeight) = :p1";
+		parse( hql, false );
+		System.out.println( "sql: " + toSql( hql ) );
+
+		hql = "select BIT_LENGTH(a.bodyWeight) from Animal a";
+		parse( hql, false );
+		System.out.println( "sql: " + toSql( hql ) );
+
+		hql = "select object(a) from Animal a where CURRENT_DATE = :p1 or CURRENT_TIME = :p2 or CURRENT_TIMESTAMP = :p3";
+		parse( hql, false );
+		System.out.println( "sql: " + toSql( hql ) );
+
+		// todo the following is not supported
+		//hql = "select CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP from Animal a";
+		//parse(hql, true);
+		//System.out.println("sql: " + toSql(hql));
+
+		hql = "select object(a) from Animal a where a.bodyWeight like '%a%'";
+		parse( hql, false );
+		System.out.println( "sql: " + toSql( hql ) );
+
+		hql = "select object(a) from Animal a where a.bodyWeight not like '%a%'";
+		parse( hql, false );
+		System.out.println( "sql: " + toSql( hql ) );
+
+		hql = "select object(a) from Animal a where a.bodyWeight like '%a%' escape '%'";
+		parse( hql, false );
+		System.out.println( "sql: " + toSql( hql ) );
+	}
+
+	public void testTrueFalse() throws Exception {
+		assertEjbqlEqualsHql( "from Human h where h.pregnant is true", "from Human h where h.pregnant = true" );
+		assertEjbqlEqualsHql( "from Human h where h.pregnant is false", "from Human h where h.pregnant = false" );
+		assertEjbqlEqualsHql( "from Human h where not(h.pregnant is true)", "from Human h where not( h.pregnant=true )" );
+	}
+
+
+	// Private
+
+	private void assertEjbqlEqualsHql(String ejbql, String hql) {
+		QueryTranslatorFactory ast = new ASTQueryTranslatorFactory();
+
+		QueryTranslator queryTranslator = ast.createQueryTranslator( hql, hql, Collections.EMPTY_MAP, sfi() );
+		queryTranslator.compile( Collections.EMPTY_MAP, true );
+		String hqlSql = queryTranslator.getSQLString();
+
+		queryTranslator = ast.createQueryTranslator( ejbql, ejbql, Collections.EMPTY_MAP, sfi() );
+		queryTranslator.compile( Collections.EMPTY_MAP, true );
+		String ejbqlSql = queryTranslator.getSQLString();
+
+		assertEquals( hqlSql, ejbqlSql );
+	}
+
+	private QueryTranslatorImpl compile(String input) {
+		QueryTranslatorFactory ast = new ASTQueryTranslatorFactory();
+		QueryTranslator queryTranslator = ast.createQueryTranslator( input, input, Collections.EMPTY_MAP, sfi() );
+		queryTranslator.compile( Collections.EMPTY_MAP, true );
+
+		return ( QueryTranslatorImpl ) queryTranslator;
+	}
+
+	private AST parse(String input, boolean logging) throws RecognitionException, TokenStreamException {
+		if ( logging ) {
+			System.out.println( "input: ->" + input + "<-" );
+		}
+
+		HqlParser parser = HqlParser.getInstance( input );
+		parser.setFilter( false );
+		parser.statement();
+		AST ast = parser.getAST();
+
+		if ( logging ) {
+			System.out.println( "AST  :  " + ast.toStringTree() + "" );
+			ByteArrayOutputStream baos = new ByteArrayOutputStream();
+			parser.showAst( ast, new PrintStream( baos ) );
+			System.out.println( baos.toString() );
+		}
+
+		assertEquals( "At least one error occurred during parsing!", 0, parser.getParseErrorHandler().getErrorCount() );
+
+		return ast;
+	}
+
+	private String toSql(String hql) {
+		QueryTranslatorFactory ast = new ASTQueryTranslatorFactory();
+		QueryTranslator queryTranslator = ast.createQueryTranslator( hql, hql, Collections.EMPTY_MAP, sfi() );
+		queryTranslator.compile( Collections.EMPTY_MAP, true );
+		return queryTranslator.getSQLString();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/EJBQLTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/EntityWithArgFunctionAsColumn.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/EntityWithArgFunctionAsColumn.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/EntityWithArgFunctionAsColumn.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,56 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.hql;
+
+/**
+ *
+ * @author Gail Badner
+ */
+public class EntityWithArgFunctionAsColumn {
+	private long id;
+	private int lower;
+	private String upper;
+
+	public long getId() {
+		return id;
+	}
+	public void setId(long id) {
+		this.id = id;		
+	}
+
+	public int getLower() {
+		return lower;
+	}
+	public void setLower(int lower) {
+		this.lower = lower;
+	}
+
+	public String getUpper() {
+		return upper;
+	}
+	public void setUpper(String upper) {
+		this.upper = upper;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/EntityWithArgFunctionAsColumn.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/EntityWithCrazyCompositeKey.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/EntityWithCrazyCompositeKey.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/EntityWithCrazyCompositeKey.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<hibernate-mapping package="org.hibernate.test.hql">
+
+	<class name="EntityWithCrazyCompositeKey">
+		<composite-id name="id" class="CrazyCompositeKey">
+			<key-property name="id" column="id"/>
+			<key-property name="otherId" column="other_id"/>
+		</composite-id>
+		<property name="name"/>
+	</class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/EntityWithCrazyCompositeKey.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/EntityWithCrazyCompositeKey.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/EntityWithCrazyCompositeKey.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/EntityWithCrazyCompositeKey.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,28 @@
+// $Id: EntityWithCrazyCompositeKey.java 6567 2005-04-27 17:41:57Z steveebersole $
+package org.hibernate.test.hql;
+
+/**
+ * Implementation of EntityWithCrazyCompositeKey.
+ *
+ * @author Steve Ebersole
+ */
+public class EntityWithCrazyCompositeKey {
+	private CrazyCompositeKey id;
+	private String name;
+
+	public CrazyCompositeKey getId() {
+		return id;
+	}
+
+	public void setId(CrazyCompositeKey id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/EntityWithCrazyCompositeKey.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/EntityWithFunctionAsColumnHolder.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/EntityWithFunctionAsColumnHolder.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/EntityWithFunctionAsColumnHolder.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,67 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.hql;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ *
+ * @author Gail Badner
+ */
+public class EntityWithFunctionAsColumnHolder {
+	private long id;
+	private EntityWithFunctionAsColumnHolder nextHolder;
+	private Set entityWithArgFunctionAsColumns = new HashSet();
+	private Set entityWithNoArgFunctionAsColumns = new HashSet();
+
+	public long getId() {
+		return id;
+	}
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	public EntityWithFunctionAsColumnHolder getNextHolder() {
+		return nextHolder;
+	}
+	public void setNextHolder(EntityWithFunctionAsColumnHolder nextHolder) {
+		this.nextHolder = nextHolder;
+	}
+
+	public Set getEntityWithArgFunctionAsColumns() {
+		return entityWithArgFunctionAsColumns;
+	}
+	public void setEntityWithArgFunctionAsColumns(Set entityWithArgFunctionAsColumns) {
+		this.entityWithArgFunctionAsColumns = entityWithArgFunctionAsColumns;
+	}
+
+	public Set getEntityWithNoArgFunctionAsColumns() {
+		return entityWithNoArgFunctionAsColumns;
+	}
+	public void setEntityWithNoArgFunctionAsColumns(Set entityWithNoArgFunctionAsColumns) {
+		this.entityWithNoArgFunctionAsColumns = entityWithNoArgFunctionAsColumns;
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/EntityWithFunctionAsColumnHolder.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/EntityWithNoArgFunctionAsColumn.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/EntityWithNoArgFunctionAsColumn.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/EntityWithNoArgFunctionAsColumn.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,56 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.hql;
+
+/**
+ *
+ * @author Gail Badner
+ */
+public class EntityWithNoArgFunctionAsColumn {
+	private long id;
+	private String user;
+	private String currentDate;
+
+	public long getId() {
+		return id;
+	}
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	public String getUser() {
+		return user;
+	}
+	public void setUser(String user) {
+		this.user = user;
+	}
+
+	public String getCurrentDate() {
+		return currentDate;
+	}
+	public void setCurrentDate(String currentDate) {
+		this.currentDate = currentDate;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/EntityWithNoArgFunctionAsColumn.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/FooBarCopy.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/FooBarCopy.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/FooBarCopy.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,137 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-lazy="false" package="org.hibernate.test.legacy">
+
+    <!-- a slightly modified copy of FooBar.hbm.xml from the legacy test package -->
+
+    <class
+		name="Foo"
+		table="`foos`"
+		proxy="FooProxy"
+		discriminator-value="F"
+		batch-size="4"
+		dynamic-insert="true"
+		dynamic-update="true"
+		select-before-update="true">
+
+		<id name="key" type="string">
+			<column name="`foo_idcolumnname123`" length="36"/>
+			<generator class="uuid.hex">
+				<param name="seperator">:</param>
+			</generator>
+		</id>
+
+		<discriminator column="`foo_subclass_1234`" type="character" force="true"/>
+		<version name="version"/>
+
+		<many-to-one name="foo" class="Foo">
+				<column name="foo" length="36" index="fbmtoidx"/>
+		</many-to-one>
+
+		<property name="long">
+			<column name="long_" index="fbmtoidx" unique-key="abc" not-null="true"/>
+		</property>
+		<property name="integer">
+				<column name="`integer__`" unique-key="abc" not-null="true"/>
+		</property>
+		<property name="float">
+				<column name="float_" unique-key="abc" not-null="true" check="float_ > 0.0"/>
+		</property>
+		<property name="x"/>
+		<property name="double" column="double_"/>
+
+		<primitive-array name="bytes" table="foobytes">
+			<key column="id"/>
+			<index column="i"/>
+			<element column="byte_" type="byte"/>
+		</primitive-array>
+
+		<property name="date" type="date" column="date_"/>
+		<property name="timestamp" type="timestamp" column="timestamp_"/>
+		<property name="boolean" column="boolean_"/>
+		<property name="bool" column="bool_"/>
+		<property name="null" column="null_"/>
+		<property name="short" column="short_"/>
+		<property name="char" column="char_"/>
+		<property name="zero" column="zero_"/>
+		<property name="int" column="int_"/>
+		<property name="string">
+            <column name="string_" length="48" index="fbstridx"/>
+		</property>
+		<property name="byte" column="byte_"/>
+		<property name="yesno" type="yes_no"/>
+		<property name="blob" type="org.hibernate.test.legacy.Foo$Struct" column="blobb_"/>
+		<property name="nullBlob" type="serializable"/>
+		<property name="binary" column="bin_"/>
+		<property name="theLocale" access="field" column="`localeayzabc123`"/>
+
+		<property name="formula" formula="int_/2"/>
+
+		<property name="custom" type="org.hibernate.test.legacy.DoubleStringType" access="field">
+			<column name="first_name" length="66"/>
+			<column name="surname" length="66"/>
+		</property>
+		<component name="nullComponent">
+			<property name="name" column="null_cmpnt_"/>
+		</component>
+
+		<join table="jointable">
+			<key column="fooid" on-delete="cascade"/>
+			<property name="joinedProp"/>
+		</join>
+
+		<subclass
+			name="Trivial"
+			proxy="FooProxy"
+			discriminator-value="T"/>
+
+		<subclass
+			name="Abstract"
+			proxy="AbstractProxy"
+			discriminator-value="null">
+				<set name="abstracts" batch-size="2">
+					<key column="abstract_id"/>
+					<one-to-many class="Abstract"/>
+				</set>
+				<property name="time" column="the_time"/>
+
+				<subclass
+					name="Bar"
+					proxy="BarProxy"
+					discriminator-value="B">
+					<property name="barString">
+						<column name="bar_string" length="24"/>
+					</property>
+					<any name="object" meta-type="character" id-type="long" cascade="all">
+						<meta-value value="O" class="One"/>
+						<meta-value value="M" class="Many"/>
+						<column name="clazz" length="100"/>
+						<column name="gen_id"/>
+					</any>
+					<join table="bar_join_table">
+						<key column="bar_id"/>
+						<property name="name" column="name_name"/>
+					</join>
+				</subclass>
+		</subclass>
+	</class>
+
+	<class name="One" table="one">
+		<id name="key" column="one_key">
+			<generator class="native" />
+		</id>
+		<property name="x"/>
+		<property column="one_value" name="value"/>
+	</class>
+
+    <class name="Many" table="many">
+        <id name="key" column="many_key">
+            <generator class="native" />
+        </id>
+        <property name="x"/>
+    </class>
+
+</hibernate-mapping>
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/FooBarCopy.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/FunctionNameAsColumnTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/FunctionNameAsColumnTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/FunctionNameAsColumnTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,332 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.hql;
+
+import java.util.List;
+
+import junit.framework.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.hibernate.FetchMode;
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Tests HQL and Criteria queries using DB columns having the same name as registerd functions.
+ *
+ * @author Gail Badner
+ */
+public class FunctionNameAsColumnTest  extends FunctionalTestCase {
+
+	private static final Logger log = LoggerFactory.getLogger( FunctionNameAsColumnTest.class );
+
+	public FunctionNameAsColumnTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] {
+				"hql/FunctionNamesAsColumns.hbm.xml"
+		};
+	}
+
+	public void configure(Configuration cfg) {
+		super.configure( cfg );
+		cfg.setProperty( Environment.USE_QUERY_CACHE, "false" );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( FunctionNameAsColumnTest.class );
+	}
+
+	public void testGetOneColumnSameNameAsArgFunctionHQL() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		EntityWithArgFunctionAsColumn e = new EntityWithArgFunctionAsColumn();
+		e.setLower( 3 );
+		e.setUpper( " abc " );
+		s.persist( e );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		e = ( EntityWithArgFunctionAsColumn ) s.createQuery( "from EntityWithArgFunctionAsColumn" ).uniqueResult();
+		assertEquals( 3, e.getLower() );
+		assertEquals( " abc ", e.getUpper() );
+		t.commit();
+		s.close();
+
+		cleanup();
+	}
+
+	public void testGetOneColumnSameNameAsArgFunctionCriteria() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		EntityWithArgFunctionAsColumn e = new EntityWithArgFunctionAsColumn();
+		e.setLower( 3 );
+		e.setUpper( " abc " );
+		s.persist( e );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		e = ( EntityWithArgFunctionAsColumn ) s.createCriteria( EntityWithArgFunctionAsColumn.class ).uniqueResult();
+		assertEquals( 3, e.getLower() );
+		assertEquals( " abc ", e.getUpper() );
+		t.commit();
+		s.close();
+
+		cleanup();
+	}
+
+	public void testGetMultiColumnSameNameAsArgFunctionHQL() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		EntityWithArgFunctionAsColumn e1 = new EntityWithArgFunctionAsColumn();
+		e1.setLower( 3 );
+		e1.setUpper( " abc " );
+		EntityWithArgFunctionAsColumn e2 = new EntityWithArgFunctionAsColumn();
+		e2.setLower( 999 );
+		e2.setUpper( " xyz " );
+		EntityWithFunctionAsColumnHolder holder1 = new EntityWithFunctionAsColumnHolder();
+		holder1.getEntityWithArgFunctionAsColumns().add( e1 );
+		EntityWithFunctionAsColumnHolder holder2 = new EntityWithFunctionAsColumnHolder();
+		holder2.getEntityWithArgFunctionAsColumns().add( e2 );
+		holder1.setNextHolder( holder2 );
+		s.save( holder1 );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		holder1 = ( EntityWithFunctionAsColumnHolder ) s.createQuery(
+				"from EntityWithFunctionAsColumnHolder h left join fetch h.entityWithArgFunctionAsColumns " +
+						"left join fetch h.nextHolder left join fetch h.nextHolder.entityWithArgFunctionAsColumns " +
+						"where h.nextHolder is not null" )
+				.uniqueResult();
+		assertTrue( Hibernate.isInitialized( holder1.getEntityWithArgFunctionAsColumns() ) );
+		assertTrue( Hibernate.isInitialized( holder1.getNextHolder() ) );
+		assertTrue( Hibernate.isInitialized( holder1.getNextHolder().getEntityWithArgFunctionAsColumns() ) );
+		assertEquals( 1, holder1.getEntityWithArgFunctionAsColumns().size() );
+		e1 = ( EntityWithArgFunctionAsColumn ) holder1.getEntityWithArgFunctionAsColumns().iterator().next();
+		assertEquals( 3, e1.getLower() );
+		assertEquals( " abc ", e1.getUpper() );
+		assertEquals( 1, holder1.getNextHolder().getEntityWithArgFunctionAsColumns().size() );
+		e2 = ( EntityWithArgFunctionAsColumn ) ( holder1.getNextHolder() ).getEntityWithArgFunctionAsColumns().iterator().next();
+		assertEquals( 999, e2.getLower() );
+		assertEquals( " xyz ", e2.getUpper() );
+		t.commit();
+		s.close();
+
+		cleanup();
+	}
+
+	public void testGetMultiColumnSameNameAsArgFunctionCriteria() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		EntityWithArgFunctionAsColumn e1 = new EntityWithArgFunctionAsColumn();
+		e1.setLower( 3 );
+		e1.setUpper( " abc " );
+		EntityWithArgFunctionAsColumn e2 = new EntityWithArgFunctionAsColumn();
+		e2.setLower( 999 );
+		e2.setUpper( " xyz " );
+		EntityWithFunctionAsColumnHolder holder1 = new EntityWithFunctionAsColumnHolder();
+		holder1.getEntityWithArgFunctionAsColumns().add( e1 );
+		EntityWithFunctionAsColumnHolder holder2 = new EntityWithFunctionAsColumnHolder();
+		holder2.getEntityWithArgFunctionAsColumns().add( e2 );
+		holder1.setNextHolder( holder2 );
+		s.save( holder1 );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		holder1 = ( EntityWithFunctionAsColumnHolder ) s.createCriteria( EntityWithFunctionAsColumnHolder.class )
+				.add( Restrictions.isNotNull( "nextHolder" ))
+				.setFetchMode( "entityWithArgFunctionAsColumns", FetchMode.JOIN )
+				.setFetchMode( "nextHolder", FetchMode.JOIN )
+				.setFetchMode( "nextHolder.entityWithArgFunctionAsColumns", FetchMode.JOIN )
+				.uniqueResult();
+		assertTrue( Hibernate.isInitialized( holder1.getEntityWithArgFunctionAsColumns() ) );
+		assertTrue( Hibernate.isInitialized( holder1.getNextHolder() ) );
+		assertTrue( Hibernate.isInitialized( holder1.getNextHolder().getEntityWithArgFunctionAsColumns() ) );
+		assertEquals( 1, holder1.getEntityWithArgFunctionAsColumns().size() );
+		e1 = ( EntityWithArgFunctionAsColumn ) holder1.getEntityWithArgFunctionAsColumns().iterator().next();
+		assertEquals( 3, e1.getLower() );
+		assertEquals( " abc ", e1.getUpper() );
+		assertEquals( 1, holder1.getNextHolder().getEntityWithArgFunctionAsColumns().size() );
+		e2 = ( EntityWithArgFunctionAsColumn ) ( holder1.getNextHolder() ).getEntityWithArgFunctionAsColumns().iterator().next();
+		assertEquals( 999, e2.getLower() );
+		assertEquals( " xyz ", e2.getUpper() );
+		t.commit();
+		s.close();
+
+		cleanup();
+	}
+
+	public void testGetMultiColumnSameNameAsNoArgFunctionHQL() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		EntityWithNoArgFunctionAsColumn e1 = new EntityWithNoArgFunctionAsColumn();
+		e1.setCurrentDate( "blah blah blah" );
+		EntityWithNoArgFunctionAsColumn e2 = new EntityWithNoArgFunctionAsColumn();
+		e2.setCurrentDate( "yadda yadda yadda" );
+		EntityWithFunctionAsColumnHolder holder1 = new EntityWithFunctionAsColumnHolder();
+		holder1.getEntityWithNoArgFunctionAsColumns().add( e1 );
+		EntityWithFunctionAsColumnHolder holder2 = new EntityWithFunctionAsColumnHolder();
+		holder2.getEntityWithNoArgFunctionAsColumns().add( e2 );
+		holder1.setNextHolder( holder2 );
+		s.save( holder1 );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		holder1 = ( EntityWithFunctionAsColumnHolder ) s.createQuery(
+				"from EntityWithFunctionAsColumnHolder h left join fetch h.entityWithNoArgFunctionAsColumns " +
+						"left join fetch h.nextHolder left join fetch h.nextHolder.entityWithNoArgFunctionAsColumns " +
+						"where h.nextHolder is not null" )
+				.uniqueResult();
+		assertTrue( Hibernate.isInitialized( holder1.getEntityWithNoArgFunctionAsColumns() ) );
+		assertTrue( Hibernate.isInitialized( holder1.getNextHolder() ) );
+		assertTrue( Hibernate.isInitialized( holder1.getNextHolder().getEntityWithNoArgFunctionAsColumns() ) );
+		assertEquals( 1, holder1.getEntityWithNoArgFunctionAsColumns().size() );
+		t.commit();
+		s.close();
+
+		e1 = ( EntityWithNoArgFunctionAsColumn ) holder1.getEntityWithNoArgFunctionAsColumns().iterator().next();
+		assertEquals( "blah blah blah", e1.getCurrentDate() );
+		assertEquals( 1, holder1.getNextHolder().getEntityWithNoArgFunctionAsColumns().size() );
+		e2 = ( EntityWithNoArgFunctionAsColumn ) ( holder1.getNextHolder() ).getEntityWithNoArgFunctionAsColumns().iterator().next();
+		assertEquals( "yadda yadda yadda", e2.getCurrentDate() );
+
+		cleanup();
+	}
+
+	public void testGetMultiColumnSameNameAsNoArgFunctionCriteria() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		EntityWithNoArgFunctionAsColumn e1 = new EntityWithNoArgFunctionAsColumn();
+		e1.setCurrentDate( "blah blah blah" );
+		EntityWithNoArgFunctionAsColumn e2 = new EntityWithNoArgFunctionAsColumn();
+		e2.setCurrentDate( "yadda yadda yadda" );
+		EntityWithFunctionAsColumnHolder holder1 = new EntityWithFunctionAsColumnHolder();
+		holder1.getEntityWithNoArgFunctionAsColumns().add( e1 );
+		EntityWithFunctionAsColumnHolder holder2 = new EntityWithFunctionAsColumnHolder();
+		holder2.getEntityWithNoArgFunctionAsColumns().add( e2 );
+		holder1.setNextHolder( holder2 );
+		s.save( holder1 );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		holder1 = ( EntityWithFunctionAsColumnHolder ) s.createCriteria( EntityWithFunctionAsColumnHolder.class )
+				.add( Restrictions.isNotNull( "nextHolder" ))
+				.setFetchMode( "entityWithNoArgFunctionAsColumns", FetchMode.JOIN )
+				.setFetchMode( "nextHolder", FetchMode.JOIN )
+				.setFetchMode( "nextHolder.entityWithNoArgFunctionAsColumns", FetchMode.JOIN )
+				.uniqueResult();
+		assertTrue( Hibernate.isInitialized( holder1.getEntityWithNoArgFunctionAsColumns() ) );
+		assertTrue( Hibernate.isInitialized( holder1.getNextHolder() ) );
+		assertTrue( Hibernate.isInitialized( holder1.getNextHolder().getEntityWithNoArgFunctionAsColumns() ) );
+		assertEquals( 1, holder1.getEntityWithNoArgFunctionAsColumns().size() );
+		e1 = ( EntityWithNoArgFunctionAsColumn ) holder1.getEntityWithNoArgFunctionAsColumns().iterator().next();
+		assertEquals( "blah blah blah", e1.getCurrentDate() );
+		assertEquals( 1, holder1.getNextHolder().getEntityWithNoArgFunctionAsColumns().size() );
+		e2 = ( EntityWithNoArgFunctionAsColumn ) ( holder1.getNextHolder() ).getEntityWithNoArgFunctionAsColumns().iterator().next();
+		assertEquals( "yadda yadda yadda", e2.getCurrentDate() );
+		t.commit();
+		s.close();
+
+		cleanup();
+	}
+
+	public void testNoArgFcnAndColumnSameNameAsNoArgFunctionHQL() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		EntityWithNoArgFunctionAsColumn e1 = new EntityWithNoArgFunctionAsColumn();
+		e1.setCurrentDate( "blah blah blah" );
+		EntityWithNoArgFunctionAsColumn e2 = new EntityWithNoArgFunctionAsColumn();
+		e2.setCurrentDate( "yadda yadda yadda" );
+		EntityWithFunctionAsColumnHolder holder1 = new EntityWithFunctionAsColumnHolder();
+		holder1.getEntityWithNoArgFunctionAsColumns().add( e1 );
+		EntityWithFunctionAsColumnHolder holder2 = new EntityWithFunctionAsColumnHolder();
+		holder2.getEntityWithNoArgFunctionAsColumns().add( e2 );
+		holder1.setNextHolder( holder2 );
+		s.save( holder1 );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		List results = s.createQuery(
+						"select str(current_date), currentDate from EntityWithNoArgFunctionAsColumn"
+				).list();
+		assertEquals( 2, results.size() );
+		assertEquals( ( ( Object[] ) results.get( 0 ) )[ 0 ], ( ( Object[] ) results.get( 1 ) )[ 0 ] );
+		assertTrue( ! ( ( Object[] ) results.get( 0 ) )[ 0 ].equals( ( ( Object[] ) results.get( 0 ) )[ 1 ] ) );
+		assertTrue( ! ( ( Object[] ) results.get( 1 ) )[ 0 ].equals( ( ( Object[] ) results.get( 1 ) )[ 1 ] ) );
+		assertTrue( ( ( Object[] ) results.get( 0 ) )[ 1 ].equals( e1.getCurrentDate() ) ||
+				     ( ( Object[] ) results.get( 0 ) )[ 1 ].equals( e2.getCurrentDate() ) );
+		assertTrue( ( ( Object[] ) results.get( 1 ) )[ 1 ].equals( e1.getCurrentDate() ) ||
+				     ( ( Object[] ) results.get( 1 ) )[ 1 ].equals( e2.getCurrentDate() ) );
+		assertFalse( ( ( Object[] ) results.get( 0 ) )[ 1 ].equals( ( ( Object[] ) results.get( 1 ) )[ 1 ] ) );
+		t.commit();
+		s.close();
+
+		cleanup();
+	}
+
+	private void cleanup() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.createQuery( "delete from EntityWithArgFunctionAsColumn" ).executeUpdate();
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery( "delete from EntityWithNoArgFunctionAsColumn" ).executeUpdate();
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery( "delete from EntityWithFunctionAsColumnHolder where nextHolder is not null" ).executeUpdate();
+		s.createQuery( "delete from EntityWithFunctionAsColumnHolder" ).executeUpdate();
+		t.commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/FunctionNameAsColumnTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/FunctionNamesAsColumns.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/FunctionNamesAsColumns.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/FunctionNamesAsColumns.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+
+<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<hibernate-mapping package="org.hibernate.test.hql">
+
+    <class name="EntityWithFunctionAsColumnHolder" table="ENTITY_WITH_FN_AS_COL_HOLDER">
+        <id name="id" column="ID" type="long">
+            <generator class="increment"/>
+        </id>
+        <many-to-one name="nextHolder" cascade="all"/>
+        <set name="entityWithArgFunctionAsColumns" inverse="false" lazy="true" cascade="all-delete-orphan">
+            <key column="HOLDER_ID"/>
+            <one-to-many class="EntityWithArgFunctionAsColumn"/>
+        </set>
+        <set name="entityWithNoArgFunctionAsColumns" inverse="false" lazy="true" cascade="all-delete-orphan">
+            <key column="HOLDER_ID"/>
+            <one-to-many class="EntityWithNoArgFunctionAsColumn"/>
+        </set>
+    </class>
+
+    <class name="EntityWithArgFunctionAsColumn" table="ENTITY_WITH_ARG_FN_AS_COL">
+        <id name="id" column="ID" type="long">
+            <generator class="increment"/>
+        </id>
+        <property name="lower" column="lower" type="int"/>
+        <property name="upper" column="upper" type="string"/>
+    </class>
+
+    <class name="EntityWithNoArgFunctionAsColumn" table="ENTITY_WITH_NOARG_FN_AS_COL">
+        <id name="id" column="ID" type="long">
+            <generator class="increment"/>
+        </id>
+        <property name="currentDate" column="`current_date`" type="string"/> 
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/FunctionNamesAsColumns.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/HQLTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/HQLTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/HQLTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,1407 @@
+//$Id: HQLTest.java 11374 2007-03-29 19:09:18Z steve.ebersole at jboss.com $
+package org.hibernate.test.hql;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.QueryException;
+import org.hibernate.dialect.DB2Dialect;
+import org.hibernate.dialect.H2Dialect;
+import org.hibernate.dialect.HSQLDialect;
+import org.hibernate.dialect.IngresDialect;
+import org.hibernate.dialect.MySQLDialect;
+import org.hibernate.dialect.Oracle8iDialect;
+import org.hibernate.dialect.PostgreSQLDialect;
+import org.hibernate.dialect.SQLServerDialect;
+import org.hibernate.dialect.Sybase11Dialect;
+import org.hibernate.dialect.SybaseASE15Dialect;
+import org.hibernate.dialect.SybaseAnywhereDialect;
+import org.hibernate.dialect.SybaseDialect;
+import org.hibernate.dialect.function.SQLFunction;
+import org.hibernate.engine.SessionFactoryImplementor;
+import org.hibernate.engine.query.HQLQueryPlan;
+import org.hibernate.engine.query.ReturnMetadata;
+import org.hibernate.hql.QueryTranslator;
+import org.hibernate.hql.QueryTranslatorFactory;
+import org.hibernate.hql.antlr.HqlTokenTypes;
+import org.hibernate.hql.ast.ASTQueryTranslatorFactory;
+import org.hibernate.hql.ast.DetailedSemanticException;
+import org.hibernate.hql.ast.QuerySyntaxException;
+import org.hibernate.hql.ast.QueryTranslatorImpl;
+import org.hibernate.hql.ast.SqlGenerator;
+import org.hibernate.hql.ast.tree.ConstructorNode;
+import org.hibernate.hql.ast.tree.DotNode;
+import org.hibernate.hql.ast.tree.FromReferenceNode;
+import org.hibernate.hql.ast.tree.IndexNode;
+import org.hibernate.hql.ast.tree.QueryNode;
+import org.hibernate.hql.ast.tree.SelectClause;
+import org.hibernate.hql.ast.util.ASTUtil;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+import antlr.RecognitionException;
+import antlr.collections.AST;
+
+/**
+ * Tests cases where the AST based query translator and the 'classic' query translator generate identical SQL.
+ *
+ * @author Gavin King
+ */
+public class HQLTest extends QueryTranslatorTestCase {
+
+	public HQLTest(String x) {
+		super( x );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( HQLTest.class );
+	}
+
+	public boolean createSchema() {
+		return false;
+	}
+
+	public boolean recreateSchemaAfterFailure() {
+		return false;
+	}
+
+	protected void prepareTest() throws Exception {
+		super.prepareTest();
+		SelectClause.VERSION2_SQL = true;
+		DotNode.REGRESSION_STYLE_JOIN_SUPPRESSION = true;
+		DotNode.ILLEGAL_COLL_DEREF_EXCP_BUILDER = new DotNode.IllegalCollectionDereferenceExceptionBuilder() {
+			public QueryException buildIllegalCollectionDereferenceException(String propertyName, FromReferenceNode lhs) {
+				throw new QueryException( "illegal syntax near collection: " + propertyName );
+			}
+		};
+		SqlGenerator.REGRESSION_STYLE_CROSS_JOINS = true;
+	}
+
+	protected void cleanupTest() throws Exception {
+		SelectClause.VERSION2_SQL = false;
+		DotNode.REGRESSION_STYLE_JOIN_SUPPRESSION = false;
+		DotNode.ILLEGAL_COLL_DEREF_EXCP_BUILDER = DotNode.DEF_ILLEGAL_COLL_DEREF_EXCP_BUILDER;
+		SqlGenerator.REGRESSION_STYLE_CROSS_JOINS = false;
+		super.cleanupTest();
+	}
+
+	public void testModulo() {
+		assertTranslation( "from Animal a where a.bodyWeight % 2 = 0" );
+	}
+
+	public void testInvalidCollectionDereferencesFail() {
+		// should fail with the same exceptions (because of the DotNode.ILLEGAL_COLL_DEREF_EXCP_BUILDER injection)
+		assertTranslation( "from Animal a where a.offspring.description = 'xyz'" );
+		assertTranslation( "from Animal a where a.offspring.father.description = 'xyz'" );
+	}
+	
+    /**
+     * ClassicQueryTranslatorFactory does not support translate tuple with "in" syntax to "and/or" clause
+     */
+    public void testRowValueConstructorSyntaxInInListFailureExpected() {
+        assertTranslation( "from LineItem l where l.id in (:idList)" );
+    }
+
+    public void testRowValueConstructorSyntaxInInList() {
+    	if (!getDialect().supportsRowValueConstructorSyntaxInInList())
+    		return;
+		QueryTranslatorImpl translator = createNewQueryTranslator("from LineItem l where l.id in (?)");
+		assertInExist("'in' should be translated to 'and'", false, translator);
+		translator = createNewQueryTranslator("from LineItem l where l.id in (('a1',1,'b1'),('a2',2,'b2'))");
+		assertInExist("'in' should be translated to 'and'", false, translator);
+		translator = createNewQueryTranslator("from Animal a where a.id in (?)");
+		assertInExist("only translate tuple with 'in' syntax", true, translator);
+		translator = createNewQueryTranslator("from LineItem l where l.id in (select a1 from Animal a1 left join a1.offspring o where a1.id = 1)");
+		assertInExist("do not translate subqueries", true, translator);
+
+    }
+
+	private void assertInExist( String message, boolean expected, QueryTranslatorImpl translator ) {
+		AST ast = translator.getSqlAST().getWalker().getAST();
+		QueryNode queryNode = (QueryNode) ast;
+		AST inNode = ASTUtil.findTypeInChildren( queryNode, HqlTokenTypes.IN );
+		assertEquals( message, expected, inNode != null );
+	}
+    
+	public void testSubComponentReferences() {
+		assertTranslation( "select c.address.zip.code from ComponentContainer c" );
+		assertTranslation( "select c.address.zip from ComponentContainer c" );
+		assertTranslation( "select c.address from ComponentContainer c" );
+	}
+
+	public void testManyToAnyReferences() {
+		assertTranslation( "from PropertySet p where p.someSpecificProperty.id is not null" );
+		assertTranslation( "from PropertySet p join p.generalProperties gp where gp.id is not null" );
+	}
+
+	public void testJoinFetchCollectionOfValues() {
+		assertTranslation( "select h from Human as h join fetch h.nickNames" );
+	}
+
+	public void testCollectionJoinsInSubselect() {
+		// caused by some goofiness in FromElementFactory that tries to
+		// handle correlated subqueries (but fails miserably) even though this
+		// is not a correlated subquery.  HHH-1248
+		assertTranslation(
+				"select a.id, a.description" +
+				" from Animal a" +
+				"       left join a.offspring" +
+				" where a in (" +
+				"       select a1 from Animal a1" +
+				"           left join a1.offspring o" +
+				"       where a1.id=1" +
+		        ")"
+		);
+		assertTranslation(
+				"select h.id, h.description" +
+		        " from Human h" +
+				"      left join h.friends" +
+				" where h in (" +
+				"      select h1" +
+				"      from Human h1" +
+				"          left join h1.friends f" +
+				"      where h1.id=1" +
+				")"
+		);
+	}
+
+	public void testEmptyInListFailureExpected() {
+		assertTranslation( "select a from Animal a where a.description in ()" );
+	}
+
+	public void testDateTimeArithmeticReturnTypesAndParameterGuessing() {
+		QueryTranslatorImpl translator = createNewQueryTranslator( "select o.orderDate - o.orderDate from Order o" );
+		assertEquals( "incorrect return type count", 1, translator.getReturnTypes().length );
+		assertEquals( "incorrect return type", Hibernate.DOUBLE, translator.getReturnTypes()[0] );
+		translator = createNewQueryTranslator( "select o.orderDate + 2 from Order o" );
+		assertEquals( "incorrect return type count", 1, translator.getReturnTypes().length );
+		assertEquals( "incorrect return type", Hibernate.CALENDAR_DATE, translator.getReturnTypes()[0] );
+		translator = createNewQueryTranslator( "select o.orderDate -2 from Order o" );
+		assertEquals( "incorrect return type count", 1, translator.getReturnTypes().length );
+		assertEquals( "incorrect return type", Hibernate.CALENDAR_DATE, translator.getReturnTypes()[0] );
+
+		translator = createNewQueryTranslator( "from Order o where o.orderDate > ?" );
+		assertEquals( "incorrect expected param type", Hibernate.CALENDAR_DATE, translator.getParameterTranslations().getOrdinalParameterExpectedType( 1 ) );
+
+		translator = createNewQueryTranslator( "select o.orderDate + ? from Order o" );
+		assertEquals( "incorrect return type count", 1, translator.getReturnTypes().length );
+		assertEquals( "incorrect return type", Hibernate.CALENDAR_DATE, translator.getReturnTypes()[0] );
+		assertEquals( "incorrect expected param type", Hibernate.DOUBLE, translator.getParameterTranslations().getOrdinalParameterExpectedType( 1 ) );
+
+	}
+
+	public void testReturnMetadata() {
+		HQLQueryPlan plan = createQueryPlan( "from Animal a" );
+		check( plan.getReturnMetadata(), false, true );
+
+		plan = createQueryPlan( "select a as animal from Animal a" );
+		check( plan.getReturnMetadata(), false, false );
+
+		plan = createQueryPlan( "from java.lang.Object" );
+		check( plan.getReturnMetadata(), true, true );
+
+		plan = createQueryPlan( "select o as entity from java.lang.Object o" );
+		check( plan.getReturnMetadata(), true, false );
+	}
+
+	private void check(
+			ReturnMetadata returnMetadata,
+	        boolean expectingEmptyTypes,
+	        boolean expectingEmptyAliases) {
+		assertNotNull( "null return metadata", returnMetadata );
+		assertNotNull( "null return metadata - types", returnMetadata );
+		assertEquals( "unexpected return size", 1, returnMetadata.getReturnTypes().length );
+		if ( expectingEmptyTypes ) {
+			assertNull( "non-empty types", returnMetadata.getReturnTypes()[0] );
+		}
+		else {
+			assertNotNull( "empty types", returnMetadata.getReturnTypes()[0] );
+		}
+		if ( expectingEmptyAliases ) {
+			assertNull( "non-empty aliases", returnMetadata.getReturnAliases() );
+		}
+		else {
+			assertNotNull( "empty aliases", returnMetadata.getReturnAliases() );
+			assertNotNull( "empty aliases", returnMetadata.getReturnAliases()[0] );
+		}
+	}
+
+	public void testImplicitJoinsAlongWithCartesianProduct() {
+		DotNode.useThetaStyleImplicitJoins = true;
+		assertTranslation( "select foo.foo from Foo foo, Foo foo2" );
+		assertTranslation( "select foo.foo.foo from Foo foo, Foo foo2" );
+		DotNode.useThetaStyleImplicitJoins = false;
+	}
+
+	public void testSubselectBetween() {
+		assertTranslation("from Animal x where (select max(a.bodyWeight) from Animal a) between :min and :max");
+		assertTranslation("from Animal x where (select max(a.description) from Animal a) like 'big%'");
+		assertTranslation("from Animal x where (select max(a.bodyWeight) from Animal a) is not null");
+		assertTranslation("from Animal x where exists (select max(a.bodyWeight) from Animal a)");
+		assertTranslation("from Animal x where (select max(a.bodyWeight) from Animal a) in (1,2,3)");
+	}
+
+	public void testFetchOrderBy() {
+		assertTranslation("from Animal a left outer join fetch a.offspring where a.mother.id = :mid order by a.description");
+	}
+
+	public void testCollectionOrderBy() {
+		assertTranslation("from Animal a join a.offspring o order by a.description");
+		assertTranslation("from Animal a join fetch a.offspring order by a.description");
+		assertTranslation("from Animal a join fetch a.offspring o order by o.description");
+		assertTranslation("from Animal a join a.offspring o order by a.description, o.description");
+	}
+
+	public void testExpressionWithParamInFunction() {
+		assertTranslation("from Animal a where abs(a.bodyWeight-:param) < 2.0");
+		assertTranslation("from Animal a where abs(:param - a.bodyWeight) < 2.0");
+		assertTranslation("from Animal where abs(:x - :y) < 2.0");
+		assertTranslation("from Animal where lower(upper(:foo)) like 'f%'");
+		if ( ! ( getDialect() instanceof SybaseDialect ) &&  ! ( getDialect() instanceof Sybase11Dialect ) &&  ! ( getDialect() instanceof SybaseASE15Dialect ) && ! ( getDialect() instanceof SQLServerDialect ) ) {
+			// Transact-SQL dialects (except SybaseAnywhereDialect) map the length function -> len; 
+			// classic translator does not consider that *when nested*;
+			// SybaseAnywhereDialect supports the length function
+
+			assertTranslation("from Animal a where abs(abs(a.bodyWeight - 1.0 + :param) * abs(length('ffobar')-3)) = 3.0");
+		}
+		if ( !( getDialect() instanceof MySQLDialect ) && ! ( getDialect() instanceof SybaseDialect ) && ! ( getDialect() instanceof Sybase11Dialect ) && !( getDialect() instanceof SybaseASE15Dialect ) && ! ( getDialect() instanceof SybaseAnywhereDialect ) && ! ( getDialect() instanceof SQLServerDialect ) ) {
+			assertTranslation("from Animal where lower(upper('foo') || upper(:bar)) like 'f%'");
+		}
+		if ( getDialect() instanceof PostgreSQLDialect ) {
+			return;
+		}
+		assertTranslation("from Animal where abs(cast(1 as float) - cast(:param as float)) = 1.0");
+	}
+
+	public void testCompositeKeysWithPropertyNamedId() {
+		assertTranslation( "select e.id.id from EntityWithCrazyCompositeKey e" );
+		assertTranslation( "select max(e.id.id) from EntityWithCrazyCompositeKey e" );
+	}
+
+	public void testMaxindexHqlFunctionInElementAccessorFailureExpected() {
+		//TODO: broken SQL
+		//      steve (2005.10.06) - this is perfect SQL, but fairly different from the old parser
+		//              tested : HSQLDB (1.8), Oracle8i
+		assertTranslation( "select c from ContainerX c where c.manyToMany[ maxindex(c.manyToMany) ].count = 2" );
+		assertTranslation( "select c from Container c where c.manyToMany[ maxIndex(c.manyToMany) ].count = 2" );
+	}
+
+	public void testMultipleElementAccessorOperatorsFailureExpected() throws Exception {
+		//TODO: broken SQL
+		//      steve (2005.10.06) - Yes, this is all hosed ;)
+		assertTranslation( "select c from ContainerX c where c.oneToMany[ c.manyToMany[0].count ].name = 's'" );
+		assertTranslation( "select c from ContainerX c where c.manyToMany[ c.oneToMany[0].count ].name = 's'" );
+	}
+
+	/*public void testSelectMaxElements() throws Exception {
+		//TODO: this is almost correct, but missing a select-clause column alias!
+		assertTranslation("select max( elements(one.manies) ) from org.hibernate.test.legacy.One one");
+	}*/
+
+	public void testKeyManyToOneJoinFailureExpected() {
+		//TODO: new parser generates unnecessary joins (though the query results are correct)
+		assertTranslation( "from Order o left join fetch o.lineItems li left join fetch li.product p" );
+		assertTranslation( "from Outer o where o.id.master.id.sup.dudu is not null" );
+		assertTranslation( "from Outer o where o.id.master.id.sup.dudu is not null" );
+	}
+
+	public void testDuplicateExplicitJoinFailureExpected() throws Exception {
+		//very minor issue with select clause:
+		assertTranslation( "from Animal a join a.mother m1 join a.mother m2" );
+		assertTranslation( "from Zoo zoo join zoo.animals an join zoo.mammals m" );
+		assertTranslation( "from Zoo zoo join zoo.mammals an join zoo.mammals m" );
+	}
+
+	// TESTS THAT FAIL ONLY ON DIALECTS WITH THETA-STYLE OUTERJOINS:
+
+	public void testIndexWithExplicitJoin() throws Exception {
+		//TODO: broken on dialects with theta-style outerjoins:
+		//      steve (2005.10.06) - this works perfectly for me on Oracle8i
+		assertTranslation( "from Zoo zoo join zoo.animals an where zoo.mammals[ index(an) ] = an" );
+		assertTranslation( "from Zoo zoo join zoo.mammals dog where zoo.mammals[ index(dog) ] = dog" );
+		assertTranslation( "from Zoo zoo join zoo.mammals dog where dog = zoo.mammals[ index(dog) ]" );
+	}
+
+	public void testOneToManyMapIndex() throws Exception {
+		//TODO: this breaks on dialects with theta-style outerjoins:
+		//      steve (2005.10.06) - this works perfectly for me on Oracle8i
+		assertTranslation( "from Zoo zoo where zoo.mammals['dog'].description like '%black%'" );
+		assertTranslation( "from Zoo zoo where zoo.mammals['dog'].father.description like '%black%'" );
+		assertTranslation( "from Zoo zoo where zoo.mammals['dog'].father.id = 1234" );
+		assertTranslation( "from Zoo zoo where zoo.animals['1234'].description like '%black%'" );
+	}
+
+	public void testExplicitJoinMapIndex() throws Exception {
+		//TODO: this breaks on dialects with theta-style outerjoins:
+		//      steve (2005.10.06) - this works perfectly for me on Oracle8i
+		assertTranslation( "from Zoo zoo, Dog dog where zoo.mammals['dog'] = dog" );
+		assertTranslation( "from Zoo zoo join zoo.mammals dog where zoo.mammals['dog'] = dog" );
+	}
+
+	public void testIndexFunction() throws Exception {
+		// Instead of doing the pre-processor trick like the existing QueryTranslator, this
+		// is handled by MethodNode.
+		//      steve (2005.10.06) - this works perfectly for me on Oracle8i
+		//TODO: broken on dialects with theta-style outerjoins:
+		assertTranslation( "from Zoo zoo join zoo.mammals dog where index(dog) = 'dog'" );
+		assertTranslation( "from Zoo zoo join zoo.animals an where index(an) = '1234'" );
+	}
+
+	public void testSelectCollectionOfValues() throws Exception {
+		//TODO: broken on dialects with theta-style joins
+		///old parser had a bug where the collection element was not included in return types!
+		//      steve (2005.10.06) - this works perfectly for me on Oracle8i
+		assertTranslation( "select baz, date from Baz baz join baz.stringDateMap date where index(date) = 'foo'" );
+	}
+
+	public void testCollectionOfValues() throws Exception {
+		//old parser had a bug where the collection element was not returned!
+		//TODO: broken on dialects with theta-style joins
+		//      steve (2005.10.06) - this works perfectly for me on Oracle8i
+		assertTranslation( "from Baz baz join baz.stringDateMap date where index(date) = 'foo'" );
+	}
+
+    public void testHHH719() throws Exception {
+        assertTranslation("from Baz b order by org.bazco.SpecialFunction(b.id)");
+        assertTranslation("from Baz b order by anypackage.anyFunction(b.id)");
+    }
+
+
+	//PASSING TESTS:
+
+	public void testParameterListExpansion() {
+		assertTranslation( "from Animal as animal where animal.id in (:idList_1, :idList_2)" );
+	}
+
+	public void testComponentManyToOneDereferenceShortcut() {
+		assertTranslation( "from Zoo z where z.address.stateProvince.id is null" );
+	}
+
+	public void testNestedCollectionImplicitJoins() {
+		// HHH-770
+		assertTranslation( "select h.friends.offspring from Human h" );
+	}
+
+	public void testExplicitJoinsInSubquery() {
+		// test for HHH-557,
+		// TODO : this passes regardless because the only difference between the two sqls is one extra comma
+		// (commas are eaten by the tokenizer during asserTranslation when building the token maps).
+		assertTranslation(
+		        "from org.hibernate.test.hql.Animal as animal " +
+		        "where animal.id in (" +
+		        "        select a.id " +
+		        "        from org.hibernate.test.hql.Animal as a " +
+		        "               left join a.mother as mo" +
+		        ")"
+		);
+	}
+
+	public void testImplicitJoinsInGroupBy() {
+		assertTranslation(
+		        "select o.mother.bodyWeight, count(distinct o) " +
+		        "from Animal an " +
+		        "   join an.offspring as o " +
+		        "group by o.mother.bodyWeight"
+		);
+	}
+
+	public void testCrazyIdFieldNames() {
+		DotNode.useThetaStyleImplicitJoins = true;
+		// only regress against non-scalar forms as there appears to be a bug in the classic translator
+		// in regards to this issue also.  Specifically, it interprets the wrong return type, though it gets
+		// the sql "correct" :/
+
+		String hql = "select e.heresAnotherCrazyIdFieldName from MoreCrazyIdFieldNameStuffEntity e where e.heresAnotherCrazyIdFieldName is not null";
+		assertTranslation( hql, new HashMap(), false, ( String ) null );
+
+	    hql = "select e.heresAnotherCrazyIdFieldName.heresAnotherCrazyIdFieldName from MoreCrazyIdFieldNameStuffEntity e where e.heresAnotherCrazyIdFieldName is not null";
+		assertTranslation( hql, new HashMap(), false, ( String ) null );
+
+		DotNode.useThetaStyleImplicitJoins = false;
+	}
+
+	public void testSizeFunctionAndProperty() {
+		assertTranslation("from Animal a where a.offspring.size > 0");
+		assertTranslation("from Animal a join a.offspring where a.offspring.size > 1");
+		assertTranslation("from Animal a where size(a.offspring) > 0");
+		assertTranslation("from Animal a join a.offspring o where size(a.offspring) > 1");
+		assertTranslation("from Animal a where size(a.offspring) > 1 and size(a.offspring) < 100");
+
+		assertTranslation("from Human a where a.family.size > 0");
+		assertTranslation("from Human a join a.family where a.family.size > 1");
+		assertTranslation("from Human a where size(a.family) > 0");
+		assertTranslation("from Human a join a.family o where size(a.family) > 1");
+		assertTranslation("from Human a where a.family.size > 0 and a.family.size < 100");
+}
+
+	// Do the simplest test first!
+	public void testFromOnly() throws Exception {
+		// 2004-06-21 [jsd] This test now works with the new AST based QueryTranslatorImpl.
+		assertTranslation( "from Animal" );
+		assertTranslation( "from Model" );
+	}
+
+	public void testJoinPathEndingInValueCollection() {
+		assertTranslation( "select h from Human as h join h.nickNames as nn where h.nickName=:nn1 and (nn=:nn2 or nn=:nn3)" );
+	}
+
+	public void testSerialJoinPathEndingInValueCollection() {
+		// HHH-242
+		assertTranslation( "select h from Human as h join h.friends as f join f.nickNames as nn where h.nickName=:nn1 and (nn=:nn2 or nn=:nn3)" );
+	}
+
+	public void testImplicitJoinContainedByCollectionFunction() {
+		// HHH-281 : Implied joins in a collection function (i.e., indices or elements)
+		assertTranslation( "from Human as h where 'shipping' in indices(h.father.addresses)" );
+		assertTranslation( "from Human as h where 'shipping' in indices(h.father.father.addresses)" );
+		assertTranslation( "from Human as h where 'sparky' in elements(h.father.nickNames)" );
+		assertTranslation( "from Human as h where 'sparky' in elements(h.father.father.nickNames)" );
+	}
+
+
+	public void testImpliedJoinInSubselectFrom() {
+		// HHH-276 : Implied joins in a from in a subselect.
+		assertTranslation( "from Animal a where exists( from a.mother.offspring )" );
+	}
+
+	public void testSubselectImplicitJoins() {
+		// HHH-276 : Implied joins in a from in a subselect.
+		assertTranslation( "from Simple s where s = some( select sim from Simple sim where sim.other.count=s.other.count )" );
+	}
+
+
+	public void testCollectionOfValuesSize() throws Exception {
+		//SQL *was* missing a comma
+		assertTranslation( "select size(baz.stringDateMap) from org.hibernate.test.legacy.Baz baz" );
+	}
+
+	public void testCollectionFunctions() throws Exception {
+		//these are both broken, a join that belongs in the subselect finds its way into the main query
+		assertTranslation( "from Zoo zoo where size(zoo.animals) > 100" );
+		assertTranslation( "from Zoo zoo where maxindex(zoo.mammals) = 'dog'" );
+	}
+
+	public void testImplicitJoinInExplicitJoin() throws Exception {
+		assertTranslation( "from Animal an inner join an.mother.mother gm" );
+		assertTranslation( "from Animal an inner join an.mother.mother.mother ggm" );
+		assertTranslation( "from Animal an inner join an.mother.mother.mother.mother gggm" );
+	}
+
+	public void testImpliedManyToManyProperty() throws Exception {
+		//missing a table join (SQL correct for a one-to-many, not for a many-to-many)
+		assertTranslation( "select c from ContainerX c where c.manyToMany[0].name = 's'" );
+	}
+
+	public void testCollectionSize() throws Exception {
+		//SQL is correct, query spaces *was* missing a table
+		assertTranslation( "select size(zoo.animals) from Zoo zoo" );
+	}
+
+	/*public void testCollectionIndexFunctionsInSelect() throws Exception {
+		assertTranslation("select maxindex(zoo.animals) from Zoo zoo");
+		assertTranslation("select minindex(zoo.animals) from Zoo zoo");
+		assertTranslation("select indices(zoo.animals) from Zoo zoo");
+	}
+
+	public void testCollectionElementFunctionsInSelect() throws Exception {
+		assertTranslation("select maxelement(zoo.animals) from Zoo zoo");
+		assertTranslation("select minelement(zoo.animals) from Zoo zoo");
+		assertTranslation("select elements(zoo.animals) from Zoo zoo");
+	}*/
+
+	public void testFetchCollectionOfValues() throws Exception {
+		assertTranslation( "from Baz baz left join fetch baz.stringSet" );
+	}
+
+	public void testFetchList() throws Exception {
+		assertTranslation( "from User u join fetch u.permissions" );
+	}
+
+	public void testCollectionFetchWithExplicitThetaJoin() {
+		assertTranslation( "select m from Master m1, Master m left join fetch m.details where m.name=m1.name" );
+	}
+
+	/*public void testListElementFunctionInSelect() throws Exception {
+		//wrong pk column in select clause! (easy fix?)
+		assertTranslation("select maxelement(u.permissions) from User u");
+		assertTranslation("select elements(u.permissions) from User u");
+	}*/
+
+	public void testListElementFunctionInWhere() throws Exception {
+		assertTranslation( "from User u where 'read' in elements(u.permissions)" );
+		assertTranslation( "from User u where 'write' <> all elements(u.permissions)" );
+	}
+
+	/*public void testManyToManyElementFunctionInSelect() throws Exception {
+		assertTranslation("select maxelement(human.friends) from Human human");
+		assertTranslation("select elements(human.friends) from Human human");
+	}*/
+
+	public void testManyToManyMaxElementFunctionInWhere() throws Exception {
+		//completely broken!!
+		assertTranslation( "from Human human where 5 = maxelement(human.friends)" );
+	}
+
+	public void testCollectionIndexFunctionsInWhere() throws Exception {
+		assertTranslation( "from Zoo zoo where 4 = maxindex(zoo.animals)" );
+		assertTranslation( "from Zoo zoo where 2 = minindex(zoo.animals)" );
+	}
+
+	public void testCollectionIndicesInWhere() throws Exception {
+		assertTranslation( "from Zoo zoo where 4 > some indices(zoo.animals)" );
+		assertTranslation( "from Zoo zoo where 4 > all indices(zoo.animals)" );
+	}
+
+	public void testIndicesInWhere() throws Exception {
+		assertTranslation( "from Zoo zoo where 4 in indices(zoo.animals)" );
+		assertTranslation( "from Zoo zoo where exists indices(zoo.animals)" );
+	}
+
+	public void testCollectionElementInWhere() throws Exception {
+		assertTranslation( "from Zoo zoo where 4 > some elements(zoo.animals)" );
+		assertTranslation( "from Zoo zoo where 4 > all elements(zoo.animals)" );
+	}
+
+	public void testElementsInWhere() throws Exception {
+		assertTranslation( "from Zoo zoo where 4 in elements(zoo.animals)" );
+		assertTranslation( "from Zoo zoo where exists elements(zoo.animals)" );
+	}
+
+	public void testNull() throws Exception {
+		assertTranslation( "from Human h where h.nickName is null" );
+		assertTranslation( "from Human h where h.nickName is not null" );
+	}
+
+	public void testSubstitutions() throws Exception {
+		Map replacements = buildTrueFalseReplacementMapForDialect();
+		replacements.put("yes", "'Y'");
+		assertTranslation( "from Human h where h.pregnant = true", replacements );
+		assertTranslation( "from Human h where h.pregnant = yes", replacements );
+		assertTranslation( "from Human h where h.pregnant = foo", replacements );
+	}
+
+	public void testWhere() throws Exception {
+		assertTranslation( "from Animal an where an.bodyWeight > 10" );
+		// 2004-06-26 [jsd] This one requires NOT GT => LE transform.
+		assertTranslation( "from Animal an where not an.bodyWeight > 10" );
+		assertTranslation( "from Animal an where an.bodyWeight between 0 and 10" );
+		assertTranslation( "from Animal an where an.bodyWeight not between 0 and 10" );
+		assertTranslation( "from Animal an where sqrt(an.bodyWeight)/2 > 10" );
+		// 2004-06-27 [jsd] Recognize 'is null' properly.  Generate 'and' and 'or' as well.
+		assertTranslation( "from Animal an where (an.bodyWeight > 10 and an.bodyWeight < 100) or an.bodyWeight is null" );
+	}
+
+	public void testEscapedQuote() throws Exception {
+		assertTranslation( "from Human h where h.nickName='1 ov''tha''few'");
+	}
+
+	public void testCaseWhenElse() {
+		assertTranslation( "from Human h where case when h.nickName='1ovthafew' then 'Gavin' when h.nickName='turin' then 'Christian' else h.nickName end = h.name.first" );
+	}
+
+	public void testCaseExprWhenElse() {
+		assertTranslation( "from Human h where case h.nickName when '1ovthafew' then 'Gavin' when 'turin' then 'Christian' else h.nickName end = h.name.first" );
+	}
+
+	public void testInvalidHql() throws Exception {
+		Exception newException = compileBadHql( "from Animal foo where an.bodyWeight > 10", false );
+		assertTrue( "Wrong exception type!", newException instanceof QuerySyntaxException );
+		newException = compileBadHql( "select an.name from Animal foo", false );
+		assertTrue( "Wrong exception type!", newException instanceof QuerySyntaxException );
+		newException = compileBadHql( "from Animal foo where an.verybogus > 10", false );
+		assertTrue( "Wrong exception type!", newException instanceof QuerySyntaxException );
+		newException = compileBadHql( "select an.boguspropertyname from Animal foo", false );
+		assertTrue( "Wrong exception type!", newException instanceof QuerySyntaxException );
+		newException = compileBadHql( "select an.name", false );
+		assertTrue( "Wrong exception type!", newException instanceof QuerySyntaxException );
+		newException = compileBadHql( "from Animal an where (((an.bodyWeight > 10 and an.bodyWeight < 100)) or an.bodyWeight is null", false );
+		assertTrue( "Wrong exception type!", newException instanceof QuerySyntaxException );
+		newException = compileBadHql( "from Animal an where an.bodyWeight is null where an.bodyWeight is null", false );
+		assertTrue( "Wrong exception type!", newException instanceof QuerySyntaxException );
+		newException = compileBadHql( "from where name='foo'", false );
+		assertTrue( "Wrong exception type!", newException instanceof QuerySyntaxException );
+		newException = compileBadHql( "from NonexistentClass where name='foo'", false );
+		assertTrue( "Wrong exception type!", newException instanceof QuerySyntaxException );
+		newException = compileBadHql( "select new FOO_BOGUS_Animal(an.description, an.bodyWeight) from Animal an", false );
+		assertTrue( "Wrong exception type!", newException instanceof QuerySyntaxException );
+		newException = compileBadHql( "select new Animal(an.description, an.bodyWeight, 666) from Animal an", false );
+		assertTrue( "Wrong exception type!", newException instanceof QuerySyntaxException );
+
+	}
+
+	public void testWhereBetween() throws Exception {
+		// 2004-08-31 [jsd] This "just worked"! Woohoo!
+		assertTranslation( "from Animal an where an.bodyWeight between 1 and 10" );
+	}
+
+	public void testConcatenation() {
+		if ( getDialect() instanceof MySQLDialect || getDialect() instanceof SybaseDialect
+				|| getDialect() instanceof Sybase11Dialect
+				|| getDialect() instanceof SybaseASE15Dialect
+				|| getDialect() instanceof SybaseAnywhereDialect
+				|| getDialect() instanceof SQLServerDialect 
+				|| getDialect() instanceof IngresDialect) {
+			// SybaseASE15Dialect and SybaseAnywhereDialect support '||'
+			// MySQL uses concat(x, y, z)
+			// SQL Server replaces '||' with '+'
+			//
+			// this is syntax checked in {@link ASTParserLoadingTest#testConcatenation} 
+			// Ingres supports both "||" and '+' but IngresDialect originally
+			// uses '+' operator; updated Ingres9Dialect to use "||".
+			return;
+		}
+		assertTranslation("from Human h where h.nickName = '1' || 'ov' || 'tha' || 'few'");
+	}
+
+	public void testWhereLike() throws Exception {
+		assertTranslation( "from Animal a where a.description like '%black%'" );
+		assertTranslation( "from Animal an where an.description like '%fat%'" );
+		assertTranslation( "from Animal an where lower(an.description) like '%fat%'" );
+	}
+
+	public void testWhereIn() throws Exception {
+		assertTranslation( "from Animal an where an.description in ('fat', 'skinny')" );
+	}
+
+	public void testLiteralInFunction() throws Exception {
+		assertTranslation( "from Animal an where an.bodyWeight > abs(5)" );
+		assertTranslation( "from Animal an where an.bodyWeight > abs(-5)" );
+	}
+
+	public void testExpressionInFunction() throws Exception {
+		assertTranslation( "from Animal an where an.bodyWeight > abs(3-5)" );
+		assertTranslation( "from Animal an where an.bodyWeight > abs(3/5)" );
+		assertTranslation( "from Animal an where an.bodyWeight > abs(3+5)" );
+		assertTranslation( "from Animal an where an.bodyWeight > abs(3*5)" );
+		SQLFunction concat = getSessionFactoryImplementor().getSqlFunctionRegistry().findSQLFunction( "concat");
+		List list = new ArrayList(); list.add("'fat'"); list.add("'skinny'");
+		assertTranslation( "from Animal an where an.description = " + concat.render(list, getSessionFactoryImplementor()) );
+	}
+
+	public void testNotOrWhereClause() {
+		assertTranslation( "from Simple s where 'foo'='bar' or not 'foo'='foo'" );
+		assertTranslation( "from Simple s where 'foo'='bar' or not ('foo'='foo')" );
+		assertTranslation( "from Simple s where not ( 'foo'='bar' or 'foo'='foo' )" );
+		assertTranslation( "from Simple s where not ( 'foo'='bar' and 'foo'='foo' )" );
+		assertTranslation( "from Simple s where not ( 'foo'='bar' and 'foo'='foo' ) or not ('x'='y')" );
+		assertTranslation( "from Simple s where not ( 'foo'='bar' or 'foo'='foo' ) and not ('x'='y')" );
+		assertTranslation( "from Simple s where not ( 'foo'='bar' or 'foo'='foo' ) and 'x'='y'" );
+		assertTranslation( "from Simple s where not ( 'foo'='bar' and 'foo'='foo' ) or 'x'='y'" );
+		assertTranslation( "from Simple s where 'foo'='bar' and 'foo'='foo' or not 'x'='y'" );
+		assertTranslation( "from Simple s where 'foo'='bar' or 'foo'='foo' and not 'x'='y'" );
+		assertTranslation( "from Simple s where ('foo'='bar' and 'foo'='foo') or 'x'='y'" );
+		assertTranslation( "from Simple s where ('foo'='bar' or 'foo'='foo') and 'x'='y'" );
+		assertTranslation( "from Simple s where not( upper( s.name ) ='yada' or 1=2 or 'foo'='bar' or not('foo'='foo') or 'foo' like 'bar' )" );
+	}
+
+	public void testComplexExpressionInFunction() throws Exception {
+		assertTranslation( "from Animal an where an.bodyWeight > abs((3-5)/4)" );
+	}
+
+	public void testStandardFunctions() throws Exception {
+		assertTranslation( "from Animal where current_date = current_time" );
+		assertTranslation( "from Animal a where upper(a.description) = 'FAT'" );
+		assertTranslation( "select lower(a.description) from Animal a" );
+	}
+
+	public void testOrderBy() throws Exception {
+		assertTranslation( "from Animal an order by an.bodyWeight" );
+		assertTranslation( "from Animal an order by an.bodyWeight asc" );
+		assertTranslation( "from Animal an order by an.bodyWeight desc" );
+		assertTranslation( "from Animal an order by sqrt(an.bodyWeight*4)/2" );
+		assertTranslation( "from Animal an order by an.mother.bodyWeight" );
+		assertTranslation( "from Animal an order by an.bodyWeight, an.description" );
+		assertTranslation( "from Animal an order by an.bodyWeight asc, an.description desc" );
+		if ( getDialect() instanceof HSQLDialect || getDialect() instanceof DB2Dialect ) {
+			assertTranslation( "from Human h order by sqrt(h.bodyWeight), year(h.birthdate)" );
+		}
+	}
+
+	public void testGroupByFunction() {
+		if ( getDialect() instanceof Oracle8iDialect ) return; // the new hiearchy...
+		if ( getDialect() instanceof PostgreSQLDialect ) return;
+		if ( ! H2Dialect.class.isInstance( getDialect() ) ) {
+			// H2 has no year function
+			assertTranslation( "select count(*) from Human h group by year(h.birthdate)" );
+			assertTranslation( "select count(*) from Human h group by year(sysdate)" );
+		}
+		assertTranslation( "select count(*) from Human h group by trunc( sqrt(h.bodyWeight*4)/2 )" );
+	}
+
+
+	public void testPolymorphism() throws Exception {
+		Map replacements = buildTrueFalseReplacementMapForDialect();
+		assertTranslation( "from Mammal" );
+		assertTranslation( "from Dog" );
+		assertTranslation( "from Mammal m where m.pregnant = false and m.bodyWeight > 10", replacements );
+		assertTranslation( "from Dog d where d.pregnant = false and d.bodyWeight > 10", replacements );
+	}
+
+	private Map buildTrueFalseReplacementMapForDialect() {
+		HashMap replacements = new HashMap();
+		try {
+			String dialectTrueRepresentation = getDialect().toBooleanValueString( true );
+			// if this call succeeds, then the dialect is saying to represent true/false as int values...
+			Integer.parseInt( dialectTrueRepresentation );
+			replacements.put( "true", "1" );
+			replacements.put( "false", "0" );
+		}
+		catch( NumberFormatException nfe ) {
+			// the Integer#parseInt call failed...
+		}
+		return replacements;
+	}
+
+	public void testTokenReplacement() throws Exception {
+		Map replacements = buildTrueFalseReplacementMapForDialect();
+		assertTranslation( "from Mammal m where m.pregnant = false and m.bodyWeight > 10", replacements );
+	}
+
+	public void testProduct() throws Exception {
+		Map replacements = buildTrueFalseReplacementMapForDialect();
+		assertTranslation( "from Animal, Animal" );
+		assertTranslation( "from Animal x, Animal y where x.bodyWeight = y.bodyWeight" );
+		assertTranslation( "from Animal x, Mammal y where x.bodyWeight = y.bodyWeight and not y.pregnant = true", replacements );
+		assertTranslation( "from Mammal, Mammal" );
+	}
+
+	public void testJoinedSubclassProduct() throws Exception {
+		assertTranslation( "from PettingZoo, PettingZoo" ); //product of two subclasses
+	}
+
+	public void testProjectProduct() throws Exception {
+		assertTranslation( "select x from Human x, Human y where x.nickName = y.nickName" );
+		assertTranslation( "select x, y from Human x, Human y where x.nickName = y.nickName" );
+	}
+
+	public void testExplicitEntityJoins() throws Exception {
+		assertTranslation( "from Animal an inner join an.mother mo" );
+		assertTranslation( "from Animal an left outer join an.mother mo" );
+		assertTranslation( "from Animal an left outer join fetch an.mother" );
+	}
+
+	public void testMultipleExplicitEntityJoins() throws Exception {
+		assertTranslation( "from Animal an inner join an.mother mo inner join mo.mother gm" );
+		assertTranslation( "from Animal an left outer join an.mother mo left outer join mo.mother gm" );
+		assertTranslation( "from Animal an inner join an.mother m inner join an.father f" );
+		assertTranslation( "from Animal an left join fetch an.mother m left join fetch an.father f" );
+	}
+
+	public void testMultipleExplicitJoins() throws Exception {
+		assertTranslation( "from Animal an inner join an.mother mo inner join an.offspring os" );
+		assertTranslation( "from Animal an left outer join an.mother mo left outer join an.offspring os" );
+	}
+
+	public void testExplicitEntityJoinsWithRestriction() throws Exception {
+		assertTranslation( "from Animal an inner join an.mother mo where an.bodyWeight < mo.bodyWeight" );
+	}
+
+	public void testIdProperty() throws Exception {
+		assertTranslation( "from Animal a where a.mother.id = 12" );
+	}
+
+	public void testSubclassAssociation() throws Exception {
+		assertTranslation( "from DomesticAnimal da join da.owner o where o.nickName = 'Gavin'" );
+		assertTranslation( "from DomesticAnimal da left join fetch da.owner" );
+		assertTranslation( "from Human h join h.pets p where p.pregnant = 1" );
+		assertTranslation( "from Human h join h.pets p where p.bodyWeight > 100" );
+		assertTranslation( "from Human h left join fetch h.pets" );
+	}
+
+	public void testExplicitCollectionJoins() throws Exception {
+		assertTranslation( "from Animal an inner join an.offspring os" );
+		assertTranslation( "from Animal an left outer join an.offspring os" );
+	}
+
+	public void testExplicitOuterJoinFetch() throws Exception {
+		assertTranslation( "from Animal an left outer join fetch an.offspring" );
+	}
+
+	public void testExplicitOuterJoinFetchWithSelect() throws Exception {
+		assertTranslation( "select an from Animal an left outer join fetch an.offspring" );
+	}
+
+	public void testExplicitJoins() throws Exception {
+		Map replacements = buildTrueFalseReplacementMapForDialect();
+		assertTranslation( "from Zoo zoo join zoo.mammals mam where mam.pregnant = true and mam.description like '%white%'", replacements );
+		assertTranslation( "from Zoo zoo join zoo.animals an where an.description like '%white%'" );
+	}
+
+    /**
+     * Test for HHH-559
+     */
+    public void testMultibyteCharacterConstant() throws Exception {
+        assertTranslation( "from Zoo zoo join zoo.animals an where an.description like '%\u4e2d%'" );
+    }
+
+	public void testImplicitJoins() throws Exception {
+		// Two dots...
+		assertTranslation( "from Animal an where an.mother.bodyWeight > ?" );
+		assertTranslation( "from Animal an where an.mother.bodyWeight > 10" );
+		assertTranslation( "from Dog dog where dog.mother.bodyWeight > 10" );
+		// Three dots...
+		assertTranslation( "from Animal an where an.mother.mother.bodyWeight > 10" );
+		// The new QT doesn't throw an exception here, so this belongs in ASTQueryTranslator test. [jsd]
+//		assertTranslation( "from Animal an where an.offspring.mother.bodyWeight > 10" );
+		// Is not null (unary postfix operator)
+		assertTranslation( "from Animal an where an.mother is not null" );
+		// ID property shortut (no implicit join)
+		assertTranslation( "from Animal an where an.mother.id = 123" );
+	}
+
+	public void testImplicitJoinInSelect() {
+		assertTranslation( "select foo, foo.long from Foo foo" );
+		DotNode.useThetaStyleImplicitJoins = true;
+		assertTranslation( "select foo.foo from Foo foo" );
+		assertTranslation( "select foo, foo.foo from Foo foo" );
+		assertTranslation( "select foo.foo from Foo foo where foo.foo is not null" );
+		DotNode.useThetaStyleImplicitJoins = false;
+	}
+
+	public void testSelectExpressions() {
+		DotNode.useThetaStyleImplicitJoins = true;
+		assertTranslation( "select an.mother.mother from Animal an" );
+		assertTranslation( "select an.mother.mother.mother from Animal an" );
+		assertTranslation( "select an.mother.mother.bodyWeight from Animal an" );
+		assertTranslation( "select an.mother.zoo.id from Animal an" );
+		assertTranslation( "select user.human.zoo.id from User user" );
+		assertTranslation( "select u.userName, u.human.name.first from User u" );
+		assertTranslation( "select u.human.name.last, u.human.name.first from User u" );
+		assertTranslation( "select bar.baz.name from Bar bar" );
+		assertTranslation( "select bar.baz.name, bar.baz.count from Bar bar" );
+		DotNode.useThetaStyleImplicitJoins = false;
+	}
+
+	public void testSelectStandardFunctionsNoParens() throws Exception {
+		assertTranslation( "select current_date, current_time, current_timestamp from Animal" );
+	}
+
+	public void testMapIndex() throws Exception {
+		assertTranslation( "from User u where u.permissions['hibernate']='read'" );
+	}
+
+	/*public void testCollectionFunctionsInSelect() {
+		//sql is correct, just different order in select clause
+		assertTranslation("select baz, size(baz.stringSet), count( distinct elements(baz.stringSet) ), max( elements(baz.stringSet) ) from Baz baz group by baz");
+	}
+
+	public void testSelectElements() throws Exception {
+		assertTranslation( "select elements(fum1.friends) from org.hibernate.test.legacy.Fum fum1" );
+		assertTranslation( "select elements(one.manies) from org.hibernate.test.legacy.One one" );
+	}*/
+
+	public void testNamedParameters() throws Exception {
+		assertTranslation( "from Animal an where an.mother.bodyWeight > :weight" );
+	}
+
+	// Second set of examples....
+
+	public void testClassProperty() throws Exception {
+		// This test causes failures on theta-join dialects because the SQL is different.
+		// The queries are semantically the same however.
+		if ( getDialect() instanceof Oracle8iDialect ) return;
+		assertTranslation( "from Animal a where a.mother.class = Reptile" );
+	}
+
+	public void testComponent() throws Exception {
+		assertTranslation( "from Human h where h.name.first = 'Gavin'" );
+	}
+
+	public void testSelectEntity() throws Exception {
+		assertTranslation( "select an from Animal an inner join an.mother mo where an.bodyWeight < mo.bodyWeight" );
+		assertTranslation( "select mo, an from Animal an inner join an.mother mo where an.bodyWeight < mo.bodyWeight" );
+	}
+
+	public void testValueAggregate() {
+		assertTranslation( "select max(p), min(p) from User u join u.permissions p" );
+	}
+
+	public void testAggregation() throws Exception {
+		assertTranslation( "select count(an) from Animal an" );
+		assertTranslation( "select count(*) from Animal an" );
+		assertTranslation( "select count(distinct an) from Animal an" );
+		assertTranslation( "select count(distinct an.id) from Animal an" );
+		assertTranslation( "select count(all an.id) from Animal an" );
+	}
+
+	public void testSelectProperty() throws Exception {
+		assertTranslation( "select an.bodyWeight, mo.bodyWeight from Animal an inner join an.mother mo where an.bodyWeight < mo.bodyWeight" );
+	}
+
+	public void testSelectEntityProperty() throws Exception {
+		DotNode.useThetaStyleImplicitJoins = true;
+		assertTranslation( "select an.mother from Animal an" );
+		assertTranslation( "select an, an.mother from Animal an" );
+		DotNode.useThetaStyleImplicitJoins = false;
+	}
+
+	public void testSelectDistinctAll() throws Exception {
+		assertTranslation( "select distinct an.description, an.bodyWeight from Animal an" );
+		assertTranslation( "select all an from Animal an" );
+	}
+
+	public void testSelectAssociatedEntityId() throws Exception {
+		assertTranslation( "select an.mother.id from Animal an" );
+	}
+
+	public void testGroupBy() throws Exception {
+		assertTranslation( "select an.mother.id, max(an.bodyWeight) from Animal an group by an.mother.id" );
+		assertTranslation( "select an.mother.id, max(an.bodyWeight) from Animal an group by an.mother.id having max(an.bodyWeight)>1.0" );
+	}
+
+	public void testGroupByMultiple() throws Exception {
+		assertTranslation( "select s.id, s.count, count(t), max(t.date) from org.hibernate.test.legacy.Simple s, org.hibernate.test.legacy.Simple t where s.count = t.count group by s.id, s.count order by s.count" );
+	}
+
+	public void testManyToMany() throws Exception {
+		assertTranslation( "from Human h join h.friends f where f.nickName = 'Gavin'" );
+		assertTranslation( "from Human h join h.friends f where f.bodyWeight > 100" );
+	}
+
+	public void testManyToManyElementFunctionInWhere() throws Exception {
+		assertTranslation( "from Human human where human in elements(human.friends)" );
+		assertTranslation( "from Human human where human = some elements(human.friends)" );
+	}
+
+	public void testManyToManyElementFunctionInWhere2() throws Exception {
+		assertTranslation( "from Human h1, Human h2 where h2 in elements(h1.family)" );
+		assertTranslation( "from Human h1, Human h2 where 'father' in indices(h1.family)" );
+	}
+
+	public void testManyToManyFetch() throws Exception {
+		assertTranslation( "from Human h left join fetch h.friends" );
+	}
+
+	public void testManyToManyIndexAccessor() throws Exception {
+		// From ParentChildTest.testCollectionQuery()
+		assertTranslation( "select c from ContainerX c, Simple s where c.manyToMany[2] = s" );
+		assertTranslation( "select s from ContainerX c, Simple s where c.manyToMany[2] = s" );
+		assertTranslation( "from ContainerX c, Simple s where c.manyToMany[2] = s" );
+		//would be nice to have:
+		//assertTranslation( "select c.manyToMany[2] from ContainerX c" );
+	}
+
+	public void testSelectNew() throws Exception {
+		assertTranslation( "select new Animal(an.description, an.bodyWeight) from Animal an" );
+		assertTranslation( "select new org.hibernate.test.hql.Animal(an.description, an.bodyWeight) from Animal an" );
+	}
+
+	public void testSimpleCorrelatedSubselect() throws Exception {
+		assertTranslation( "from Animal a where a.bodyWeight = (select o.bodyWeight from a.offspring o)" );
+		assertTranslation( "from Animal a where a = (from a.offspring o)" );
+	}
+
+	public void testSimpleUncorrelatedSubselect() throws Exception {
+		assertTranslation( "from Animal a where a.bodyWeight = (select an.bodyWeight from Animal an)" );
+		assertTranslation( "from Animal a where a = (from Animal an)" );
+	}
+
+	public void testSimpleCorrelatedSubselect2() throws Exception {
+		assertTranslation( "from Animal a where a = (select o from a.offspring o)" );
+		assertTranslation( "from Animal a where a in (select o from a.offspring o)" );
+	}
+
+	public void testSimpleUncorrelatedSubselect2() throws Exception {
+		assertTranslation( "from Animal a where a = (select an from Animal an)" );
+		assertTranslation( "from Animal a where a in (select an from Animal an)" );
+	}
+
+	public void testUncorrelatedSubselect2() throws Exception {
+		assertTranslation( "from Animal a where a.bodyWeight = (select max(an.bodyWeight) from Animal an)" );
+	}
+
+	public void testCorrelatedSubselect2() throws Exception {
+		assertTranslation( "from Animal a where a.bodyWeight > (select max(o.bodyWeight) from a.offspring o)" );
+	}
+
+	public void testManyToManyJoinInSubselect() throws Exception {
+		DotNode.useThetaStyleImplicitJoins = true;
+		assertTranslation( "select foo from Foo foo where foo in (select elt from Baz baz join baz.fooArray elt)" );
+		DotNode.useThetaStyleImplicitJoins = false;
+	}
+
+	public void testImplicitJoinInSubselect() throws Exception {
+		assertTranslation( "from Animal a where a = (select an.mother from Animal an)" );
+		assertTranslation( "from Animal a where a.id = (select an.mother.id from Animal an)" );
+	}
+
+	public void testManyToOneSubselect() {
+		//TODO: the join in the subselect also shows up in the outer query!
+		assertTranslation( "from Animal a where 'foo' in (select m.description from a.mother m)" );
+	}
+
+	public void testPositionalParameters() throws Exception {
+		assertTranslation( "from Animal an where an.bodyWeight > ?" );
+	}
+
+	public void testKeywordPropertyName() throws Exception {
+		assertTranslation( "from Glarch g order by g.order asc" );
+		assertTranslation( "select g.order from Glarch g where g.order = 3" );
+	}
+
+	public void testJavaConstant() throws Exception {
+		assertTranslation( "from org.hibernate.test.legacy.Category c where c.name = org.hibernate.test.legacy.Category.ROOT_CATEGORY" );
+		assertTranslation( "from org.hibernate.test.legacy.Category c where c.id = org.hibernate.test.legacy.Category.ROOT_ID" );
+		// todo : additional desired functionality
+		//assertTranslation( "from Category c where c.name = Category.ROOT_CATEGORY" );
+		//assertTranslation( "select c.name, Category.ROOT_ID from Category as c");
+	}
+
+	public void testClassName() throws Exception {
+		// The Zoo reference is OK; Zoo is discriminator-based;
+		// the old parser could handle these correctly
+		//
+		// However, the Animal one ares not; Animal is joined subclassing;
+		// the old parser does not handle thee correctly.  The new parser
+		// previously did not handle them correctly in that same way.  So they
+		// used to pass regression even though the output was bogus SQL...
+		//
+		// I have moved the Animal ones (plus duplicating the Zoo one)
+		// to ASTParserLoadingTest for syntax checking.
+		assertTranslation( "from Zoo zoo where zoo.class = PettingZoo" );
+//		assertTranslation( "from DomesticAnimal an where an.class = Dog" );
+//		assertTranslation( "from Animal an where an.class = Dog" );
+	}
+
+	public void testSelectDialectFunction() throws Exception {
+		// From SQLFunctionsTest.testDialectSQLFunctions...
+		if ( getDialect() instanceof HSQLDialect ) {
+			assertTranslation( "select mod(s.count, 2) from org.hibernate.test.legacy.Simple as s where s.id = 10" );
+			//assertTranslation( "from org.hibernate.test.legacy.Simple as s where mod(s.count, 2) = 0" );
+		}
+		assertTranslation( "select upper(human.name.first) from Human human" );
+		assertTranslation( "from Human human where lower(human.name.first) like 'gav%'" );
+		assertTranslation( "select upper(a.description) from Animal a" );
+		assertTranslation( "select max(a.bodyWeight) from Animal a" );
+	}
+
+	public void testTwoJoins() throws Exception {
+		assertTranslation( "from Human human join human.friends, Human h join h.mother" );
+		assertTranslation( "from Human human join human.friends f, Animal an join an.mother m where f=m" );
+		assertTranslation( "from Baz baz left join baz.fooToGlarch, Bar bar join bar.foo" );
+	}
+
+	public void testToOneToManyManyJoinSequence() throws Exception {
+		assertTranslation( "from Dog d join d.owner h join h.friends f where f.name.first like 'joe%'" );
+	}
+
+	public void testToOneToManyJoinSequence() throws Exception {
+		assertTranslation( "from Animal a join a.mother m join m.offspring" );
+		assertTranslation( "from Dog d join d.owner m join m.offspring" );
+		assertTranslation( "from Animal a join a.mother m join m.offspring o where o.bodyWeight > a.bodyWeight" );
+	}
+
+	public void testSubclassExplicitJoin() throws Exception {
+		assertTranslation( "from DomesticAnimal da join da.owner o where o.nickName = 'gavin'" );
+		assertTranslation( "from DomesticAnimal da join da.owner o where o.bodyWeight > 0" );
+	}
+
+	public void testMultipleExplicitCollectionJoins() throws Exception {
+		assertTranslation( "from Animal an inner join an.offspring os join os.offspring gc" );
+		assertTranslation( "from Animal an left outer join an.offspring os left outer join os.offspring gc" );
+	}
+
+	public void testSelectDistinctComposite() throws Exception {
+		// This is from CompositeElementTest.testHandSQL.
+		assertTranslation( "select distinct p from org.hibernate.test.compositeelement.Parent p join p.children c where c.name like 'Child%'" );
+	}
+
+	public void testDotComponent() throws Exception {
+		// from FumTest.testListIdentifiers()
+		assertTranslation( "select fum.id from org.hibernate.test.legacy.Fum as fum where not fum.fum='FRIEND'" );
+	}
+
+	public void testOrderByCount() throws Exception {
+		assertTranslation( "from Animal an group by an.zoo.id order by an.zoo.id, count(*)" );
+	}
+
+	public void testHavingCount() throws Exception {
+		assertTranslation( "from Animal an group by an.zoo.id having count(an.zoo.id) > 1" );
+	}
+
+	public void selectWhereElements() throws Exception {
+		assertTranslation( "select foo from Foo foo, Baz baz where foo in elements(baz.fooArray)" );
+	}
+
+	public void testCollectionOfComponents() throws Exception {
+		assertTranslation( "from Baz baz inner join baz.components comp where comp.name='foo'" );
+	}
+
+	public void testNestedComponentIsNull() {
+		// From MapTest...
+		assertTranslation( "from Commento c where c.marelo.commento.mcompr is null" );
+	}
+
+	public void testOneToOneJoinedFetch() throws Exception {
+		// From OneToOneTest.testOneToOneOnSubclass
+		assertTranslation( "from org.hibernate.test.onetoone.joined.Person p join fetch p.address left join fetch p.mailingAddress" );
+	}
+
+	public void testSubclassImplicitJoin() throws Exception {
+		assertTranslation( "from DomesticAnimal da where da.owner.nickName like 'Gavin%'" );
+		assertTranslation( "from DomesticAnimal da where da.owner.nickName = 'gavin'" );
+		assertTranslation( "from DomesticAnimal da where da.owner.bodyWeight > 0" );
+	}
+
+	public void testComponent2() throws Exception {
+		assertTranslation( "from Dog dog where dog.owner.name.first = 'Gavin'" );
+	}
+
+	public void testOneToOne() throws Exception {
+		assertTranslation( "from User u where u.human.nickName='Steve'" );
+		assertTranslation( "from User u where u.human.name.first='Steve'" );
+	}
+
+	public void testSelectClauseImplicitJoin() throws Exception {
+		//assertTranslation( "select d.owner.mother from Dog d" ); //bug in old qt
+		assertTranslation( "select d.owner.mother.description from Dog d" );
+		//assertTranslation( "select d.owner.mother from Dog d, Dog h" );
+	}
+
+	public void testFromClauseImplicitJoin() throws Exception {
+		assertTranslation( "from DomesticAnimal da join da.owner.mother m where m.bodyWeight > 10" );
+	}
+
+	public void testJoinedSubclassWithOrCondition() {
+		assertTranslation( "from Animal an where (an.bodyWeight > 10 and an.bodyWeight < 100) or an.bodyWeight is null" );
+	}
+
+	public void testImplicitJoinInFrom() {
+		assertTranslation( "from Human h join h.mother.mother.offspring o" );
+	}
+
+	public void testDuplicateImplicitJoinInSelect() {
+		// This test causes failures on theta-join dialects because the SQL is different.  The old parser
+		// duplicates the condition, whereas the new parser does not.  The queries are semantically the
+		// same however.
+		if ( getDialect() instanceof Oracle8iDialect ) return;
+// the classic translator handles this incorrectly; the explicit join and the implicit ones should create separate physical SQL joins...
+//		assertTranslation( "select an.mother.bodyWeight from Animal an join an.mother m where an.mother.bodyWeight > 10" );
+		assertTranslation( "select an.mother.bodyWeight from Animal an where an.mother.bodyWeight > 10" );
+		//assertTranslation("select an.mother from Animal an where an.mother.bodyWeight is not null");
+		assertTranslation( "select an.mother.bodyWeight from Animal an order by an.mother.bodyWeight" );
+	}
+
+	public void testConstructorNode() throws Exception {
+		ConstructorNode n = new ConstructorNode();
+		assertNull( n.getFromElement() );
+		assertFalse( n.isReturnableEntity() );
+	}
+
+	public void testIndexNode() throws Exception {
+		IndexNode n = new IndexNode();
+		Exception ex = null;
+		try {
+			n.setScalarColumnText( 0 );
+		}
+		catch ( UnsupportedOperationException e ) {
+			ex = e;
+		}
+		assertNotNull( ex );
+	}
+
+	public void testExceptions() throws Exception {
+		DetailedSemanticException dse = new DetailedSemanticException( "test" );
+		dse.printStackTrace();
+		dse.printStackTrace( new PrintWriter( new StringWriter() ) );
+		QuerySyntaxException qse = QuerySyntaxException.convert( new RecognitionException( "test" ), "from bozo b where b.clown = true" );
+		assertNotNull( qse.getMessage() );
+	}
+
+	public void testSelectProperty2() throws Exception {
+		assertTranslation( "select an, mo.bodyWeight from Animal an inner join an.mother mo where an.bodyWeight < mo.bodyWeight" );
+		assertTranslation( "select an, mo, an.bodyWeight, mo.bodyWeight from Animal an inner join an.mother mo where an.bodyWeight < mo.bodyWeight" );
+	}
+
+	public void testSubclassWhere() throws Exception {
+		// TODO: The classic QT generates lots of extra parens, etc.
+		assertTranslation( "from PettingZoo pz1, PettingZoo pz2 where pz1.id = pz2.id" );
+		assertTranslation( "from PettingZoo pz1, PettingZoo pz2 where pz1.id = pz2" );
+		assertTranslation( "from PettingZoo pz where pz.id > 0 " );
+	}
+
+	public void testNestedImplicitJoinsInSelect() throws Exception {
+		// NOTE: This test is not likely to generate the exact SQL because of the where clause.  The synthetic
+		// theta style joins come out differently in the new QT.
+		// From FooBarTest.testQuery()
+		// Missing the foo2_ join, and foo3_ should include subclasses, but it doesn't.
+//		assertTranslation("select foo.foo.foo.foo.string from org.hibernate.test.legacy.Foo foo where foo.foo.foo = 'bar'");
+		assertTranslation( "select foo.foo.foo.foo.string from org.hibernate.test.legacy.Foo foo" );
+	}
+
+	public void testNestedComponent() throws Exception {
+		// From FooBarTest.testQuery()
+		//an extra set of parens in new SQL
+		assertTranslation( "from org.hibernate.test.legacy.Foo foo where foo.component.subcomponent.name='bar'" );
+	}
+
+	public void testNull2() throws Exception {
+		//old parser generates useless extra parens
+		assertTranslation( "from Human h where not( h.nickName is null )" );
+		assertTranslation( "from Human h where not( h.nickName is not null )" );
+	}
+
+	public void testUnknownFailureFromMultiTableTest() {
+		assertTranslation( "from Lower s where s.yetanother.name='name'" );
+	}
+
+	public void testJoinInSubselect() throws Exception {
+		//new parser uses ANSI-style inner join syntax
+		DotNode.useThetaStyleImplicitJoins = true;
+		assertTranslation( "from Animal a where a in (select m from Animal an join an.mother m)" );
+		assertTranslation( "from Animal a where a in (select o from Animal an join an.offspring o)" );
+		DotNode.useThetaStyleImplicitJoins = false;
+	}
+
+	public void testJoinedSubclassImplicitJoin() throws Exception {
+		// From MultiTableTest.testQueries()
+		// TODO: This produces the proper from clause now, but the parens in the where clause are different.
+		assertTranslation( "from org.hibernate.test.legacy.Lower s where s.yetanother.name='name'" );
+	}
+
+	public void testProjectProductJoinedSubclass() throws Exception {
+		// TODO: The old QT generates the discriminator and the theta join in a strange order, and with two extra sets of parens, this is okay, right?
+		assertTranslation( "select zoo from Zoo zoo, PettingZoo pz where zoo=pz" );
+		assertTranslation( "select zoo, pz from Zoo zoo, PettingZoo pz where zoo=pz" );
+	}
+
+	public void testCorrelatedSubselect1() throws Exception {
+		// The old translator generates the theta join before the condition in the sub query.
+		// TODO: Decide if we want to bother generating the theta join in the same order (non simple).
+		assertTranslation( "from Animal a where exists (from a.offspring o where o.bodyWeight>10)" );
+	}
+
+	public void testOuterAliasInSubselect() {
+		assertTranslation( "from Human h where h = (from Animal an where an = h)" );
+	}
+
+	public void testFetch() throws Exception {
+		assertTranslation( "from Zoo zoo left join zoo.mammals" );
+		assertTranslation( "from Zoo zoo left join fetch zoo.mammals" );
+	}
+
+	public void testOneToManyElementFunctionInWhere() throws Exception {
+		assertTranslation( "from Zoo zoo where 'dog' in indices(zoo.mammals)" );
+		assertTranslation( "from Zoo zoo, Dog dog where dog in elements(zoo.mammals)" );
+	}
+
+	/*public void testManyToManyElementFunctionInSelect() throws Exception {
+		assertTranslation("select elements(zoo.mammals) from Zoo zoo");
+		assertTranslation("select indices(zoo.mammals) from Zoo zoo");
+	}*/
+
+	public void testManyToManyInJoin() throws Exception {
+		assertTranslation( "select x.id from Human h1 join h1.family x" );
+		//assertTranslation("select index(h2) from Human h1 join h1.family h2");
+	}
+
+	public void testManyToManyInSubselect() throws Exception {
+		assertTranslation( "from Human h1, Human h2 where h2 in (select x.id from h1.family x)" );
+		assertTranslation( "from Human h1, Human h2 where 'father' in indices(h1.family)" );
+	}
+
+	public void testOneToManyIndexAccess() throws Exception {
+		assertTranslation( "from Zoo zoo where zoo.mammals['dog'] is not null" );
+	}
+
+	public void testImpliedSelect() throws Exception {
+		assertTranslation( "select zoo from Zoo zoo" );
+		assertTranslation( "from Zoo zoo" );
+		assertTranslation( "from Zoo zoo join zoo.mammals m" );
+		assertTranslation( "from Zoo" );
+		assertTranslation( "from Zoo zoo join zoo.mammals" );
+	}
+
+	public void testVectorSubselect() {
+		assertTranslation( "from Animal a where ('foo', 'bar') in (select m.description, m.bodyWeight from a.mother m)" );
+	}
+
+	public void testWierdSubselectImplicitJoinStuff() {
+		//note that the new qt used to eliminate unnecessary join, but no more
+		assertTranslation("from Simple s where s = some( select sim from Simple sim where sim.other.count=s.other.count ) and s.other.count > 0");
+	}
+
+	/*public void testSelectElementsOfCollectionOfValues() throws Exception {
+		// From FooBarTest.testQuery()
+		// TODO: This produces the where clause in a different order, but it seems okay.
+		assertTranslation("select foo.component.name, elements(foo.component.importantDates) from org.hibernate.test.legacy.Foo foo where foo.foo.id=?");
+	}*/
+
+	//public void testMultiTableElements() throws Exception {
+	/*
+	HQL    : select elements(ls.bag), elements(ls.set) from org.hibernate.test.legacy.Lower ls
+	OLD SQL:
+	select top2_.id1_ as col_0_0_, top4_.id1_ as col_1_0_
+	from leafsubclass lower0_ inner join rootclass lower0_1_ on lower0_.id__=lower0_1_.id1_, simple_simple bag1_, rootclass top2_, rootclass set3_, rootclass top4_
+	where lower0_1_.id1_ is not null and lower0_.id__=bag1_.simple1 and bag1_.simple2=top2_.id1_ and lower0_.id__=set3_.parent and set3_.id1_=top4_.id1_
+	*/
+
+	//assertTranslation("select elements(ls.bag), elements(ls.set) from org.hibernate.test.legacy.Lower ls");
+	//}
+
+	public void testCollectionsInSelect2() throws Exception {
+		// This one looks okay now, it just generates extra parens in the where clause.
+		assertTranslation( "select foo.string from Bar bar left join bar.baz.fooArray foo where bar.string = foo.string" );
+	}
+
+
+	//public void testCollectionsInSelect() throws Exception {
+	// From FooBarTest.testCollectionsInSelect
+	/*
+	HQL    : select baz, baz.stringSet.size, count( distinct elements(baz.stringSet) ), max( elements(baz.stringSet) ) from org.hibernate.test.legacy.Baz baz group by baz
+	OLD SQL:
+	select
+		baz0_.baz_id_column_ as baz_id_c1_, baz0_.count_count as count_co2_37_, baz0_.name_b as name_b37_, baz0_.foo as foo37_, baz0_.superBaz as superBaz37_, baz0_.str as str37_, baz0_.baz_id_column_ as col_0_0_,
+		count(*) as col_1_0_,
+		count(distinct stringset2_.element) as col_2_0_, max(stringset3_.element) as col_3_0_
+	from baz baz0_, stringSet stringset1_, stringSet stringset2_, stringSet stringset3_
+	where baz0_.baz_id_column_=stringset1_.id_ and baz0_.baz_id_column_=stringset2_.id_ and baz0_.baz_id_column_=stringset3_.id_
+	group by  baz0_.baz_id_column_
+
+	NEW SQL:
+	select
+		// TODO: Remove the extra 'id' column select.
+		baz0_.baz_id_column_ as col_0_0_,
+		// TODO: Figure out how the classic translator knows to use count(*)
+		(select count(*) from stringSet stringset1_ where baz0_.baz_id_column_=stringset1_.id_) as col_1_0_,
+		// This is also correct.
+		count(distinct stringset2_.element) as col_2_0_, max(stringset3_.element) as col_3_0_,
+		// The properties of baz are correct, they're just in the wrong place.
+		baz0_.baz_id_column_ as baz_id_c1_, baz0_.count_count as count_co2_37_, baz0_.name_b as name_b37_, baz0_.foo as foo37_, baz0_.superBaz as superBaz37_, baz0_.str as str37_
+//		 FROM is okay.
+	from baz baz0_ stringSet stringset1_, stringSet stringset3_, stringSet stringset2_
+//		 WHERE is okay.
+	where (baz0_.baz_id_column_=stringset1_.id_ and baz0_.baz_id_column_=stringset2_.id_ baz0_.baz_id_column_=stringset3_.id_)
+//		 GROUP BY is okay.
+	group by  baz0_.baz_id_column_
+	*/
+	//assertTranslation( "select baz, size(baz.stringSet), count( distinct elements(baz.stringSet) ), max( elements(baz.stringSet) ) from org.hibernate.test.legacy.Baz baz group by baz");
+
+	//}
+
+	public void testAssociationPropertyWithoutAlias() throws Exception {
+		// The classic translator doesn't do this right, so don't bother asserting.
+		compileWithAstQueryTranslator("from Animal where zoo is null", false);
+	}
+
+	private void compileWithAstQueryTranslator(String hql, boolean scalar) {
+		Map replacements = new HashMap();
+		QueryTranslatorFactory ast = new ASTQueryTranslatorFactory();
+		SessionFactoryImplementor factory = getSessionFactoryImplementor();
+		QueryTranslator newQueryTranslator = ast.createQueryTranslator( hql, hql, Collections.EMPTY_MAP, factory );
+		newQueryTranslator.compile( replacements, scalar );
+	}
+
+	public void testComponentNoAlias() throws Exception {
+		// The classic translator doesn't do this right, so don't bother asserting.
+		compileWithAstQueryTranslator( "from Human where name.first = 'Gavin'", false);
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/HQLTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/HeresAnotherCrazyIdFieldName.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/HeresAnotherCrazyIdFieldName.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/HeresAnotherCrazyIdFieldName.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,35 @@
+// $Id: HeresAnotherCrazyIdFieldName.java 7471 2005-07-14 14:58:28Z steveebersole $
+package org.hibernate.test.hql;
+
+/**
+ * Implementation of HeresAnotherCrazyIdFieldName.
+ *
+ * @author Steve Ebersole
+ */
+public class HeresAnotherCrazyIdFieldName {
+	private Long heresAnotherCrazyIdFieldName;
+	private String name;
+
+	public HeresAnotherCrazyIdFieldName() {
+	}
+
+	public HeresAnotherCrazyIdFieldName(String name) {
+		this.name = name;
+	}
+
+	public Long getHeresAnotherCrazyIdFieldName() {
+		return heresAnotherCrazyIdFieldName;
+	}
+
+	public void setHeresAnotherCrazyIdFieldName(Long heresAnotherCrazyIdFieldName) {
+		this.heresAnotherCrazyIdFieldName = heresAnotherCrazyIdFieldName;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/HeresAnotherCrazyIdFieldName.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/HqlParserTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/HqlParserTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/HqlParserTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,1081 @@
+// $Id: HqlParserTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.hql;
+
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+
+import antlr.RecognitionException;
+import antlr.TokenStreamException;
+import antlr.collections.AST;
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.hibernate.hql.ast.HqlParser;
+import org.hibernate.hql.ast.tree.Node;
+import org.hibernate.hql.ast.util.ASTIterator;
+import org.hibernate.hql.ast.util.ASTPrinter;
+
+/**
+ * Tests the HQL parser on various inputs, just makes sure that the first phase of the parser
+ * works properly (i.e. no unexpected syntax errors).
+ */
+public class HqlParserTest extends TestCase {
+
+	/**
+	 * Standard JUnit test case constructor.
+	 *
+	 * @param name The name of the test case.
+	 */
+	public HqlParserTest(String name) {
+		super( name );
+	}
+	
+	public void testUnion() throws Exception {
+		parse("from Animal a where a in (from Cat union from Dog) ");
+	}
+
+	/**
+	 * Section 9.2 - from *
+	 */
+	public void testDocoExamples92() throws Exception {
+		parse( "from eg.Cat" );
+		parse( "from eg.Cat as cat" );
+		parse( "from eg.Cat cat" );
+		parse( "from Formula, Parameter" );
+		parse( "from Formula as form, Parameter as param" );
+	}
+
+	/**
+	 * Section 9.3 - Associations and joins *
+	 */
+	public void testDocoExamples93() throws Exception {
+		parse( "from eg.Cat as cat inner join cat.mate as mate left outer join cat.kittens as kitten" );
+		parse( "from eg.Cat as cat left join cat.mate.kittens as kittens" );
+		parse( "from Formula form full join form.parameter param" );
+		parse( "from eg.Cat as cat join cat.mate as mate left join cat.kittens as kitten" );
+		parse( "from eg.Cat as cat\ninner join fetch cat.mate\nleft join fetch cat.kittens" );
+	}
+
+	/**
+	 * Section 9.4 - Select *
+	 */
+	public void testDocoExamples94() throws Exception {
+		parse( "select mate from eg.Cat as cat inner join cat.mate as mate" );
+		parse( "select cat.mate from eg.Cat cat" );
+		parse( "select elements(cat.kittens) from eg.Cat cat" );
+		parse( "select cat.name from eg.DomesticCat cat where cat.name like 'fri%'" );
+		parse( "select cust.name.firstName from Customer as cust" );
+		parse( "select mother, offspr, mate.name from eg.DomesticCat\n"
+				+ " as mother inner join mother.mate as mate left outer join\n"
+				+ "mother.kittens as offspr" );
+		parse( "select new Family(mother, mate, offspr)\n"
+				+ "from eg.DomesticCat as mother\n"
+				+ "join mother.mate as mate\n"
+				+ "left join mother.kittens as offspr\n" );
+	}
+
+	/**
+	 * Section 9.5 - Aggregate functions *
+	 */
+	public void testDocoExamples95() throws Exception {
+		parse( "select avg(cat.weight), sum(cat.weight), max(cat.weight), count(cat)\n"
+				+ "from eg.Cat cat" );
+		parse( "select cat, count( elements(cat.kittens) )\n"
+				+ " from eg.Cat cat group by cat" );
+		parse( "select distinct cat.name from eg.Cat cat" );
+		parse( "select count(distinct cat.name), count(cat) from eg.Cat cat" );
+	}
+
+	/**
+	 * Section 9.6 - Polymorphism *
+	 */
+	public void testDocoExamples96() throws Exception {
+		parse( "from eg.Cat as cat" );
+		parse( "from java.lang.Object o" );
+		parse( "from eg.Named n, eg.Named m where n.name = m.name" );
+	}
+
+	/**
+	 * Section 9.7 - Where *
+	 */
+	public void testDocoExamples97() throws Exception {
+		parse( "from eg.Cat as cat where cat.name='Fritz'" );
+		parse( "select foo\n"
+				+ "from eg.Foo foo, eg.Bar bar\n"
+				+ "where foo.startDate = bar.date\n" );
+		parse( "from eg.Cat cat where cat.mate.name is not null" );
+		parse( "from eg.Cat cat, eg.Cat rival where cat.mate = rival.mate" );
+		parse( "select cat, mate\n"
+				+ "from eg.Cat cat, eg.Cat mate\n"
+				+ "where cat.mate = mate" );
+		parse( "from eg.Cat as cat where cat.id = 123" );
+		parse( "from eg.Cat as cat where cat.mate.id = 69" );
+		parse( "from bank.Person person\n"
+				+ "where person.id.country = 'AU'\n"
+				+ "and person.id.medicareNumber = 123456" );
+		parse( "from bank.Account account\n"
+				+ "where account.owner.id.country = 'AU'\n"
+				+ "and account.owner.id.medicareNumber = 123456" );
+		parse( "from eg.Cat cat where cat.class = eg.DomesticCat" );
+		parse( "from eg.AuditLog log, eg.Payment payment\n"
+				+ "where log.item.class = 'eg.Payment' and log.item.id = payment.id" );
+	}
+
+	/**
+	 * Section 9.8 - Expressions *
+	 */
+	public void testDocoExamples98() throws Exception {
+		parse( "from eg.DomesticCat cat where cat.name between 'A' and 'B'" );
+		parse( "from eg.DomesticCat cat where cat.name in ( 'Foo', 'Bar', 'Baz' )" );
+		parse( "from eg.DomesticCat cat where cat.name not between 'A' and 'B'" );
+		parse( "from eg.DomesticCat cat where cat.name not in ( 'Foo', 'Bar', 'Baz' )" );
+		parse( "from eg.Cat cat where cat.kittens.size > 0" );
+		parse( "from eg.Cat cat where size(cat.kittens) > 0" );
+// This is a little odd.  I'm not sure whether 'current' is a keyword.
+//        parse("from Calendar cal where cal.holidays.maxElement > current date");
+// Using the token 'order' as both a keyword and an identifier works now, but
+// the second instance causes some problems because order is valid in the second instance.
+//        parse("from Order order where maxindex(order.items) > 100");
+//        parse("from Order order where minelement(order.items) > 10000");
+		parse( "from Order ord where maxindex(ord.items) > 100" );
+		parse( "from Order ord where minelement(ord.items) > 10000" );
+
+		parse( "select mother from eg.Cat as mother, eg.Cat as kit\n"
+				+ "where kit in elements(foo.kittens)" );
+		parse( "select p from eg.NameList list, eg.Person p\n"
+				+ "where p.name = some elements(list.names)" );
+		parse( "from eg.Cat cat where exists elements(cat.kittens)" );
+		parse( "from eg.Player p where 3 > all elements(p.scores)" );
+		parse( "from eg.Show show where 'fizard' in indices(show.acts)" );
+
+		// Yet another example of the pathological 'order' token.
+//        parse("from Order order where order.items[0].id = 1234");
+//        parse("select person from Person person, Calendar calendar\n"
+//        + "where calendar.holidays['national day'] = person.birthDay\n"
+//        + "and person.nationality.calendar = calendar");
+//        parse("select item from Item item, Order order\n"
+//        + "where order.items[ order.deliveredItemIndices[0] ] = item and order.id = 11");
+//        parse("select item from Item item, Order order\n"
+//        + "where order.items[ maxindex(order.items) ] = item and order.id = 11");
+
+		parse( "from Order ord where ord.items[0].id = 1234" );
+		parse( "select person from Person person, Calendar calendar\n"
+				+ "where calendar.holidays['national day'] = person.birthDay\n"
+				+ "and person.nationality.calendar = calendar" );
+		parse( "select item from Item item, Order ord\n"
+				+ "where ord.items[ ord.deliveredItemIndices[0] ] = item and ord.id = 11" );
+		parse( "select item from Item item, Order ord\n"
+				+ "where ord.items[ maxindex(ord.items) ] = item and ord.id = 11" );
+
+		parse( "select item from Item item, Order ord\n"
+				+ "where ord.items[ size(ord.items) - 1 ] = item" );
+
+		parse( "from eg.DomesticCat cat where upper(cat.name) like 'FRI%'" );
+
+		parse( "select cust from Product prod, Store store\n"
+				+ "inner join store.customers cust\n"
+				+ "where prod.name = 'widget'\n"
+				+ "and store.location.name in ( 'Melbourne', 'Sydney' )\n"
+				+ "and prod = all elements(cust.currentOrder.lineItems)" );
+
+	}
+
+	public void testDocoExamples99() throws Exception {
+		parse( "from eg.DomesticCat cat\n"
+				+ "order by cat.name asc, cat.weight desc, cat.birthdate" );
+	}
+
+	public void testDocoExamples910() throws Exception {
+		parse( "select cat.color, sum(cat.weight), count(cat)\n"
+				+ "from eg.Cat cat group by cat.color" );
+		parse( "select foo.id, avg( elements(foo.names) ), max( indices(foo.names) )\n"
+				+ "from eg.Foo foo group by foo.id" );
+		parse( "select cat.color, sum(cat.weight), count(cat)\n"
+				+ "from eg.Cat cat group by cat.color\n"
+				+ "having cat.color in (eg.Color.TABBY, eg.Color.BLACK)" );
+		parse( "select cat from eg.Cat cat join cat.kittens kitten\n"
+				+ "group by cat having avg(kitten.weight) > 100\n"
+				+ "order by count(kitten) asc, sum(kitten.weight) desc" );
+	}
+
+	public void testDocoExamples911() throws Exception {
+		parse( "from eg.Cat as fatcat where fatcat.weight > (\n"
+				+ "select avg(cat.weight) from eg.DomesticCat cat)" );
+		parse( "from eg.DomesticCat as cat where cat.name = some (\n"
+				+ "select name.nickName from eg.Name as name)\n" );
+		parse( "from eg.Cat as cat where not exists (\n"
+				+ "from eg.Cat as mate where mate.mate = cat)" );
+		parse( "from eg.DomesticCat as cat where cat.name not in (\n"
+				+ "select name.nickName from eg.Name as name)" );
+	}
+
+	public void testDocoExamples912() throws Exception {
+		parse( "select ord.id, sum(price.amount), count(item)\n"
+				+ "from Order as ord join ord.lineItems as item\n"
+				+ "join item.product as product, Catalog as catalog\n"
+				+ "join catalog.prices as price\n"
+				+ "where ord.paid = false\n"
+				+ "and ord.customer = :customer\n"
+				+ "and price.product = product\n"
+				+ "and catalog.effectiveDate < sysdate\n"
+				+ "and catalog.effectiveDate >= all (\n"
+				+ "select cat.effectiveDate from Catalog as cat where cat.effectiveDate < sysdate)\n"
+				+ "group by ord\n"
+				+ "having sum(price.amount) > :minAmount\n"
+				+ "order by sum(price.amount) desc" );
+
+		parse( "select ord.id, sum(price.amount), count(item)\n"
+				+ "from Order as ord join ord.lineItems as item join item.product as product,\n"
+				+ "Catalog as catalog join catalog.prices as price\n"
+				+ "where ord.paid = false and ord.customer = :customer\n"
+				+ "and price.product = product and catalog = :currentCatalog\n"
+				+ "group by ord having sum(price.amount) > :minAmount\n"
+				+ "order by sum(price.amount) desc" );
+
+		parse( "select count(payment), status.name \n"
+				+ "from Payment as payment \n"
+				+ "    join payment.currentStatus as status\n"
+				+ "    join payment.statusChanges as statusChange\n"
+				+ "where payment.status.name <> PaymentStatus.AWAITING_APPROVAL\n"
+				+ "    or (\n"
+				+ "        statusChange.timeStamp = ( \n"
+				+ "            select max(change.timeStamp) \n"
+				+ "            from PaymentStatusChange change \n"
+				+ "            where change.payment = payment\n"
+				+ "        )\n"
+				+ "        and statusChange.user <> :currentUser\n"
+				+ "    )\n"
+				+ "group by status.name, status.sortOrder\n"
+				+ "order by status.sortOrder" );
+		parse( "select count(payment), status.name \n"
+				+ "from Payment as payment\n"
+				+ "    join payment.currentStatus as status\n"
+				+ "where payment.status.name <> PaymentStatus.AWAITING_APPROVAL\n"
+				+ "    or payment.statusChanges[ maxIndex(payment.statusChanges) ].user <> :currentUser\n"
+				+ "group by status.name, status.sortOrder\n"
+				+ "order by status.sortOrder" );
+		parse( "select account, payment\n"
+				+ "from Account as account\n"
+				+ "    left outer join account.payments as payment\n"
+				+ "where :currentUser in elements(account.holder.users)\n"
+				+ "    and PaymentStatus.UNPAID = isNull(payment.currentStatus.name, PaymentStatus.UNPAID)\n"
+				+ "order by account.type.sortOrder, account.accountNumber, payment.dueDate" );
+		parse( "select account, payment\n"
+				+ "from Account as account\n"
+				+ "    join account.holder.users as user\n"
+				+ "    left outer join account.payments as payment\n"
+				+ "where :currentUser = user\n"
+				+ "    and PaymentStatus.UNPAID = isNull(payment.currentStatus.name, PaymentStatus.UNPAID)\n"
+				+ "order by account.type.sortOrder, account.accountNumber, payment.dueDate" );
+	}
+
+	public void testExamples1() throws Exception {
+		parse( "select new org.hibernate.test.S(s.count, s.address)\n"
+				+ "from s in class Simple" );
+		parse( "select s.name, sysdate, trunc(s.pay), round(s.pay) from s in class Simple" );
+		parse( "select round(s.pay, 2) from s" );
+		parse( "select abs(round(s.pay)) from s in class Simple" );
+		parse( "select trunc(round(sysdate)) from s in class Simple" );
+	}
+
+	public void testArrayExpr() throws Exception {
+		parse( "from Order ord where ord.items[0].id = 1234" );
+	}
+
+	public void testMultipleActualParameters() throws Exception {
+		parse( "select round(s.pay, 2) from s" );
+	}
+
+	public void testMultipleFromClasses() throws Exception {
+		parse( "FROM eg.mypackage.Cat qat, com.toadstool.Foo f" );
+		parse( "FROM eg.mypackage.Cat qat, org.jabberwocky.Dipstick" );
+	}
+
+	public void testFromWithJoin() throws Exception {
+		parse( "FROM eg.mypackage.Cat qat, com.toadstool.Foo f join net.sf.blurb.Blurb" );
+		parse( "FROM eg.mypackage.Cat qat  left join com.multijoin.JoinORama , com.toadstool.Foo f join net.sf.blurb.Blurb" );
+	}
+
+	public void testSelect() throws Exception {
+		parse( "SELECT f FROM eg.mypackage.Cat qat, com.toadstool.Foo f join net.sf.blurb.Blurb" );
+		parse( "SELECT DISTINCT bar FROM eg.mypackage.Cat qat  left join com.multijoin.JoinORama as bar, com.toadstool.Foo f join net.sf.blurb.Blurb" );
+		parse( "SELECT count(*) FROM eg.mypackage.Cat qat" );
+		parse( "SELECT avg(qat.weight) FROM eg.mypackage.Cat qat" );
+	}
+
+	public void testWhere() throws Exception {
+		parse( "FROM eg.mypackage.Cat qat where qat.name like '%fluffy%' or qat.toes > 5" );
+		parse( "FROM eg.mypackage.Cat qat where not qat.name like '%fluffy%' or qat.toes > 5" );
+		parse( "FROM eg.mypackage.Cat qat where not qat.name not like '%fluffy%'" );
+		parse( "FROM eg.mypackage.Cat qat where qat.name in ('crater','bean','fluffy')" );
+		parse( "FROM eg.mypackage.Cat qat where qat.name not in ('crater','bean','fluffy')" );
+		parse( "from Animal an where sqrt(an.bodyWeight)/2 > 10" );
+		parse( "from Animal an where (an.bodyWeight > 10 and an.bodyWeight < 100) or an.bodyWeight is null" );
+	}
+
+	public void testGroupBy() throws Exception {
+		parse( "FROM eg.mypackage.Cat qat group by qat.breed" );
+		parse( "FROM eg.mypackage.Cat qat group by qat.breed, qat.eyecolor" );
+	}
+
+	public void testOrderBy() throws Exception {
+		parse( "FROM eg.mypackage.Cat qat order by avg(qat.toes)" );
+		parse( "from Animal an order by sqrt(an.bodyWeight)/2" );
+	}
+
+	public void testDoubleLiteral() throws Exception {
+		parse( "from eg.Cat as tinycat where fatcat.weight < 3.1415" );
+		parse( "from eg.Cat as enormouscat where fatcat.weight > 3.1415e3" );
+	}
+
+	public void testComplexConstructor() throws Exception {
+		parse( "select new Foo(count(bar)) from bar" );
+		parse( "select new Foo(count(bar),(select count(*) from doofus d where d.gob = 'fat' )) from bar" );
+	}
+
+
+	public void testInNotIn() throws Exception {
+		parse( "from foo where foo.bar in ('a' , 'b', 'c')" );
+		parse( "from foo where foo.bar not in ('a' , 'b', 'c')" );
+	}
+
+	public void testOperatorPrecedence() throws Exception {
+		parse( "from foo where foo.bar = 123 + foo.baz * foo.not" );
+		parse( "from foo where foo.bar like 'testzzz' || foo.baz or foo.bar in ('duh', 'gob')" );
+	}
+
+	/**
+	 * Tests HQL generated by the other unit tests.
+	 *
+	 * @throws Exception if the HQL could not be parsed.
+	 */
+	public void testUnitTestHql() throws Exception {
+		parse( "select foo from foo in class org.hibernate.test.Foo, fee in class org.hibernate.test.Fee where foo.dependent = fee order by foo.string desc, foo.component.count asc, fee.id" );
+		parse( "select foo.foo, foo.dependent from foo in class org.hibernate.test.Foo order by foo.foo.string desc, foo.component.count asc, foo.dependent.id" );
+		parse( "select foo from foo in class org.hibernate.test.Foo order by foo.dependent.id, foo.dependent.fi" );
+		parse( "SELECT one FROM one IN CLASS org.hibernate.test.One ORDER BY one.value ASC" );
+		parse( "SELECT many.one FROM many IN CLASS org.hibernate.test.Many ORDER BY many.one.value ASC, many.one.id" );
+		parse( "select foo.id from org.hibernate.test.Foo foo where foo.joinedProp = 'foo'" );
+		parse( "from org.hibernate.test.Foo foo inner join fetch foo.foo" );
+		parse( "from org.hibernate.test.Baz baz left outer join fetch baz.fooToGlarch" );
+		parse( "select foo.foo.foo.string from foo in class org.hibernate.test.Foo where foo.foo = 'bar'" );
+		parse( "select foo.foo.foo.foo.string from foo in class org.hibernate.test.Foo where foo.foo.foo = 'bar'" );
+		parse( "select foo.foo.foo.string from foo in class org.hibernate.test.Foo where foo.foo.foo.foo.string = 'bar'" );
+		parse( "select foo.string from foo in class org.hibernate.test.Foo where foo.foo.foo = 'bar' and foo.foo.foo.foo = 'baz'" );
+		parse( "select foo.string from foo in class org.hibernate.test.Foo where foo.foo.foo.foo.string = 'a' and foo.foo.string = 'b'" );
+		parse( "from org.hibernate.test.Foo as foo where foo.component.glarch.name is not null" );
+		parse( "from org.hibernate.test.Foo as foo left outer join foo.component.glarch as glarch where glarch.name = 'foo'" );
+		parse( "from org.hibernate.test.Foo" );
+		parse( "from org.hibernate.test.Foo foo left outer join foo.foo" );
+		parse( "from org.hibernate.test.Foo, org.hibernate.test.Bar" );
+		parse( "from org.hibernate.test.Baz baz left join baz.fooToGlarch, org.hibernate.test.Bar bar join bar.foo" );
+		parse( "from org.hibernate.test.Baz baz left join baz.fooToGlarch join baz.fooSet" );
+		parse( "from org.hibernate.test.Baz baz left join baz.fooToGlarch join fetch baz.fooSet foo left join fetch foo.foo" );
+		parse( "from foo in class org.hibernate.test.Foo where foo.string='osama bin laden' and foo.boolean = true order by foo.string asc, foo.component.count desc" );
+		parse( "from foo in class org.hibernate.test.Foo where foo.string='osama bin laden' order by foo.string asc, foo.component.count desc" );
+		parse( "select foo.foo from foo in class org.hibernate.test.Foo" );
+		parse( "from foo in class org.hibernate.test.Foo where foo.component.count is null order by foo.component.count" );
+		parse( "from foo in class org.hibernate.test.Foo where foo.component.name='foo'" );
+		parse( "select distinct foo.component.name, foo.component.name from foo in class org.hibernate.test.Foo where foo.component.name='foo'" );
+		parse( "select distinct foo.component.name, foo.id from foo in class org.hibernate.test.Foo where foo.component.name='foo'" );
+		parse( "from foo in class org.hibernate.test.Foo where foo.id=?" );
+		parse( "from foo in class org.hibernate.test.Foo where foo.key=?" );
+		parse( "select foo.foo from foo in class org.hibernate.test.Foo where foo.string='fizard'" );
+		parse( "from foo in class org.hibernate.test.Foo where foo.component.subcomponent.name='bar'" );
+		parse( "select foo.foo from foo in class org.hibernate.test.Foo where foo.foo.id=?" );
+		parse( "from foo in class org.hibernate.test.Foo where foo.foo = ?" );
+		parse( "from bar in class org.hibernate.test.Bar where bar.string='a string' or bar.string='a string'" );
+		parse( "select foo.component.name, elements(foo.component.importantDates) from foo in class org.hibernate.test.Foo where foo.foo.id=?" );
+		parse( "select max(elements(foo.component.importantDates)) from foo in class org.hibernate.test.Foo group by foo.id" );
+		parse( "select foo.foo.foo.foo from foo in class org.hibernate.test.Foo, foo2 in class org.hibernate.test.Foo where foo = foo2.foo and not not ( not foo.string='fizard' ) and foo2.string between 'a' and (foo.foo.string) and ( foo2.string in ( 'fiz', 'blah') or 1=1 )" );
+		parse( "from foo in class org.hibernate.test.Foo where foo.string='from BoogieDown  -tinsel town  =!@#$^&*())'" );
+		parse( "from foo in class org.hibernate.test.Foo where not foo.string='foo''bar'" ); // Added quote quote is an escape
+		parse( "from foo in class org.hibernate.test.Foo where foo.component.glarch.next is null" );
+		parse( " from bar in class org.hibernate.test.Bar where bar.baz.count=667 and bar.baz.count!=123 and not bar.baz.name='1-E-1'" );
+		parse( " from i in class org.hibernate.test.Bar where i.baz.name='Bazza'" );
+		parse( "select count(distinct foo.foo) from foo in class org.hibernate.test.Foo" );
+		parse( "select count(foo.foo.boolean) from foo in class org.hibernate.test.Foo" );
+		parse( "select count(*), foo.int from foo in class org.hibernate.test.Foo group by foo.int" );
+		parse( "select sum(foo.foo.int) from foo in class org.hibernate.test.Foo" );
+		parse( "select count(foo) from foo in class org.hibernate.test.Foo where foo.id=?" );
+		parse( "from foo in class org.hibernate.test.Foo where foo.boolean = ?" );
+		parse( "select new Foo(fo.x) from org.hibernate.test.Fo fo" );
+		parse( "select new Foo(fo.integer) from org.hibernate.test.Foo fo" );
+		parse( "select new Foo(fo.x) from org.hibernate.test.Foo fo" );
+		parse( "select foo.long, foo.component.name, foo, foo.foo from foo in class org.hibernate.test.Foo" );
+		parse( "select avg(foo.float), max(foo.component.name), count(distinct foo.id) from foo in class org.hibernate.test.Foo" );
+		parse( "select foo.long, foo.component, foo, foo.foo from foo in class org.hibernate.test.Foo" );
+		parse( "from o in class org.hibernate.test.MoreStuff" );
+		parse( "from o in class org.hibernate.test.Many" );
+		parse( "from o in class org.hibernate.test.Fee" );
+		parse( "from o in class org.hibernate.test.Qux" );
+		parse( "from o in class org.hibernate.test.Y" );
+		parse( "from o in class org.hibernate.test.Fumm" );
+		parse( "from o in class org.hibernate.test.X" );
+		parse( "from o in class org.hibernate.test.Simple" );
+		parse( "from o in class org.hibernate.test.Location" );
+		parse( "from o in class org.hibernate.test.Holder" );
+		parse( "from o in class org.hibernate.test.Part" );
+		parse( "from o in class org.hibernate.test.Baz" );
+		parse( "from o in class org.hibernate.test.Vetoer" );
+		parse( "from o in class org.hibernate.test.Sortable" );
+		parse( "from o in class org.hibernate.test.Contained" );
+		parse( "from o in class org.hibernate.test.Stuff" );
+		parse( "from o in class org.hibernate.test.Immutable" );
+		parse( "from o in class org.hibernate.test.Container" );
+		parse( "from o in class org.hibernate.test.X$XX" );
+		parse( "from o in class org.hibernate.test.One" );
+		parse( "from o in class org.hibernate.test.Foo" );
+		parse( "from o in class org.hibernate.test.Fo" );
+		parse( "from o in class org.hibernate.test.Glarch" );
+		parse( "from o in class org.hibernate.test.Fum" );
+		parse( "from n in class org.hibernate.test.Holder" );
+		parse( "from n in class org.hibernate.test.Baz" );
+		parse( "from n in class org.hibernate.test.Bar" );
+		parse( "from n in class org.hibernate.test.Glarch" );
+		parse( "from n in class org.hibernate.test.Holder where n.name is not null" );
+		parse( "from n in class org.hibernate.test.Baz where n.name is not null" );
+		parse( "from n in class org.hibernate.test.Bar where n.name is not null" );
+		parse( "from n in class org.hibernate.test.Glarch where n.name is not null" );
+		parse( "from n in class org.hibernate.test.Holder" );
+		parse( "from n in class org.hibernate.test.Baz" );
+		parse( "from n in class org.hibernate.test.Bar" );
+		parse( "from n in class org.hibernate.test.Glarch" );
+		parse( "from n0 in class org.hibernate.test.Holder, n1 in class org.hibernate.test.Holder where n0.name = n1.name" );
+		parse( "from n0 in class org.hibernate.test.Baz, n1 in class org.hibernate.test.Holder where n0.name = n1.name" );
+		parse( "from n0 in class org.hibernate.test.Bar, n1 in class org.hibernate.test.Holder where n0.name = n1.name" );
+		parse( "from n0 in class org.hibernate.test.Glarch, n1 in class org.hibernate.test.Holder where n0.name = n1.name" );
+		parse( "from n0 in class org.hibernate.test.Holder, n1 in class org.hibernate.test.Baz where n0.name = n1.name" );
+		parse( "from n0 in class org.hibernate.test.Baz, n1 in class org.hibernate.test.Baz where n0.name = n1.name" );
+		parse( "from n0 in class org.hibernate.test.Bar, n1 in class org.hibernate.test.Baz where n0.name = n1.name" );
+		parse( "from n0 in class org.hibernate.test.Glarch, n1 in class org.hibernate.test.Baz where n0.name = n1.name" );
+		parse( "from n0 in class org.hibernate.test.Holder, n1 in class org.hibernate.test.Bar where n0.name = n1.name" );
+		parse( "from n0 in class org.hibernate.test.Baz, n1 in class org.hibernate.test.Bar where n0.name = n1.name" );
+		parse( "from n0 in class org.hibernate.test.Bar, n1 in class org.hibernate.test.Bar where n0.name = n1.name" );
+		parse( "from n0 in class org.hibernate.test.Glarch, n1 in class org.hibernate.test.Bar where n0.name = n1.name" );
+		parse( "from n0 in class org.hibernate.test.Holder, n1 in class org.hibernate.test.Glarch where n0.name = n1.name" );
+		parse( "from n0 in class org.hibernate.test.Baz, n1 in class org.hibernate.test.Glarch where n0.name = n1.name" );
+		parse( "from n0 in class org.hibernate.test.Bar, n1 in class org.hibernate.test.Glarch where n0.name = n1.name" );
+		parse( "from n0 in class org.hibernate.test.Glarch, n1 in class org.hibernate.test.Glarch where n0.name = n1.name" );
+		parse( "from n in class org.hibernate.test.Holder where n.name = :name" );
+		parse( "from o in class org.hibernate.test.MoreStuff" );
+		parse( "from o in class org.hibernate.test.Many" );
+		parse( "from o in class org.hibernate.test.Fee" );
+		parse( "from o in class org.hibernate.test.Qux" );
+		parse( "from o in class org.hibernate.test.Y" );
+		parse( "from o in class org.hibernate.test.Fumm" );
+		parse( "from o in class org.hibernate.test.X" );
+		parse( "from o in class org.hibernate.test.Simple" );
+		parse( "from o in class org.hibernate.test.Location" );
+		parse( "from o in class org.hibernate.test.Holder" );
+		parse( "from o in class org.hibernate.test.Part" );
+		parse( "from o in class org.hibernate.test.Baz" );
+		parse( "from o in class org.hibernate.test.Vetoer" );
+		parse( "from o in class org.hibernate.test.Sortable" );
+		parse( "from o in class org.hibernate.test.Contained" );
+		parse( "from o in class org.hibernate.test.Stuff" );
+		parse( "from o in class org.hibernate.test.Immutable" );
+		parse( "from o in class org.hibernate.test.Container" );
+		parse( "from o in class org.hibernate.test.X$XX" );
+		parse( "from o in class org.hibernate.test.One" );
+		parse( "from o in class org.hibernate.test.Foo" );
+		parse( "from o in class org.hibernate.test.Fo" );
+		parse( "from o in class org.hibernate.test.Glarch" );
+		parse( "from o in class org.hibernate.test.Fum" );
+		parse( "select baz.code, min(baz.count) from baz in class org.hibernate.test.Baz group by baz.code" );
+		parse( "selecT baz from baz in class org.hibernate.test.Baz where baz.stringDateMap['foo'] is not null or baz.stringDateMap['bar'] = ?" );
+		parse( "select baz from baz in class org.hibernate.test.Baz where baz.stringDateMap['now'] is not null" );
+		parse( "select baz from baz in class org.hibernate.test.Baz where baz.stringDateMap['now'] is not null and baz.stringDateMap['big bang'] < baz.stringDateMap['now']" );
+		parse( "select index(date) from org.hibernate.test.Baz baz join baz.stringDateMap date" );
+		parse( "from foo in class org.hibernate.test.Foo where foo.integer not between 1 and 5 and foo.string not in ('cde', 'abc') and foo.string is not null and foo.integer<=3" );
+		parse( "from org.hibernate.test.Baz baz inner join baz.collectionComponent.nested.foos foo where foo.string is null" );
+		parse( "from org.hibernate.test.Baz baz inner join baz.fooSet where '1' in (from baz.fooSet foo where foo.string is not null)" );
+		parse( "from org.hibernate.test.Baz baz where 'a' in elements(baz.collectionComponent.nested.foos) and 1.0 in elements(baz.collectionComponent.nested.floats)" );
+		parse( "from org.hibernate.test.Foo foo join foo.foo where foo.foo in ('1','2','3')" );
+		parse( "select foo.foo from org.hibernate.test.Foo foo where foo.foo in ('1','2','3')" );
+		parse( "select foo.foo.string from org.hibernate.test.Foo foo where foo.foo in ('1','2','3')" );
+		parse( "select foo.foo.string from org.hibernate.test.Foo foo where foo.foo.string in ('1','2','3')" );
+		parse( "select foo.foo.long from org.hibernate.test.Foo foo where foo.foo.string in ('1','2','3')" );
+		parse( "select count(*) from org.hibernate.test.Foo foo where foo.foo.string in ('1','2','3') or foo.foo.long in (1,2,3)" );
+		parse( "select count(*) from org.hibernate.test.Foo foo where foo.foo.string in ('1','2','3') group by foo.foo.long" );
+		parse( "from org.hibernate.test.Foo foo1 left join foo1.foo foo2 left join foo2.foo where foo1.string is not null" );
+		parse( "from org.hibernate.test.Foo foo1 left join foo1.foo.foo where foo1.string is not null" );
+		parse( "from org.hibernate.test.Foo foo1 left join foo1.foo foo2 left join foo1.foo.foo foo3 where foo1.string is not null" );
+		parse( "select foo.formula from org.hibernate.test.Foo foo where foo.formula > 0" );
+		parse( "from org.hibernate.test.Foo as foo join foo.foo as foo2 where foo2.id >'a' or foo2.id <'a'" );
+		parse( "from org.hibernate.test.Holder" );
+		parse( "from org.hibernate.test.Baz baz left outer join fetch baz.manyToAny" );
+		parse( "from org.hibernate.test.Baz baz join baz.manyToAny" );
+		parse( "select baz from org.hibernate.test.Baz baz join baz.manyToAny a where index(a) = 0" );
+		parse( "select bar from org.hibernate.test.Bar bar where bar.baz.stringDateMap['now'] is not null" );
+		parse( "select bar from org.hibernate.test.Bar bar join bar.baz b where b.stringDateMap['big bang'] < b.stringDateMap['now'] and b.stringDateMap['now'] is not null" );
+		parse( "select bar from org.hibernate.test.Bar bar where bar.baz.stringDateMap['big bang'] < bar.baz.stringDateMap['now'] and bar.baz.stringDateMap['now'] is not null" );
+		parse( "select foo.string, foo.component, foo.id from org.hibernate.test.Bar foo" );
+		parse( "select elements(baz.components) from org.hibernate.test.Baz baz" );
+		parse( "select bc.name from org.hibernate.test.Baz baz join baz.components bc" );
+		parse( "from org.hibernate.test.Foo foo where foo.integer < 10 order by foo.string" );
+		parse( "from org.hibernate.test.Fee" );
+		parse( "from org.hibernate.test.Holder h join h.otherHolder oh where h.otherHolder.name = 'bar'" );
+		parse( "from org.hibernate.test.Baz baz join baz.fooSet foo join foo.foo.foo foo2 where foo2.string = 'foo'" );
+		parse( "from org.hibernate.test.Baz baz join baz.fooArray foo join foo.foo.foo foo2 where foo2.string = 'foo'" );
+		parse( "from org.hibernate.test.Baz baz join baz.stringDateMap date where index(date) = 'foo'" );
+		parse( "from org.hibernate.test.Baz baz join baz.topGlarchez g where index(g) = 'A'" );
+		parse( "select index(g) from org.hibernate.test.Baz baz join baz.topGlarchez g" );
+		parse( "from org.hibernate.test.Baz baz left join baz.stringSet" );
+		parse( "from org.hibernate.test.Baz baz join baz.stringSet str where str='foo'" );
+		parse( "from org.hibernate.test.Baz baz left join fetch baz.stringSet" );
+		parse( "from org.hibernate.test.Baz baz join baz.stringSet string where string='foo'" );
+		parse( "from org.hibernate.test.Baz baz inner join baz.components comp where comp.name='foo'" );
+		parse( "from org.hibernate.test.Glarch g inner join g.fooComponents comp where comp.fee is not null" );
+		parse( "from org.hibernate.test.Glarch g inner join g.fooComponents comp join comp.fee fee where fee.count > 0" );
+		parse( "from org.hibernate.test.Glarch g inner join g.fooComponents comp where comp.fee.count is not null" );
+		parse( "from org.hibernate.test.Baz baz left join fetch baz.fooBag" );
+		parse( "from org.hibernate.test.Glarch" );
+		parse( "from org.hibernate.test.Fee" );
+		parse( "from org.hibernate.test.Baz baz left join fetch baz.sortablez order by baz.name asc" );
+		parse( "from org.hibernate.test.Baz baz order by baz.name asc" );
+		parse( "from org.hibernate.test.Foo foo, org.hibernate.test.Baz baz left join fetch baz.fees" );
+		parse( "from org.hibernate.test.Foo foo, org.hibernate.test.Bar bar" );
+		parse( "from org.hibernate.test.Foo foo" );
+		parse( "from org.hibernate.test.Foo foo, org.hibernate.test.Bar bar, org.hibernate.test.Bar bar2" );
+		parse( "from org.hibernate.test.X x" );
+		parse( "from org.hibernate.test.Foo foo" );
+		parse( "select distinct foo from org.hibernate.test.Foo foo" );
+		parse( "from org.hibernate.test.Glarch g where g.multiple.glarch=g and g.multiple.count=12" );
+		parse( "from org.hibernate.test.Bar bar left join bar.baz baz left join baz.cascadingBars b where bar.name like 'Bar %'" );
+		parse( "select bar, b from org.hibernate.test.Bar bar left join bar.baz baz left join baz.cascadingBars b where bar.name like 'Bar%'" );
+		parse( "select bar, b from org.hibernate.test.Bar bar left join bar.baz baz left join baz.cascadingBars b where ( bar.name in (:nameList0_, :nameList1_, :nameList2_) or bar.name in (:nameList0_, :nameList1_, :nameList2_) ) and bar.string = :stringVal" );
+		parse( "select bar, b from org.hibernate.test.Bar bar inner join bar.baz baz inner join baz.cascadingBars b where bar.name like 'Bar%'" );
+		parse( "select bar, b from org.hibernate.test.Bar bar left join bar.baz baz left join baz.cascadingBars b where bar.name like :name and b.name like :name" );
+		parse( "select bar from org.hibernate.test.Bar as bar where bar.x > ? or bar.short = 1 or bar.string = 'ff ? bb'" );
+		parse( "select bar from org.hibernate.test.Bar as bar where bar.string = ' ? ' or bar.string = '?'" );
+		parse( "from org.hibernate.test.Baz baz, baz.fooArray foo" );
+		parse( "from s in class org.hibernate.test.Stuff where s.foo.id = ? and s.id.id = ? and s.moreStuff.id.intId = ? and s.moreStuff.id.stringId = ?" );
+		parse( "from s in class org.hibernate.test.Stuff where s.foo.id = ? and s.id.id = ? and s.moreStuff.name = ?" );
+		parse( "from s in class org.hibernate.test.Stuff where s.foo.string is not null" );
+		parse( "from s in class org.hibernate.test.Stuff where s.foo > '0' order by s.foo" );
+		parse( "from ms in class org.hibernate.test.MoreStuff" );
+		parse( "from foo in class org.hibernate.test.Foo" );
+		parse( "from fee in class org.hibernate.test.Fee" );
+		parse( "select new Result(foo.string, foo.long, foo.integer) from foo in class org.hibernate.test.Foo" );
+		parse( "select new Result( baz.name, foo.long, count(elements(baz.fooArray)) ) from org.hibernate.test.Baz baz join baz.fooArray foo group by baz.name, foo.long" );
+		parse( "select new Result( baz.name, max(foo.long), count(foo) ) from org.hibernate.test.Baz baz join baz.fooArray foo group by baz.name" );
+		parse( "select max( elements(bar.baz.fooArray) ) from org.hibernate.test.Bar as bar" );
+		parse( "from org.hibernate.test.Baz baz left join baz.fooToGlarch join fetch baz.fooArray foo left join fetch foo.foo" );
+		parse( "select baz.name from org.hibernate.test.Bar bar inner join bar.baz baz inner join baz.fooSet foo where baz.name = bar.string" );
+		parse( "SELECT baz.name FROM org.hibernate.test.Bar AS bar INNER JOIN bar.baz AS baz INNER JOIN baz.fooSet AS foo WHERE baz.name = bar.string" );
+		parse( "select baz.name from org.hibernate.test.Bar bar join bar.baz baz left outer join baz.fooSet foo where baz.name = bar.string" );
+		parse( "select baz.name from org.hibernate.test.Bar bar, bar.baz baz, baz.fooSet foo where baz.name = bar.string" );
+		parse( "SELECT baz.name FROM org.hibernate.test.Bar AS bar, bar.baz AS baz, baz.fooSet AS foo WHERE baz.name = bar.string" );
+		parse( "select baz.name from org.hibernate.test.Bar bar left join bar.baz baz left join baz.fooSet foo where baz.name = bar.string" );
+		parse( "select foo.string from org.hibernate.test.Bar bar left join bar.baz.fooSet foo where bar.string = foo.string" );
+		parse( "select baz.name from org.hibernate.test.Bar bar left join bar.baz baz left join baz.fooArray foo where baz.name = bar.string" );
+		parse( "select foo.string from org.hibernate.test.Bar bar left join bar.baz.fooArray foo where bar.string = foo.string" );
+		parse( "select foo from bar in class org.hibernate.test.Bar inner join bar.baz as baz inner join baz.fooSet as foo" );
+		parse( "select foo from bar in class org.hibernate.test.Bar inner join bar.baz.fooSet as foo" );
+		parse( "select foo from bar in class org.hibernate.test.Bar, bar.baz as baz, baz.fooSet as foo" );
+		parse( "select foo from bar in class org.hibernate.test.Bar, bar.baz.fooSet as foo" );
+		parse( "from org.hibernate.test.Bar bar join bar.baz.fooArray foo" );
+		parse( "from bar in class org.hibernate.test.Bar, foo in elements( bar.baz.fooArray )" );
+		parse( "select one.id, elements(one.manies) from one in class org.hibernate.test.One" );
+		parse( "select max( elements(one.manies) ) from one in class org.hibernate.test.One" );
+		parse( "select one, elements(one.manies) from one in class org.hibernate.test.One" );
+		parse( "select one, max(elements(one.manies)) from one in class org.hibernate.test.One group by one" );
+		parse( "select elements(baz.fooArray) from baz in class org.hibernate.test.Baz where baz.id=?" );
+		parse( "select elements(baz.fooArray) from baz in class org.hibernate.test.Baz where baz.id=?" );
+		parse( "select indices(baz.fooArray) from baz in class org.hibernate.test.Baz where baz.id=?" );
+		parse( "select baz, max(elements(baz.timeArray)) from baz in class org.hibernate.test.Baz group by baz" );
+		parse( "select baz, baz.stringSet.size, count(distinct elements(baz.stringSet)), max(elements(baz.stringSet)) from baz in class org.hibernate.test.Baz group by baz" );
+		parse( "select max( elements(baz.timeArray) ) from baz in class org.hibernate.test.Baz where baz.id=?" );
+		parse( "select max(elements(baz.stringSet)) from baz in class org.hibernate.test.Baz where baz.id=?" );
+		parse( "select size(baz.stringSet) from baz in class org.hibernate.test.Baz where baz.id=?" );
+		parse( "from org.hibernate.test.Foo foo where foo.component.glarch.id is not null" );
+		parse( "from baz in class org.hibernate.test.Baz" );
+		parse( "select elements(baz.stringArray) from baz in class org.hibernate.test.Baz" );
+		parse( "from foo in class org.hibernate.test.Foo" );
+		parse( "select elements(baz.stringList) from baz in class org.hibernate.test.Baz" );
+		parse( "select count(*) from org.hibernate.test.Bar" );
+		parse( "select count(*) from b in class org.hibernate.test.Bar" );
+		parse( "from g in class org.hibernate.test.Glarch" );
+		parse( "select baz, baz from baz in class org.hibernate.test.Baz" );
+		parse( "select baz from baz in class org.hibernate.test.Baz order by baz" );
+		parse( "from bar in class org.hibernate.test.Bar" );
+		parse( "from g in class org.hibernate.test.Glarch" );
+		parse( "from f in class org.hibernate.test.Foo" );
+		parse( "from o in class org.hibernate.test.One" );
+		parse( "from q in class org.hibernate.test.Qux" );
+		parse( "select foo from foo in class org.hibernate.test.Foo where foo.string='foo bar'" );
+		parse( "from foo in class org.hibernate.test.Foo order by foo.string, foo.date" );
+		parse( "from foo in class org.hibernate.test.Foo where foo.class='B'" );
+		parse( "from foo in class org.hibernate.test.Foo where foo.class=Bar" );
+		parse( "select bar from bar in class org.hibernate.test.Bar, foo in class org.hibernate.test.Foo where bar.string = foo.string and not bar=foo" );
+		parse( "from foo in class org.hibernate.test.Foo where foo.string='foo bar'" );
+		parse( "select foo from foo in class org.hibernate.test.Foo" );
+		parse( "from bar in class org.hibernate.test.Bar where bar.barString='bar bar'" );
+		parse( "from t in class org.hibernate.test.Trivial" );
+		parse( "from foo in class org.hibernate.test.Foo where foo.date = ?" );
+		parse( "from o in class org.hibernate.test.MoreStuff" );
+		parse( "from o in class org.hibernate.test.Many" );
+		parse( "from o in class org.hibernate.test.Fee" );
+		parse( "from o in class org.hibernate.test.Qux" );
+		parse( "from o in class org.hibernate.test.Y" );
+		parse( "from o in class org.hibernate.test.Fumm" );
+		parse( "from o in class org.hibernate.test.X" );
+		parse( "from o in class org.hibernate.test.Simple" );
+		parse( "from o in class org.hibernate.test.Location" );
+		parse( "from o in class org.hibernate.test.Holder" );
+		parse( "from o in class org.hibernate.test.Part" );
+		parse( "from o in class org.hibernate.test.Baz" );
+		parse( "from o in class org.hibernate.test.Vetoer" );
+		parse( "from o in class org.hibernate.test.Sortable" );
+		parse( "from o in class org.hibernate.test.Contained" );
+		parse( "from o in class org.hibernate.test.Stuff" );
+		parse( "from o in class org.hibernate.test.Immutable" );
+		parse( "from o in class org.hibernate.test.Container" );
+		parse( "from o in class org.hibernate.test.X$XX" );
+		parse( "from o in class org.hibernate.test.One" );
+		parse( "from o in class org.hibernate.test.Foo" );
+		parse( "from o in class org.hibernate.test.Fo" );
+		parse( "from o in class org.hibernate.test.Glarch" );
+		parse( "from o in class org.hibernate.test.Fum" );
+		parse( "from q in class org.hibernate.test.Qux where q.stuff is null" );
+		parse( "from q in class org.hibernate.test.Qux where q.stuff=?" );
+		parse( "from q in class org.hibernate.test.Qux" );
+		parse( "from g in class org.hibernate.test.Glarch where g.version=2" );
+		parse( "from g in class org.hibernate.test.Glarch where g.next is not null" );
+		parse( "from g in class org.hibernate.test.Glarch order by g.order asc" );
+		parse( "from foo in class org.hibernate.test.Foo order by foo.string asc" );
+		parse( "select parent, child from parent in class org.hibernate.test.Foo, child in class org.hibernate.test.Foo where parent.foo = child" );
+		parse( "select count(distinct child.id), count(distinct parent.id) from parent in class org.hibernate.test.Foo, child in class org.hibernate.test.Foo where parent.foo = child" );
+		parse( "select child.id, parent.id, child.long from parent in class org.hibernate.test.Foo, child in class org.hibernate.test.Foo where parent.foo = child" );
+		parse( "select child.id, parent.id, child.long, child, parent.foo from parent in class org.hibernate.test.Foo, child in class org.hibernate.test.Foo where parent.foo = child" );
+		parse( "select parent, child from parent in class org.hibernate.test.Foo, child in class org.hibernate.test.Foo where parent.foo = child and parent.string='a string'" );
+		parse( "from fee in class org.hibernate.test.Fee" );
+		parse( "from org.hibernate.test.Foo foo where foo.custom.s1 = 'one'" );
+		parse( "from im in class org.hibernate.test.Immutable where im = ?" );
+		parse( "from foo in class org.hibernate.test.Foo" );
+		parse( "from foo in class org.hibernate.test.Foo where foo.char='X'" );
+		parse( "select elements(baz.stringArray) from baz in class org.hibernate.test.Baz" );
+		parse( "select distinct elements(baz.stringArray) from baz in class org.hibernate.test.Baz" );
+		parse( "select elements(baz.fooArray) from baz in class org.hibernate.test.Baz" );
+		parse( "from foo in class org.hibernate.test.Fo" );
+		parse( "from foo in class org.hibernate.test.Foo where foo.dependent.qux.foo.string = 'foo2'" );
+		parse( "from org.hibernate.test.Bar bar where bar.object.id = ? and bar.object.class = ?" );
+		parse( "select one from org.hibernate.test.One one, org.hibernate.test.Bar bar where bar.object.id = one.id and bar.object.class = 'O'" );
+		parse( "from l in class org.hibernate.test.Location where l.countryCode = 'AU' and l.description='foo bar'" );
+		parse( "from org.hibernate.test.Bar bar" );
+		parse( "From org.hibernate.test.Bar bar" );
+		parse( "From org.hibernate.test.Foo foo" );
+		parse( "from o in class org.hibernate.test.Baz" );
+		parse( "from o in class org.hibernate.test.Foo" );
+		parse( "from f in class org.hibernate.test.Foo" );
+		parse( "select fum.id from fum in class org.hibernate.test.Fum where not fum.fum='FRIEND'" );
+		parse( "select fum.id from fum in class org.hibernate.test.Fum where not fum.fum='FRIEND'" );
+		parse( "from fum in class org.hibernate.test.Fum where not fum.fum='FRIEND'" );
+		parse( "from fo in class org.hibernate.test.Fo where fo.id.string like 'an instance of fo'" );
+		parse( "from org.hibernate.test.Inner" );
+		parse( "from org.hibernate.test.Outer o where o.id.detailId = ?" );
+		parse( "from org.hibernate.test.Outer o where o.id.master.id.sup.dudu is not null" );
+		parse( "from org.hibernate.test.Outer o where o.id.master.id.sup.id.akey is not null" );
+		parse( "select o.id.master.id.sup.dudu from org.hibernate.test.Outer o where o.id.master.id.sup.dudu is not null" );
+		parse( "select o.id.master.id.sup.id.akey from org.hibernate.test.Outer o where o.id.master.id.sup.id.akey is not null" );
+		parse( "from org.hibernate.test.Outer o where o.id.master.bla = ''" );
+		parse( "from org.hibernate.test.Outer o where o.id.master.id.one = ''" );
+		parse( "from org.hibernate.test.Inner inn where inn.id.bkey is not null and inn.backOut.id.master.id.sup.id.akey > 'a'" );
+		parse( "from org.hibernate.test.Outer as o left join o.id.master m left join m.id.sup where o.bubu is not null" );
+		parse( "from org.hibernate.test.Outer as o left join o.id.master.id.sup s where o.bubu is not null" );
+		parse( "from org.hibernate.test.Outer as o left join o.id.master m left join o.id.master.id.sup s where o.bubu is not null" );
+		parse( "select fum1.fo from fum1 in class org.hibernate.test.Fum where fum1.fo.fum is not null" );
+		parse( "from fum1 in class org.hibernate.test.Fum where fum1.fo.fum is not null order by fum1.fo.fum" );
+		parse( "select elements(fum1.friends) from fum1 in class org.hibernate.test.Fum" );
+		parse( "from fum1 in class org.hibernate.test.Fum, fr in elements( fum1.friends )" );
+		parse( "select new Jay(eye) from org.hibernate.test.Eye eye" );
+		parse( "from org.hibernate.test.Category cat where cat.name='new foo'" );
+		parse( "from org.hibernate.test.Category cat where cat.name='new sub'" );
+		parse( "from org.hibernate.test.Up up order by up.id2 asc" );
+		parse( "from org.hibernate.test.Down down" );
+		parse( "from org.hibernate.test.Up up" );
+		parse( "from m in class org.hibernate.test.Master" );
+		parse( "from s in class org.hibernate.test.Several" );
+		parse( "from s in class org.hibernate.test.Single" );
+		parse( "\n" +
+				"		from d in class \n" +
+				"			org.hibernate.test.Detail\n" +
+				"	" );
+		parse( "from c in class org.hibernate.test.Category where c.name = org.hibernate.test.Category.ROOT_CATEGORY" );
+		parse( "select c from c in class org.hibernate.test.Container, s in class org.hibernate.test.Simple where c.oneToMany[2] = s" );
+		parse( "select c from c in class org.hibernate.test.Container, s in class org.hibernate.test.Simple where c.manyToMany[2] = s" );
+		parse( "select c from c in class org.hibernate.test.Container, s in class org.hibernate.test.Simple where s = c.oneToMany[2]" );
+		parse( "select c from c in class org.hibernate.test.Container, s in class org.hibernate.test.Simple where s = c.manyToMany[2]" );
+		parse( "select c from c in class org.hibernate.test.Container where c.oneToMany[0].name = 's'" );
+		parse( "select c from c in class org.hibernate.test.Container where c.manyToMany[0].name = 's'" );
+		parse( "select c from c in class org.hibernate.test.Container where 's' = c.oneToMany[2 - 2].name" );
+		parse( "select c from c in class org.hibernate.test.Container where 's' = c.manyToMany[(3+1)/4-1].name" );
+		parse( "select c from c in class org.hibernate.test.Container where c.manyToMany[ maxindex(c.manyToMany) ].count = 2" );
+		parse( "select c from c in class org.hibernate.test.Container where c.oneToMany[ c.manyToMany[0].count ].name = 's'" );
+		parse( "select c from org.hibernate.test.Container c where c.manyToMany[ c.oneToMany[0].count ].name = 's'" );
+		parse( "select count(comp.name) from org.hibernate.test.Container c join c.components comp" );
+		parse( "from org.hibernate.test.Parent p left join fetch p.child" );
+		parse( "from org.hibernate.test.Parent p join p.child c where c.x > 0" );
+		parse( "from org.hibernate.test.Child c join c.parent p where p.x > 0" );
+		parse( "from org.hibernate.test.Child" );
+		parse( "from org.hibernate.test.MoreStuff" );
+		parse( "from org.hibernate.test.Many" );
+		parse( "from org.hibernate.test.Fee" );
+		parse( "from org.hibernate.test.Qux" );
+		parse( "from org.hibernate.test.Fumm" );
+		parse( "from org.hibernate.test.Parent" );
+		parse( "from org.hibernate.test.Simple" );
+		parse( "from org.hibernate.test.Holder" );
+		parse( "from org.hibernate.test.Part" );
+		parse( "from org.hibernate.test.Baz" );
+		parse( "from org.hibernate.test.Vetoer" );
+		parse( "from org.hibernate.test.Sortable" );
+		parse( "from org.hibernate.test.Contained" );
+		parse( "from org.hibernate.test.Circular" );
+		parse( "from org.hibernate.test.Stuff" );
+		parse( "from org.hibernate.test.Immutable" );
+		parse( "from org.hibernate.test.Container" );
+		parse( "from org.hibernate.test.One" );
+		parse( "from org.hibernate.test.Foo" );
+		parse( "from org.hibernate.test.Fo" );
+		parse( "from org.hibernate.test.Glarch" );
+		parse( "from org.hibernate.test.Fum" );
+		parse( "from org.hibernate.test.Glarch g" );
+		parse( "from org.hibernate.test.Part" );
+		parse( "from org.hibernate.test.Baz baz join baz.parts" );
+		parse( "from c in class org.hibernate.test.Child where c.parent.count=66" );
+		parse( "from org.hibernate.test.Parent p join p.child c where p.count=66" );
+		parse( "select c, c.parent from c in class org.hibernate.test.Child order by c.parent.count" );
+		parse( "select c, c.parent from c in class org.hibernate.test.Child where c.parent.count=66 order by c.parent.count" );
+		parse( "select c, c.parent, c.parent.count from c in class org.hibernate.test.Child order by c.parent.count" );
+		parse( "FROM p IN CLASS org.hibernate.test.Parent WHERE p.count = ?" );
+		parse( "select count(*) from org.hibernate.test.Container as c join c.components as ce join ce.simple as s where ce.name='foo'" );
+		parse( "select c, s from org.hibernate.test.Container as c join c.components as ce join ce.simple as s where ce.name='foo'" );
+		parse( "from s in class org.hibernate.test.Simple" );
+		parse( "from m in class org.hibernate.test.Many" );
+		parse( "from o in class org.hibernate.test.One" );
+		parse( "from c in class org.hibernate.test.Container" );
+		parse( "from o in class org.hibernate.test.Child" );
+		parse( "from o in class org.hibernate.test.MoreStuff" );
+		parse( "from o in class org.hibernate.test.Many" );
+		parse( "from o in class org.hibernate.test.Fee" );
+		parse( "from o in class org.hibernate.test.Qux" );
+		parse( "from o in class org.hibernate.test.Fumm" );
+		parse( "from o in class org.hibernate.test.Parent" );
+		parse( "from o in class org.hibernate.test.Simple" );
+		parse( "from o in class org.hibernate.test.Holder" );
+		parse( "from o in class org.hibernate.test.Part" );
+		parse( "from o in class org.hibernate.test.Baz" );
+		parse( "from o in class org.hibernate.test.Vetoer" );
+		parse( "from o in class org.hibernate.test.Sortable" );
+		parse( "from o in class org.hibernate.test.Contained" );
+		parse( "from o in class org.hibernate.test.Circular" );
+		parse( "from o in class org.hibernate.test.Stuff" );
+		parse( "from o in class org.hibernate.test.Immutable" );
+		parse( "from o in class org.hibernate.test.Container" );
+		parse( "from o in class org.hibernate.test.One" );
+		parse( "from o in class org.hibernate.test.Foo" );
+		parse( "from o in class org.hibernate.test.Fo" );
+		parse( "from o in class org.hibernate.test.Glarch" );
+		parse( "from o in class org.hibernate.test.Fum" );
+		parse( "from c in class org.hibernate.test.C2 where 1=1 or 1=1" );
+		parse( "from b in class org.hibernate.test.B" );
+		parse( "from a in class org.hibernate.test.A" );
+		parse( "from b in class org.hibernate.test.B" );
+		parse( "from org.hibernate.test.E e join e.reverse as b where b.count=1" );
+		parse( "from org.hibernate.test.E e join e.as as b where b.count=1" );
+		parse( "from org.hibernate.test.B" );
+		parse( "from org.hibernate.test.C1" );
+		parse( "from org.hibernate.test.C2" );
+		parse( "from org.hibernate.test.E e, org.hibernate.test.A a where e.reverse = a.forward and a = ?" );
+		parse( "from org.hibernate.test.E e join fetch e.reverse" );
+		parse( "from org.hibernate.test.E e" );
+		parse( "select max(s.count) from s in class org.hibernate.test.Simple" );
+		parse( "select new org.hibernate.test.S(s.count, s.address) from s in class org.hibernate.test.Simple" );
+		parse( "select max(s.count) from s in class org.hibernate.test.Simple" );
+		parse( "select count(*) from s in class org.hibernate.test.Simple" );
+		parse( "from s in class org.hibernate.test.Simple where s.name=:name and s.count=:count" );
+		parse( "from s in class org.hibernate.test.Simple where s.name in (:several0_, :several1_)" );
+		parse( "from s in class org.hibernate.test.Simple where s.name in (:stuff0_, :stuff1_)" );
+		parse( "from org.hibernate.test.Simple s where s.name=?" );
+		parse( "from org.hibernate.test.Simple s where s.name=:name" );
+		parse( "from s in class org.hibernate.test.Simple where upper( s.name ) ='SIMPLE 1'" );
+		parse( "from s in class org.hibernate.test.Simple where not( upper( s.name ) ='yada' or 1=2 or 'foo'='bar' or not('foo'='foo') or 'foo' like 'bar' )" );
+		parse( "from s in class org.hibernate.test.Simple where lower( s.name || ' foo' ) ='simple 1 foo'" );
+		parse( "from s in class org.hibernate.test.Simple where upper( s.other.name ) ='SIMPLE 2'" );
+		parse( "from s in class org.hibernate.test.Simple where not ( upper( s.other.name ) ='SIMPLE 2' )" );
+		parse( "select distinct s from s in class org.hibernate.test.Simple where ( ( s.other.count + 3 ) = (15*2)/2 and s.count = 69) or ( ( s.other.count + 2 ) / 7 ) = 2" );
+		parse( "select s from s in class org.hibernate.test.Simple where ( ( s.other.count + 3 ) = (15*2)/2 and s.count = 69) or ( ( s.other.count + 2 ) / 7 ) = 2 order by s.other.count" );
+		parse( "select sum(s.count) from s in class org.hibernate.test.Simple group by s.count having sum(s.count) > 10" );
+		parse( "select s.count from s in class org.hibernate.test.Simple group by s.count having s.count = 12" );
+		parse( "select s.id, s.count, count(t), max(t.date) from s in class org.hibernate.test.Simple, t in class org.hibernate.test.Simple where s.count = t.count group by s.id, s.count order by s.count" );
+		parse( "from s in class org.hibernate.test.Simple" );
+		parse( "from s in class org.hibernate.test.Simple where s.name = ?" );
+		parse( "from s in class org.hibernate.test.Simple where s.name = ? and upper(s.name) = ?" );
+		parse( "from s in class org.hibernate.test.Simple where s.name = :foo and upper(s.name) = :bar or s.count=:count or s.count=:count + 1" );
+		parse( "select s.id from s in class org.hibernate.test.Simple" );
+		parse( "select all s, s.other from s in class org.hibernate.test.Simple where s = :s" );
+		parse( "from s in class org.hibernate.test.Simple where s.name in (:name_list0_, :name_list1_) and s.count > :count" );
+		parse( "from org.hibernate.test.Simple s" );
+		parse( "from org.hibernate.test.Simple s" );
+		parse( "from org.hibernate.test.Assignable" );
+		parse( "from org.hibernate.test.Category" );
+		parse( "from org.hibernate.test.Simple" );
+		parse( "from org.hibernate.test.A" );
+		parse( "from foo in class org.hibernate.test.Foo where foo.string=?" );
+		parse( "from foo in class org.hibernate.test.Foo" );
+		parse( "from org.hibernate.test.Po po, org.hibernate.test.Lower low where low.mypo = po" );
+		parse( "from org.hibernate.test.Po po join po.set as sm where sm.amount > 0" );
+		parse( "from org.hibernate.test.Po po join po.top as low where low.foo = 'po'" );
+		parse( "from org.hibernate.test.SubMulti sm join sm.children smc where smc.name > 'a'" );
+		parse( "select s, ya from org.hibernate.test.Lower s join s.yetanother ya" );
+		parse( "from org.hibernate.test.Lower s1 join s1.bag s2" );
+		parse( "from org.hibernate.test.Lower s1 left join s1.bag s2" );
+		parse( "select s, a from org.hibernate.test.Lower s join s.another a" );
+		parse( "select s, a from org.hibernate.test.Lower s left join s.another a" );
+		parse( "from org.hibernate.test.Top s, org.hibernate.test.Lower ls" );
+		parse( "from org.hibernate.test.Lower ls join ls.set s where s.name > 'a'" );
+		parse( "from org.hibernate.test.Po po join po.list sm where sm.name > 'a'" );
+		parse( "from org.hibernate.test.Lower ls inner join ls.another s where s.name is not null" );
+		parse( "from org.hibernate.test.Lower ls where ls.other.another.name is not null" );
+		parse( "from org.hibernate.test.Multi m where m.derived like 'F%'" );
+		parse( "from org.hibernate.test.SubMulti m where m.derived like 'F%'" );
+		parse( "select s from org.hibernate.test.SubMulti as sm join sm.children as s where s.amount>-1 and s.name is null" );
+		parse( "select elements(sm.children) from org.hibernate.test.SubMulti as sm" );
+		parse( "select distinct sm from org.hibernate.test.SubMulti as sm join sm.children as s where s.amount>-1 and s.name is null" );
+		parse( "select distinct s from s in class org.hibernate.test.SubMulti where s.moreChildren[1].amount < 1.0" );
+		parse( "from s in class org.hibernate.test.TrivialClass where s.id = 2" );
+		parse( "select s.count from s in class org.hibernate.test.Top" );
+		parse( "from s in class org.hibernate.test.Lower where s.another.name='name'" );
+		parse( "from s in class org.hibernate.test.Lower where s.yetanother.name='name'" );
+		parse( "from s in class org.hibernate.test.Lower where s.yetanother.name='name' and s.yetanother.foo is null" );
+		parse( "from s in class org.hibernate.test.Top where s.count=1" );
+		parse( "select s.count from s in class org.hibernate.test.Top, ls in class org.hibernate.test.Lower where ls.another=s" );
+		parse( "select elements(ls.bag), elements(ls.set) from ls in class org.hibernate.test.Lower" );
+		parse( "from s in class org.hibernate.test.Lower" );
+		parse( "from s in class org.hibernate.test.Top" );
+		parse( "from sm in class org.hibernate.test.SubMulti" );
+		parse( "select\n" +
+				"\n" +
+				"s from s in class org.hibernate.test.Top where s.count>0" );
+		parse( "from m in class org.hibernate.test.Multi where m.count>0 and m.extraProp is not null" );
+		parse( "from m in class org.hibernate.test.Top where m.count>0 and m.name is not null" );
+		parse( "from m in class org.hibernate.test.Lower where m.other is not null" );
+		parse( "from m in class org.hibernate.test.Multi where m.other.id = 1" );
+		parse( "from m in class org.hibernate.test.SubMulti where m.amount > 0.0" );
+		parse( "from m in class org.hibernate.test.Multi" );
+		parse( "from m in class org.hibernate.test.Multi where m.class = SubMulti" );
+		parse( "from m in class org.hibernate.test.Top where m.class = Multi" );
+		parse( "from s in class org.hibernate.test.Top" );
+		parse( "from ls in class org.hibernate.test.Lower" );
+		parse( "from ls in class org.hibernate.test.Lower, s in elements(ls.bag) where s.id is not null" );
+		parse( "from ls in class org.hibernate.test.Lower, s in elements(ls.set) where s.id is not null" );
+		parse( "from o in class org.hibernate.test.Top" );
+		parse( "from o in class org.hibernate.test.Po" );
+		parse( "from ChildMap cm where cm.parent is not null" );
+		parse( "from ParentMap cm where cm.child is not null" );
+		parse( "from org.hibernate.test.Componentizable" );
+	}
+
+	public void testUnnamedParameter() throws Exception {
+		parse( "select foo, bar from org.hibernate.test.Foo foo left outer join foo.foo bar where foo = ?" ); // Added '?' as a valid expression.
+	}
+
+	public void testInElements() throws Exception {
+		parse( "from bar in class org.hibernate.test.Bar, foo in elements(bar.baz.fooArray)" );   // Added collectionExpr as a valid 'in' clause.
+	}
+
+	public void testDotElements() throws Exception {
+		parse( "select distinct foo from baz in class org.hibernate.test.Baz, foo in elements(baz.fooArray)" );
+		parse( "select foo from baz in class org.hibernate.test.Baz, foo in elements(baz.fooSet)" );
+		parse( "select foo from baz in class org.hibernate.test.Baz, foo in elements(baz.fooArray)" );
+		parse( "from org.hibernate.test.Baz baz where 'b' in elements(baz.collectionComponent.nested.foos) and 1.0 in elements(baz.collectionComponent.nested.floats)" );
+	}
+
+	public void testSelectAll() throws Exception {
+		parse( "select all s, s.other from s in class org.hibernate.test.Simple where s = :s" );
+	}
+
+	public void testNot() throws Exception {
+		// Cover NOT optimization in HqlParser
+		parse( "from eg.Cat cat where not ( cat.kittens.size < 1 )" );
+		parse( "from eg.Cat cat where not ( cat.kittens.size > 1 )" );
+		parse( "from eg.Cat cat where not ( cat.kittens.size >= 1 )" );
+		parse( "from eg.Cat cat where not ( cat.kittens.size <= 1 )" );
+		parse( "from eg.DomesticCat cat where not ( cat.name between 'A' and 'B' ) " );
+		parse( "from eg.DomesticCat cat where not ( cat.name not between 'A' and 'B' ) " );
+		parse( "from eg.Cat cat where not ( not cat.kittens.size <= 1 )" );
+		parse( "from eg.Cat cat where not  not ( not cat.kittens.size <= 1 )" );
+	}
+
+	public void testOtherSyntax() throws Exception {
+		parse( "select bar from org.hibernate.test.Bar bar order by ((bar.x - :valueX)*(bar.x - :valueX))" );
+		parse( "from bar in class org.hibernate.test.Bar, foo in elements(bar.baz.fooSet)" );
+		parse( "from one in class org.hibernate.test.One, many in elements(one.manies) where one.id = 1 and many.id = 1" );
+		parse( "from org.hibernate.test.Inner _inner join _inner.middles middle" );
+		parse( "FROM m IN CLASS org.hibernate.test.Master WHERE NOT EXISTS ( FROM d IN elements(m.details) WHERE NOT d.i=5 )" );
+		parse( "FROM m IN CLASS org.hibernate.test.Master WHERE NOT 5 IN ( SELECT d.i FROM d IN elements(m.details) )" );
+		parse( "SELECT m FROM m IN CLASS org.hibernate.test.Master, d IN elements(m.details) WHERE d.i=5" );
+		parse( "SELECT m FROM m IN CLASS org.hibernate.test.Master, d IN elements(m.details) WHERE d.i=5" );
+		parse( "SELECT m.id FROM m IN CLASS org.hibernate.test.Master, d IN elements(m.details) WHERE d.i=5" );
+		// I'm not sure about these... [jsd]
+//        parse("select bar.string, foo.string from bar in class org.hibernate.test.Bar inner join bar.baz as baz inner join elements(baz.fooSet) as foo where baz.name = 'name'");
+//        parse("select bar.string, foo.string from bar in class org.hibernate.test.Bar, bar.baz as baz, elements(baz.fooSet) as foo where baz.name = 'name'");
+//        parse("select count(*) where this.amount>-1 and this.name is null");
+//        parse("from sm in class org.hibernate.test.SubMulti where exists sm.children.elements");
+	}
+
+	public void testEjbqlExtensions() throws Exception {
+		parse( "select object(a) from Animal a where a.mother member of a.offspring" );
+		parse( "select object(a) from Animal a where a.mother member a.offspring" ); //no member of
+		parse( "select object(a) from Animal a where a.offspring is empty" );
+	}
+
+	public void testEmptyFilter() throws Exception {
+		parseFilter( "" );  //  Blank is a legitimate filter.
+	}
+
+	public void testOrderByFilter() throws Exception {
+		parseFilter( "order by this.id" );
+	}
+
+	public void testRestrictionFilter() throws Exception {
+		parseFilter( "where this.name = ?" );
+	}
+
+	public void testNoFrom() throws Exception {
+		System.out.println( "***** This test ensures that an error is detected ERROR MESSAGES ARE OKAY!  *****" );
+		HqlParser parser = HqlParser.getInstance( "" );
+		parser.setFilter( false );
+		parser.statement();
+		assertEquals( "Parser allowed no FROM clause!", 1, parser.getParseErrorHandler().getErrorCount() );
+		System.out.println( "***** END OF ERROR TEST  *****" );
+	}
+
+	public void testHB1042() throws Exception {
+		parse( "select x from fmc_web.pool.Pool x left join x.containers c0 where (upper(x.name) = upper(':') and c0.id = 1)" );
+	}
+
+	public void testKeywordInPath() throws Exception {
+		// The keyword 'order' used as a property name.
+		parse( "from Customer c where c.order.status = 'argh'" );
+		// The keyword 'order' and 'count' used as a property name.
+		parse( "from Customer c where c.order.count > 3" );
+		// The keywords 'where', 'order' and 'count' used as a property name.
+		parse( "select c.where from Customer c where c.order.count > 3" );
+		parse( "from Interval i where i.end <:end" );
+		parse( "from Letter l where l.case = :case" );
+	}
+
+	public void testPathologicalKeywordAsIdentifier() throws Exception {
+		// Super evil badness... a legitimate keyword!
+		parse( "from Order order" );
+		//parse( "from Order order join order.group" );
+		parse( "from X x order by x.group.by.from" );
+		parse( "from Order x order by x.order.group.by.from" );
+		parse( "select order.id from Order order" );
+		parse( "select order from Order order" );
+		parse( "from Order order where order.group.by.from is not null" );
+		parse( "from Order order order by order.group.by.from" );
+		// Okay, now this is getting silly.
+		parse( "from Group as group group by group.by.from" );
+	}
+
+    public void testHHH354() throws Exception {
+        parse( "from Foo f where f.full = 'yep'");
+    }
+
+    public void testWhereAsIdentifier() throws Exception {
+        // 'where' as a package name
+        parse( "from where.Order" );
+    }
+
+	public void testEjbqlKeywordsAsIdentifier() throws Exception {
+		parse( "from org.hibernate.test.Bar bar where bar.object.id = ? and bar.object.class = ?" );
+	}
+
+	public void testConstructorIn() throws Exception {
+		parse( "from org.hibernate.test.Bar bar where (b.x, b.y, b.z) in (select foo, bar, baz from org.hibernate.test.Foo)" );
+	}
+
+    public void testMultiByteCharacters() throws Exception {
+        parse ("from User user where user.name like '%nn\u4e2dnn%'");
+        // Test for HHH-558
+        parse ("from User user where user.\u432d like '%\u4e2d%'");
+        parse ("from \u432d \u432d where \u432d.name like '%fred%'");        
+    }
+
+    public void testHHH719() throws Exception {
+        // Some SQLs have function names with package qualifiers.
+        parse("from Foo f order by com.fooco.SpecialFunction(f.id)");
+    }
+
+	public void testHHH1107() throws Exception {
+		parse("from Animal where zoo.address.street = '123 Bogus St.'");
+	}
+
+
+	public void testHHH1247() throws Exception {
+		parse("select distinct user.party from com.itf.iceclaims.domain.party.user.UserImpl user inner join user.party.$RelatedWorkgroups relatedWorkgroups where relatedWorkgroups.workgroup.id = :workgroup and relatedWorkgroups.effectiveTime.start <= :datesnow and relatedWorkgroups.effectiveTime.end > :dateenow ");
+	}
+	public void testLineAndColumnNumber() throws Exception {
+		AST ast = doParse("from Foo f\nwhere f.name = 'fred'",false);
+		// Find some of the nodes and check line and column values.
+		ASTIterator iter = new ASTIterator(ast);
+		boolean foundFoo = false;
+		boolean foundName = false;
+		while (iter.hasNext())
+		{
+			AST n = iter.nextNode();
+			if ("Foo".equals(n.getText()))
+			{
+				if (foundFoo)
+					fail("Already found 'Foo'!");
+				foundFoo = true;
+				Node node = (Node)n;
+				assertEquals(1,node.getLine());
+				assertEquals(6,node.getColumn());
+			}
+			else if ("name".equals(n.getText()))
+			{
+				if (foundName)
+					fail("Already found 'name'!");
+				foundName = true;
+				Node node = (Node)n;
+				assertEquals(2,node.getLine());
+				assertEquals(9,node.getColumn());
+			}
+		}
+		assertTrue(foundFoo);
+		assertTrue(foundName);
+	}
+
+	private void parseFilter(String input) throws TokenStreamException, RecognitionException {
+		doParse( input, true );
+	}
+
+	private void parse(String input) throws RecognitionException, TokenStreamException {
+		doParse( input, false );
+	}
+
+	private AST doParse(String input, boolean filter) throws RecognitionException, TokenStreamException {
+		System.out.println( "input: ->" + ASTPrinter.escapeMultibyteChars(input) + "<-" );
+		HqlParser parser = HqlParser.getInstance( input );
+		parser.setFilter( filter );
+		parser.statement();
+		AST ast = parser.getAST();
+		System.out.println( "AST  :  " + ast.toStringTree() + "" );
+		ByteArrayOutputStream baos = new ByteArrayOutputStream();
+		parser.showAst( ast, new PrintStream( baos ) );
+		System.out.println( baos.toString() );
+		assertEquals( "At least one error occurred during parsing!", 0, parser.getParseErrorHandler().getErrorCount() );
+		return ast;
+	}
+
+	public static Test suite() {
+		return new TestSuite( HqlParserTest.class );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/HqlParserTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Human.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Human.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Human.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,127 @@
+//$Id: Human.java 9873 2006-05-04 13:42:48Z max.andersen at jboss.com $
+package org.hibernate.test.hql;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.Collection;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author Gavin King
+ */
+public class Human extends Mammal {
+	private Name name;
+	private String nickName;
+	private Collection friends;
+	private Collection pets;
+	private Map family;
+	private double heightInches;
+	
+	private BigInteger bigIntegerValue;
+	private BigDecimal bigDecimalValue;
+	private int intValue;
+	private float floatValue;
+	
+	private Set nickNames;
+	private Map addresses;
+
+	public Collection getFriends() {
+		return friends;
+	}
+
+	public void setFriends(Collection friends) {
+		this.friends = friends;
+	}
+
+	public Collection getPets() {
+		return pets;
+	}
+
+	public void setPets(Collection pets) {
+		this.pets = pets;
+	}
+
+	public Name getName() {
+		return name;
+	}
+
+	public void setName(Name name) {
+		this.name = name;
+	}
+
+	public String getNickName() {
+		return nickName;
+	}
+
+	public void setNickName(String nickName) {
+		this.nickName = nickName;
+	}
+	
+	public double getHeightInches() {
+		return heightInches;
+	}
+	
+	public void setHeightInches(double height) {
+		this.heightInches = height;
+	}
+
+	public Map getFamily() {
+		return family;
+	}
+	
+
+	public void setFamily(Map family) {
+		this.family = family;
+	}
+
+	public Set getNickNames() {
+		return nickNames;
+	}
+
+	public void setNickNames(Set nickNames) {
+		this.nickNames = nickNames;
+	}
+
+	public Map getAddresses() {
+		return addresses;
+	}
+
+	public void setAddresses(Map addresses) {
+		this.addresses = addresses;
+	}
+
+	public BigDecimal getBigDecimalValue() {
+		return bigDecimalValue;
+	}
+
+	public void setBigDecimalValue(BigDecimal bigDecimalValue) {
+		this.bigDecimalValue = bigDecimalValue;
+	}
+
+	public BigInteger getBigIntegerValue() {
+		return bigIntegerValue;
+	}
+
+	public void setBigIntegerValue(BigInteger bigIntegerValue) {
+		this.bigIntegerValue = bigIntegerValue;
+	}
+
+	public float getFloatValue() {
+		return floatValue;
+	}
+
+	public void setFloatValue(float floatValue) {
+		this.floatValue = floatValue;
+	}
+
+	public int getIntValue() {
+		return intValue;
+	}
+
+	public void setIntValue(int intValue) {
+		this.intValue = intValue;
+	}
+	
+	
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Human.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Image.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Image.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Image.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<hibernate-mapping package="org.hibernate.test.hql">
+
+    <class name="Image" table="image" select-before-update="true" >
+        <id name="id" type="java.lang.Long" column="id">
+            <generator class="native"/>
+        </id>
+        <property name="name" type="java.lang.String" column="name"/>
+    	<property name="sizeKb" lazy="true">
+    		<column name="size_mb"
+    			read="size_mb * 1024.0"
+    			write="? / 1024.0"/>
+    	</property>
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Image.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Image.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Image.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Image.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,49 @@
+package org.hibernate.test.hql;
+
+/**
+ * @author Rob.Hasselbaum
+ */
+public class Image {
+	
+	private Long id;
+	private String name;
+	private double sizeKb;
+	
+	/**
+	 * @return the id
+	 */
+	public Long getId() {
+		return id;
+	}
+	/**
+	 * @param id the id to set
+	 */
+	public void setId(Long id) {
+		this.id = id;
+	}
+	/**
+	 * @return the name
+	 */
+	public String getName() {
+		return name;
+	}
+	/**
+	 * @param name the name to set
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+	/**
+	 * @return the size in kb
+	 */
+	public double getSizeKb() {
+		return sizeKb;
+	}
+	/**
+	 * @param sizeKb the size in kb to set
+	 */
+	public void setSizeKb(double sizeKb) {
+		this.sizeKb = sizeKb;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Image.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/IntegerVersioned.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/IntegerVersioned.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/IntegerVersioned.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,36 @@
+// $Id: IntegerVersioned.java 7384 2005-07-06 17:04:45Z steveebersole $
+package org.hibernate.test.hql;
+
+/**
+ * Implementation of IntegerVersioned.
+ *
+ * @author Steve Ebersole
+ */
+public class IntegerVersioned {
+	private Long id;
+	private int version = -1;
+	private String name;
+
+	public IntegerVersioned() {
+	}
+
+	public IntegerVersioned(String name) {
+		this.name = name;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public int getVersion() {
+		return version;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/IntegerVersioned.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Joiner.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Joiner.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Joiner.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,37 @@
+// $Id: Joiner.java 6021 2005-03-06 02:02:30Z steveebersole $
+package org.hibernate.test.hql;
+
+/**
+ * Implementation of Joiner.
+ *
+ * @author Steve Ebersole
+ */
+public class Joiner {
+	private Long id;
+	private String name;
+	private String joinedName;
+
+	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 String getJoinedName() {
+		return joinedName;
+	}
+
+	public void setJoinedName(String joinedName) {
+		this.joinedName = joinedName;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Joiner.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/KeyManyToOneEntity.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/KeyManyToOneEntity.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/KeyManyToOneEntity.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.hql">
+
+	<class name="KeyManyToOneKeyEntity">
+		<id name="id" type="long" access="field" >
+			<generator class="native"/>
+        </id>
+		<property name="name" type="string"/>
+	</class>
+
+	<class name="KeyManyToOneEntity">
+		<composite-id name="id" access="field" class="KeyManyToOneEntity$Id" unsaved-value="undefined" >
+			<key-many-to-one name="key1" class="KeyManyToOneKeyEntity" />
+			<key-property name="key2" type="string"/>
+		</composite-id>
+		<property name="name" type="string"/> 
+	</class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/KeyManyToOneEntity.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/KeyManyToOneEntity.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/KeyManyToOneEntity.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/KeyManyToOneEntity.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,52 @@
+// $Id: KeyManyToOneEntity.java 7091 2005-06-08 19:31:26Z steveebersole $
+package org.hibernate.test.hql;
+
+import java.io.Serializable;
+
+/**
+ * Implementation of KeyManyToOneEntity.
+ *
+ * @author Steve Ebersole
+ */
+public class KeyManyToOneEntity {
+	private Id id;
+	private String name;
+
+	public KeyManyToOneEntity(String name) {
+		this.name = name;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public static class Id implements Serializable {
+		private KeyManyToOneKeyEntity key1;
+		private String key2;
+
+		public Id(KeyManyToOneKeyEntity key1, String key2) {
+			this.key1 = key1;
+			this.key2 = key2;
+		}
+
+		public KeyManyToOneKeyEntity getKey1() {
+			return key1;
+		}
+
+		public void setKey1(KeyManyToOneKeyEntity key1) {
+			this.key1 = key1;
+		}
+
+		public String getKey2() {
+			return key2;
+		}
+
+		public void setKey2(String key2) {
+			this.key2 = key2;
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/KeyManyToOneEntity.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/KeyManyToOneKeyEntity.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/KeyManyToOneKeyEntity.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/KeyManyToOneKeyEntity.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,24 @@
+// $Id: KeyManyToOneKeyEntity.java 7091 2005-06-08 19:31:26Z steveebersole $
+package org.hibernate.test.hql;
+
+/**
+ * Implementation of KeyManyToOneKeyEntity.
+ *
+ * @author Steve Ebersole
+ */
+public class KeyManyToOneKeyEntity {
+	private Long id;
+	private String name;
+
+	public KeyManyToOneKeyEntity(String name) {
+		this.name = name;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/KeyManyToOneKeyEntity.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Lizard.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Lizard.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Lizard.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,9 @@
+//$Id: Lizard.java 3890 2004-06-03 16:31:32Z steveebersole $
+package org.hibernate.test.hql;
+
+/**
+ * @author Gavin King
+ */
+public class Lizard extends Reptile {
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Lizard.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Mammal.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Mammal.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Mammal.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,30 @@
+//$Id: Mammal.java 6005 2005-03-04 11:41:11Z oneovthafew $
+package org.hibernate.test.hql;
+
+import java.util.Date;
+
+/**
+ * @author Gavin King
+ */
+public class Mammal extends Animal {
+	private boolean pregnant;
+	private Date birthdate;
+
+	public boolean isPregnant() {
+		return pregnant;
+	}
+
+	public void setPregnant(boolean pregnant) {
+		this.pregnant = pregnant;
+	}
+
+	public Date getBirthdate() {
+		return birthdate;
+	}
+	
+
+	public void setBirthdate(Date birthdate) {
+		this.birthdate = birthdate;
+	}
+	
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Mammal.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/MoreCrazyIdFieldNameStuffEntity.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/MoreCrazyIdFieldNameStuffEntity.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/MoreCrazyIdFieldNameStuffEntity.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,44 @@
+// $Id: MoreCrazyIdFieldNameStuffEntity.java 7471 2005-07-14 14:58:28Z steveebersole $
+package org.hibernate.test.hql;
+
+/**
+ * Implementation of MoreCrazyIdFieldNameStuffEntity.
+ *
+ * @author Steve Ebersole
+ */
+public class MoreCrazyIdFieldNameStuffEntity {
+	private Long moreCrazyIdFieldNameStuffEntity;
+	private HeresAnotherCrazyIdFieldName heresAnotherCrazyIdFieldName; // silly ain't it ;)
+	private String name;
+
+	public MoreCrazyIdFieldNameStuffEntity() {
+	}
+
+	public MoreCrazyIdFieldNameStuffEntity(String name) {
+		this.name = name;
+	}
+
+	public Long getMoreCrazyIdFieldNameStuffEntity() {
+		return moreCrazyIdFieldNameStuffEntity;
+	}
+
+	public void setMoreCrazyIdFieldNameStuffEntity(Long moreCrazyIdFieldNameStuffEntity) {
+		this.moreCrazyIdFieldNameStuffEntity = moreCrazyIdFieldNameStuffEntity;
+	}
+
+	public HeresAnotherCrazyIdFieldName getHeresAnotherCrazyIdFieldName() {
+		return heresAnotherCrazyIdFieldName;
+	}
+
+	public void setHeresAnotherCrazyIdFieldName(HeresAnotherCrazyIdFieldName heresAnotherCrazyIdFieldName) {
+		this.heresAnotherCrazyIdFieldName = heresAnotherCrazyIdFieldName;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/MoreCrazyIdFieldNameStuffEntity.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Name.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Name.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Name.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,47 @@
+//$Id: Name.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.hql;
+
+/**
+ * @author Gavin King
+ */
+public class Name {
+	private String first;
+	private Character initial;
+	private String last;
+	
+	protected Name() {}
+	
+	public Name(String first, Character initial, String last) {
+		this.first = first;
+		this.initial = initial;
+		this.last = last;
+	}
+
+	public Name(String first, char initial, String last) {
+		this( first, new Character( initial ), last );
+	}
+
+	public String getFirst() {
+		return first;
+	}
+
+	public void setFirst(String first) {
+		this.first = first;
+	}
+
+	public Character getInitial() {
+		return initial;
+	}
+
+	public void setInitial(Character initial) {
+		this.initial = initial;
+	}
+
+	public String getLast() {
+		return last;
+	}
+
+	public void setLast(String last) {
+		this.last = last;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Name.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/PettingZoo.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/PettingZoo.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/PettingZoo.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,9 @@
+//$Id: PettingZoo.java 4857 2004-12-02 16:28:57Z oneovthafew $
+package org.hibernate.test.hql;
+
+/**
+ * @author Gavin King
+ */
+public class PettingZoo extends Zoo {
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/PettingZoo.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Pickup.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Pickup.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Pickup.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,10 @@
+// $Id: Pickup.java 7087 2005-06-08 18:23:44Z steveebersole $
+package org.hibernate.test.hql;
+
+/**
+ * Implementation of Pickup.
+ *
+ * @author Steve Ebersole
+ */
+public class Pickup extends Truck {
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Pickup.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/QueryTranslatorTestCase.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/QueryTranslatorTestCase.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/QueryTranslatorTestCase.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,545 @@
+// $Id: QueryTranslatorTestCase.java 11361 2007-03-29 12:48:35Z steve.ebersole at jboss.com $
+package org.hibernate.test.hql;
+
+import java.sql.Connection;
+import java.sql.ParameterMetaData;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.StringTokenizer;
+import java.util.TreeMap;
+
+import junit.framework.ComparisonFailure;
+
+import org.hibernate.EntityMode;
+import org.hibernate.MappingException;
+import org.hibernate.QueryException;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.classic.Session;
+import org.hibernate.engine.SessionFactoryImplementor;
+import org.hibernate.engine.query.HQLQueryPlan;
+import org.hibernate.hql.QueryTranslator;
+import org.hibernate.hql.QueryTranslatorFactory;
+import org.hibernate.hql.ast.ASTQueryTranslatorFactory;
+import org.hibernate.hql.ast.HqlToken;
+import org.hibernate.hql.ast.QueryTranslatorImpl;
+import org.hibernate.hql.ast.util.ASTPrinter;
+import org.hibernate.hql.classic.ClassicQueryTranslatorFactory;
+import org.hibernate.type.Type;
+import org.hibernate.util.StringHelper;
+
+/**
+ * Test case superclass for testing QueryTranslator implementations.
+ *
+ * @author josh Dec 6, 2004 8:21:21 AM
+ */
+public abstract class QueryTranslatorTestCase extends FunctionalTestCase {
+
+	public QueryTranslatorTestCase(String x) {
+		super( x );
+		// Create an instance of HqlToken, so that it will have an entry point outside the package.  This
+		// will stop IDEA's code inspector from suggesting that HqlToken should be package local.
+		new HqlToken();
+	}
+
+	public String[] getMappings() {
+		return new String[] {
+				"hql/Animal.hbm.xml",
+				"hql/EntityWithCrazyCompositeKey.hbm.xml",
+				"hql/CrazyIdFieldNames.hbm.xml",
+				"hql/SimpleEntityWithAssociation.hbm.xml",
+				"hql/ComponentContainer.hbm.xml",
+				"batchfetch/ProductLine.hbm.xml",
+				"cid/Customer.hbm.xml",
+				"cid/Order.hbm.xml",
+				"cid/LineItem.hbm.xml",
+				"cid/Product.hbm.xml",
+				"legacy/Baz.hbm.xml",
+				"legacy/Category.hbm.xml",
+				"legacy/Commento.hbm.xml",
+				"legacy/Container.hbm.xml",
+				"legacy/Custom.hbm.xml",
+				"legacy/Eye.hbm.xml",
+				"legacy/Fee.hbm.xml",
+				"legacy/FooBar.hbm.xml",
+				"legacy/Fum.hbm.xml",
+				"legacy/Glarch.hbm.xml",
+				"legacy/Holder.hbm.xml",
+				"legacy/Many.hbm.xml",
+				"legacy/Marelo.hbm.xml",
+				"legacy/MasterDetail.hbm.xml",
+				"legacy/Middle.hbm.xml",
+				"legacy/Multi.hbm.xml",
+				"legacy/Nameable.hbm.xml",
+				"legacy/One.hbm.xml",
+				"legacy/Qux.hbm.xml",
+				"legacy/Simple.hbm.xml",
+				"legacy/SingleSeveral.hbm.xml",
+				"legacy/WZ.hbm.xml",
+				"legacy/UpDown.hbm.xml",
+				"compositeelement/Parent.hbm.xml",
+				"onetoone/joined/Person.hbm.xml",
+				"any/Properties.hbm.xml"
+		};
+	}
+
+	public boolean createSchema() {
+		return false;
+	}
+
+	public boolean recreateSchemaAfterFailure() {
+		return false;
+	}
+
+	public void assertTranslation(String hql) throws QueryException, MappingException {
+		assertTranslation( hql, null );
+	}
+
+	public void assertTranslation(String hql, boolean scalar) throws QueryException, MappingException {
+		assertTranslation( hql, null, scalar, null );
+	}
+
+	protected void assertTranslation(String hql, Map replacements) {
+		ComparisonFailure cf = null;
+		try {
+			assertTranslation( hql, replacements, false, null );
+		}
+		catch ( ComparisonFailure e ) {
+			e.printStackTrace();
+			cf = e;
+		}
+		if ("false".equals(System.getProperty("org.hibernate.test.hql.SkipScalarQuery","false"))) {
+			// Run the scalar translation anyway, even if there was a comparison failure.
+			assertTranslation( hql, replacements, true, null );
+		}
+		if (cf != null)
+			throw cf;
+	}
+
+	protected void runClassicTranslator(String hql) throws Exception {
+		SessionFactoryImplementor factory = getSessionFactoryImplementor();
+		Map replacements = new HashMap();
+		QueryTranslator oldQueryTranslator = null;
+		try {
+			QueryTranslatorFactory classic = new ClassicQueryTranslatorFactory();
+			oldQueryTranslator = classic.createQueryTranslator( hql, hql, Collections.EMPTY_MAP, factory );
+			oldQueryTranslator.compile( replacements, false );
+		}
+		catch ( Exception e ) {
+			e.printStackTrace();
+			throw e;
+		}
+		String oldsql = oldQueryTranslator.getSQLString();
+		System.out.println( "HQL    : " + hql );
+		System.out.println( "OLD SQL: " + oldsql );
+	}
+
+	protected void assertTranslation(String hql, Map replacements, boolean scalar, String sql) {
+		SessionFactoryImplementor factory = getSessionFactoryImplementor();
+
+		// Create an empty replacements map if we don't have one.
+		if ( replacements == null ) {
+			replacements = new HashMap();
+		}
+
+		// steve -> note that the empty maps here represent the currently enabled filters...
+		QueryTranslator oldQueryTranslator = null;
+		Exception oldException = null;
+		try {
+			System.out.println("Compiling with classic QueryTranslator...");
+			QueryTranslatorFactory classic = new ClassicQueryTranslatorFactory();
+			oldQueryTranslator = classic.createQueryTranslator( hql, hql, Collections.EMPTY_MAP, factory );
+			oldQueryTranslator.compile( replacements, scalar );
+		}
+		catch ( QueryException e ) {
+			oldException = e;
+		}
+		catch ( MappingException e ) {
+			oldException = e;
+		}
+
+		QueryTranslator newQueryTranslator = null;
+		Exception newException = null;
+		try {
+			System.out.println("Compiling with AST QueryTranslator...");
+			newQueryTranslator = createNewQueryTranslator( hql, replacements, scalar );
+		}
+		catch ( QueryException e ) {
+			newException = e;
+		}
+		catch ( MappingException e ) {
+			newException = e;
+		}
+
+		// If the old QT threw an exception, the new one should too.
+		if ( oldException != null ) {
+//			oldException.printStackTrace();
+			assertNotNull( "New query translator did *NOT* throw an exception, the old one did : " + oldException, newException );
+			assertEquals( oldException.getMessage(), newException.getMessage() );
+			return;	// Don't bother with the rest of the assertions.
+		}
+		else if ( newException != null ) {
+			newException.printStackTrace();
+			assertNull( "Old query translator did not throw an exception, the new one did", newException );
+		}
+
+		// -- check all of the outputs --
+		checkSql( oldQueryTranslator, newQueryTranslator, hql, scalar, sql );
+		checkQuerySpaces( oldQueryTranslator, newQueryTranslator );
+		checkReturnedTypes( oldQueryTranslator, newQueryTranslator );
+		checkColumnNames( oldQueryTranslator, newQueryTranslator );
+
+	}
+
+	protected QueryTranslatorImpl createNewQueryTranslator(String hql, Map replacements, boolean scalar) {
+		SessionFactoryImplementor factory = getSessionFactoryImplementor();
+		return createNewQueryTranslator( hql, replacements, scalar, factory );
+	}
+
+	private QueryTranslatorImpl createNewQueryTranslator(String hql, Map replacements, boolean scalar, SessionFactoryImplementor factory) {
+		QueryTranslatorFactory ast = new ASTQueryTranslatorFactory();
+		QueryTranslatorImpl newQueryTranslator = ( QueryTranslatorImpl ) ast.createQueryTranslator( hql, hql, Collections.EMPTY_MAP, factory );
+		newQueryTranslator.compile( replacements, scalar );
+		return newQueryTranslator;
+	}
+
+	protected QueryTranslatorImpl createNewQueryTranslator(String hql) {
+		return createNewQueryTranslator( hql, new HashMap(), false );
+	}
+
+	protected QueryTranslatorImpl createNewQueryTranslator(String hql, SessionFactoryImplementor sfimpl) {
+		return createNewQueryTranslator( hql, new HashMap(), false, sfimpl );
+	}
+
+	protected HQLQueryPlan createQueryPlan(String hql, boolean scalar) {
+		return new HQLQueryPlan( hql, scalar, Collections.EMPTY_MAP, getSessionFactoryImplementor() );
+	}
+
+	protected HQLQueryPlan createQueryPlan(String hql) {
+		return createQueryPlan( hql, false );
+	}
+
+	protected SessionFactoryImplementor getSessionFactoryImplementor() {
+		SessionFactoryImplementor factory = ( SessionFactoryImplementor ) getSessions();
+		if ( factory == null ) {
+			throw new NullPointerException( "Unable to create factory!" );
+		}
+		return factory;
+	}
+
+	private void checkColumnNames(QueryTranslator oldQueryTranslator, QueryTranslator newQueryTranslator) {
+		// Check the column names.
+
+		String[][] oldColumnNames = oldQueryTranslator.getColumnNames();
+		String[][] newColumnNames = newQueryTranslator.getColumnNames();
+		/*assertEquals( "Column name array is not the right length!", oldColumnNames.length, newColumnNames.length );
+		for ( int i = 0; i < oldColumnNames.length; i++ ) {
+			assertEquals( "Column name array [" + i + "] is not the right length!", oldColumnNames[i].length, newColumnNames[i].length );
+			for ( int j = 0; j < oldColumnNames[i].length; j++ ) {
+				assertEquals( "Column name [" + i + "," + j + "]", oldColumnNames[i][j], newColumnNames[i][j] );
+			}
+		}*/
+	}
+
+	private void checkReturnedTypes(QueryTranslator oldQueryTranslator, QueryTranslator newQueryTranslator) {
+		// Check the returned types for a regression.
+		Type[] oldReturnTypes = oldQueryTranslator.getReturnTypes();
+		Type[] returnTypes = newQueryTranslator.getReturnTypes();
+		assertEquals( "Return types array is not the right length!", oldReturnTypes.length, returnTypes.length );
+		for ( int i = 0; i < returnTypes.length; i++ ) {
+			assertNotNull( returnTypes[i] );
+			assertNotNull( oldReturnTypes[i] );
+			assertEquals( "Returned types did not match!", oldReturnTypes[i].getReturnedClass(), returnTypes[i].getReturnedClass() );
+			System.out.println("returnedType[" + i + "] = " + returnTypes[i] + " oldReturnTypes[" + i + "] = " + oldReturnTypes[i]);
+		}
+	}
+
+	private void checkQuerySpaces(QueryTranslator oldQueryTranslator, QueryTranslator newQueryTranslator) {
+		// Check the query spaces for a regression.
+		Set oldQuerySpaces = oldQueryTranslator.getQuerySpaces();
+		Set querySpaces = newQueryTranslator.getQuerySpaces();
+		assertEquals( "Query spaces is not the right size!", oldQuerySpaces.size(), querySpaces.size() );
+		for ( Iterator iterator = oldQuerySpaces.iterator(); iterator.hasNext(); ) {
+			Object o = iterator.next();
+			assertTrue( "New query space does not contain " + o + "!", querySpaces.contains( o ) );
+		}
+	}
+
+	protected Exception compileBadHql(String hql, boolean scalar) {
+		QueryTranslator newQueryTranslator;
+		Map replacements = null;
+		Exception newException = null;
+		SessionFactoryImplementor factory = getSessionFactoryImplementor();
+		try {
+			QueryTranslatorFactory ast = new ASTQueryTranslatorFactory();
+			newQueryTranslator = ast.createQueryTranslator( hql, hql, Collections.EMPTY_MAP, factory );
+			newQueryTranslator.compile( replacements, scalar );
+		}
+		catch ( QueryException e ) {
+			newException = e;
+		}
+		catch ( MappingException e ) {
+			newException = e;
+		}
+		assertNotNull( "Expected exception from compilation of '" + hql + "'!", newException );
+		return newException;
+	}
+
+	private void checkSql(QueryTranslator oldQueryTranslator, QueryTranslator newQueryTranslator, String hql, boolean scalar, String sql) {
+
+		String oldsql = oldQueryTranslator.getSQLString();
+		String newsql = newQueryTranslator.getSQLString();
+		System.out.println( "HQL    : " + ASTPrinter.escapeMultibyteChars(hql) );
+		System.out.println( "OLD SQL: " + ASTPrinter.escapeMultibyteChars(oldsql) );
+		System.out.println( "NEW SQL: " + ASTPrinter.escapeMultibyteChars(newsql) );
+		if ( sql == null ) {
+			// Check the generated SQL.                                          ASTPrinter.escapeMultibyteChars(
+			assertSQLEquals( "SQL is not the same as the old SQL (scalar=" + scalar + ")", oldsql, newsql );
+		}
+		else {
+			assertSQLEquals( "SQL is not the same as the expected SQL (scalar=" + scalar + ")", sql, newsql );
+		}
+	}
+
+	private void assertSQLEquals(String message, String oldsql, String newsql) {
+		Map oldMap = getTokens(oldsql);
+		Map newMap = getTokens(newsql);
+		if ( !oldMap.equals(newMap) ) {
+			assertEquals(message, oldsql, newsql);			
+		}
+		
+		//String oldsqlStripped = stripExtraSpaces( oldsql );
+		//String newsqlStripped = stripExtraSpaces( newsql );
+		//assertEquals( message, oldsqlStripped, newsqlStripped );
+	}
+
+	
+	private Map getTokens(String sql) {
+		Map result = new TreeMap();
+		if (sql==null) return result;
+		result.put( "=", new Integer( StringHelper.countUnquoted(sql, '=') ) );
+		StringTokenizer tokenizer = new StringTokenizer( sql, "(),= " );
+		while ( tokenizer.hasMoreTokens() ) {
+			String fragment = tokenizer.nextToken();
+			/*if ( "on".equals(fragment) ) fragment = "and";
+			if ( "join".equals(fragment) || "inner".equals(fragment) ) continue;*/
+			Integer count = (Integer) result.get(fragment);
+			if ( count==null ) {
+				count = new Integer(1);
+			}
+			else {
+				count = new Integer( count.intValue() + 1 );
+			}
+			result.put(fragment, count);
+		}
+		return result;
+	}
+	
+	private String stripExtraSpaces(String string) {
+		if ( string == null ) {
+			return null;
+		}
+
+		StringBuffer buffer = new StringBuffer( string.length() );
+		char[] chars = string.toCharArray();
+		int length = chars.length;
+		boolean wasSpace = false;
+		for ( int i = 0; i < length; i++ ) {
+			boolean isSpace = chars[i] == ' ';
+			if ( wasSpace && isSpace ) {
+				continue;
+			}
+			else {
+				buffer.append( chars[i] );
+			}
+
+			wasSpace = isSpace;
+		}
+//		StringTokenizer tokenizer = new StringTokenizer( string.trim(), " " );
+//		while ( tokenizer.hasMoreTokens() ) {
+//			final String fragment = tokenizer.nextToken();
+//			buffer.append( fragment );
+//			buffer.append( " " );
+//		}
+//
+		return buffer.toString();
+	}
+
+	private void checkSqlByResultSet(
+	        QueryTranslator oldQueryTranslator,
+	        QueryTranslator newQueryTranslator,
+	        Object[] binds
+	) {
+		String oldsql = oldQueryTranslator.getSQLString();
+		String newsql = newQueryTranslator.getSQLString();
+
+		Session session = openSession();
+		Connection connection = session.connection();
+
+		PreparedStatement oldps = null;
+		PreparedStatement newps = null;
+		ResultSet oldrs = null;
+		ResultSet newrs = null;
+
+		try {
+			try {
+				oldps = connection.prepareStatement( oldsql );
+			}
+			catch( Throwable t ) {
+				fail( "Unable to prepare sql generated by old parser : " + t );
+			}
+			try {
+				newps = connection.prepareStatement( newsql );
+			}
+			catch( Throwable t ) {
+				fail( "Unable to prepare sql generated by new parser : " + t );
+			}
+
+			checkBinds(oldps, newps, binds);
+
+			try {
+				oldrs = executeQuery( oldps, binds );
+			}
+			catch( Throwable t ) {
+				fail( "Unable to execute sql generated by old parser : " + t );
+			}
+
+			try {
+				newrs = executeQuery( newps, binds );
+			}
+			catch( Throwable t ) {
+				fail( "Unable to execute sql generated by new parser : " + t );
+			}
+
+			checkResults( oldrs, newrs );
+		}
+		finally {
+			// make *sure* the sql resources get cleaned up
+			release(oldrs);
+			release(newrs);
+			release(oldps);
+			release(newps);
+			release(session);
+		}
+	}
+
+	private void checkBinds(PreparedStatement oldps, PreparedStatement newps, Object[] binds) {
+		// Make sure the binds "feel" ok
+		try {
+			ParameterMetaData oldBindMetaData = oldps.getParameterMetaData();
+			ParameterMetaData newBindMetaData = newps.getParameterMetaData();
+
+			assertEquals( "Different bind parameter count", oldBindMetaData.getParameterCount(), newBindMetaData.getParameterCount() );
+			assertEquals( "Incorrect number of binds passed in", oldBindMetaData.getParameterCount(), binds == null ? 0 : binds.length );
+
+			for ( int i = 0, max = oldBindMetaData.getParameterCount(); i < max; i++ ) {
+				assertEquals( "Different bind types", oldBindMetaData.getParameterType(i), newBindMetaData.getParameterType(i) );
+			}
+		}
+		catch( Throwable t ) {
+			fail( "SQLException comparing binds : " + t );
+		}
+	}
+
+	private ResultSet executeQuery(PreparedStatement ps, Object[] binds) throws SQLException {
+		if ( binds != null ) {
+			for ( int i = 0, max = binds.length; i < max; i++ ) {
+				ps.setObject( i, binds[i] );
+			}
+		}
+
+		return ps.executeQuery();
+	}
+
+	private void checkResults(ResultSet oldrs, ResultSet newrs) {
+		ResultSetMetaData oldmeta = null;
+		ResultSetMetaData newmeta = null;
+		int colCount = 0;
+		Type[] types = null;
+
+		// first compare the metadata from the two results
+		try {
+			oldmeta = oldrs.getMetaData();
+			newmeta = newrs.getMetaData();
+			assertEquals( "Different column counts", oldmeta.getColumnCount(), newmeta.getColumnCount() );
+
+			colCount = oldmeta.getColumnCount();
+			types = new Type[colCount];
+
+			for ( int i = 1, max = colCount; i < max; i++ ) {
+				assertEquals( "Column names were different", oldmeta.getColumnName(i), newmeta.getColumnName(i) );
+				assertEquals( "Column types were different", oldmeta.getColumnType(i), newmeta.getColumnType(i) );
+				assertEquals( "Java types were different", oldmeta.getColumnClassName(i), newmeta.getColumnClassName(i) );
+				types[i] = sfi().getTypeResolver().basic( oldmeta.getColumnClassName(i) );
+			}
+		}
+		catch( Throwable t ) {
+			fail( "Error comparing result set metadata" );
+		}
+
+		// Then compare the actual results
+		try {
+			while ( oldrs.next() & newrs.next() ) {
+				for ( int i = 1; i < colCount; i++ ) {
+					Object oldval = oldrs.getObject(i);
+					if ( oldrs.wasNull() ) oldval = null;
+					Object newval = newrs.getObject(i);
+					if ( newrs.wasNull() ) newval = null;
+					checkLogicalEquality( oldval, newval, types[i] );
+				}
+			}
+
+			// for "better reporting" purposes, make sure both result sets are fully exhausted
+			while ( oldrs.next() );
+			while ( newrs.next() );
+
+			assertEquals( "Different row counts", oldrs.getRow(), newrs.getRow() );
+		}
+		catch( Throwable t ) {
+			fail( "Error comparing result set structure" );
+		}
+	}
+
+	private void checkLogicalEquality(Object oldval, Object newval, Type type) {
+		if ( oldval == null && newval == null ) {
+			// two nulls are logically equivalent here...
+			return;
+		}
+		else {
+			assertTrue( "Different result values", type.isEqual(oldval, newval, EntityMode.POJO) );
+		}
+	}
+
+	private void release(PreparedStatement ps) {
+		if ( ps != null ) {
+			try {
+				ps.close();
+			}
+			catch( Throwable t ) {}
+		}
+	}
+
+	private void release(ResultSet rs) {
+		if ( rs != null ) {
+			try {
+				rs.close();
+			}
+			catch( Throwable t ) {}
+		}
+	}
+
+	private void release(Session session) {
+		if ( session != null ) {
+			try {
+				session.close();
+			}
+			catch( Throwable t ) {}
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/QueryTranslatorTestCase.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Reptile.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Reptile.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Reptile.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,15 @@
+//$Id: Reptile.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.hql;
+
+/**
+ * @author Gavin King
+ */
+public class Reptile extends Animal {
+	private float bodyTemperature;
+	public float getBodyTemperature() {
+		return bodyTemperature;
+	}
+	public void setBodyTemperature(float bodyTemperature) {
+		this.bodyTemperature = bodyTemperature;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Reptile.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/SUV.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/SUV.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/SUV.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,10 @@
+// $Id: SUV.java 7087 2005-06-08 18:23:44Z steveebersole $
+package org.hibernate.test.hql;
+
+/**
+ * Implementation of SUV.
+ *
+ * @author Steve Ebersole
+ */
+public class SUV extends Truck {
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/SUV.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/ScrollableCollectionFetchingTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/ScrollableCollectionFetchingTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/ScrollableCollectionFetchingTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,407 @@
+// $Id: ScrollableCollectionFetchingTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.hql;
+
+import junit.framework.Test;
+
+import org.hibernate.HibernateException;
+import org.hibernate.ScrollMode;
+import org.hibernate.ScrollableResults;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Tests the new functionality of allowing scrolling of results which
+ * contain collection fetches.
+ *
+ * @author Steve Ebersole
+ */
+public class ScrollableCollectionFetchingTest extends FunctionalTestCase {
+
+	public ScrollableCollectionFetchingTest(String name) {
+		super( name );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( ScrollableCollectionFetchingTest.class );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "hql/Animal.hbm.xml" };
+	}
+
+	public void testTupleReturnFails() {
+		Session s = openSession();
+		Transaction txn = s.beginTransaction();
+
+		try {
+			s.createQuery( "select a, a.weight from Animal a inner join fetch a.offspring" ).scroll();
+			fail( "scroll allowed with collection fetch and reurning tuples" );
+		}
+		catch( HibernateException e ) {
+			// expected result...
+		}
+
+		txn.commit();
+		s.close();
+	}
+
+	public void testScrollingJoinFetchesEmptyResultSet() {
+		Session s = openSession();
+		Transaction txn = s.beginTransaction();
+
+		final String query = "from Animal a left join fetch a.offspring where a.description like :desc order by a.id";
+
+		// first, as a control, make sure there are no results
+		int size = s.createQuery( query ).setString( "desc", "root%" ).list().size();
+		assertEquals( 0, size );
+
+		// now get the scrollable results
+		ScrollableResults results = s.createQuery( query ).setString( "desc", "root%" ).scroll();
+
+		assertFalse( results.isFirst() );
+		assertFalse( results.isLast() );
+
+		assertFalse( results.next() );
+		assertFalse( results.isFirst() );
+		assertFalse( results.isLast() );
+
+		assertFalse( results.previous() );
+		assertFalse( results.isFirst() );
+		assertFalse( results.isLast() );
+
+		results.beforeFirst();
+		assertFalse( results.isFirst() );
+		assertFalse( results.isLast() );
+		assertFalse( results.next() );
+
+		assertFalse( results.first() );
+		assertFalse( results.isFirst() );
+		assertFalse( results.isLast() );
+		assertFalse( results.next() );
+
+		results.afterLast();
+		assertFalse( results.isFirst() );
+		assertFalse( results.isLast() );
+		assertFalse( results.next() );
+
+		assertFalse( results.last() );
+		assertFalse( results.isFirst() );
+		assertFalse( results.isLast() );
+		assertFalse( results.next() );
+
+		for ( int i=1; i<3; i++ ) {
+			assertFalse( results.scroll( i ) );
+			assertFalse( results.isFirst() );
+			assertFalse( results.isLast() );
+
+			assertFalse( results.scroll( - i ) );
+			assertFalse( results.isFirst() );
+			assertFalse( results.isLast() );
+
+			assertFalse( results.setRowNumber( i ) );
+			assertFalse( results.isFirst() );
+			assertFalse( results.isLast() );
+
+			assertFalse( results.setRowNumber( - i ) );
+			assertFalse( results.isFirst() );
+			assertFalse( results.isLast() );
+		}
+
+		txn.commit();
+		s.close();
+	}
+
+	public void testScrollingJoinFetchesSingleRowResultSet() {
+		Session s = openSession();
+		Transaction txn = s.beginTransaction();
+
+		Animal mother = new Animal();
+		mother.setDescription( "root-1" );
+
+		Animal daughter = new Animal();
+		daughter.setDescription( "daughter" );
+
+		daughter.setMother( mother );
+		mother.addOffspring( daughter );
+
+		s.save( mother );
+		s.save( daughter );
+
+		txn.commit();
+		s.close();
+
+		s = openSession();
+		txn = s.beginTransaction();
+
+		assertNotNull(s
+		        .createQuery( "from Animal a left join fetch a.offspring where a.description like :desc order by a.id" )
+		        .setString( "desc", "root%" )
+		        .uniqueResult() );
+
+		ScrollableResults results = s
+		        .createQuery( "from Animal a left join fetch a.offspring where a.description like :desc order by a.id" )
+		        .setString( "desc", "root%" )
+		        .scroll();
+
+		assertFalse( results.isFirst() );
+		assertFalse( results.isLast() );
+		assertFalse( results.previous() );		
+
+		assertTrue( results.next() );
+		assertTrue( results.isFirst() );
+		assertTrue( results.isLast() );
+
+		assertFalse( results.next() );
+		assertFalse( results.isFirst() );
+		assertFalse( results.isLast() );
+
+		assertTrue( results.previous() );
+		assertTrue( results.isFirst() );
+		assertTrue( results.isLast() );
+
+		assertFalse( results.previous() );
+		assertFalse( results.isFirst() );
+		assertFalse( results.isLast() );
+
+		assertTrue( results.next() );
+		assertTrue( results.isFirst() );
+		assertTrue( results.isLast() );
+
+		results.beforeFirst();
+		assertFalse( results.isFirst() );
+		assertFalse( results.isLast() );
+		assertFalse( results.previous() );
+
+		assertTrue( results.first() );
+		assertTrue( results.isFirst() );
+		assertTrue( results.isLast() );
+		assertFalse( results.next() );
+
+		results.afterLast();
+		assertFalse( results.isFirst() );
+		assertFalse( results.isLast() );
+		assertFalse( results.next() );
+
+		assertTrue( results.last() );
+		assertTrue( results.isFirst() );
+		assertTrue( results.isLast() );
+		assertFalse( results.next() );
+
+		assertTrue( results.first() );
+		assertTrue( results.isFirst() );
+		assertTrue( results.isLast() );		
+
+		for ( int i=1; i<3; i++ ) {
+			assertTrue( results.setRowNumber( 1 ) );
+			assertTrue( results.isFirst() );
+			assertTrue( results.isLast() );
+
+			assertFalse( results.scroll( i ) );
+			assertFalse( results.isFirst() );
+			assertFalse( results.isLast() );
+
+			assertTrue( results.setRowNumber( 1 ) );
+			assertTrue( results.isFirst() );
+			assertTrue( results.isLast() );
+
+			assertFalse( results.scroll( - i ) );
+			assertFalse( results.isFirst() );
+			assertFalse( results.isLast() );
+
+			if ( i != 1 ) {
+				assertFalse( results.setRowNumber( i ) );
+				assertFalse( results.isFirst() );
+				assertFalse( results.isLast() );
+
+				assertFalse( results.setRowNumber( - i ) );
+				assertFalse( results.isFirst() );
+				assertFalse( results.isLast() );
+			}
+		}
+
+		txn.commit();
+		s.close();
+
+		s = openSession();
+		txn = s.beginTransaction();
+
+		s.createQuery( "delete Animal where not description like 'root%'" ).executeUpdate();
+		s.createQuery( "delete Animal" ).executeUpdate();
+
+		txn.commit();
+		s.close();
+	}
+
+	public void testScrollingJoinFetchesForward() {
+		if ( ! supportsResultSetPositionQueryMethodsOnForwardOnlyCursor() ) {
+			return;
+		}
+
+		TestData data = new TestData();
+		data.prepare();
+
+		Session s = openSession();
+		Transaction txn = s.beginTransaction();
+
+		ScrollableResults results = s
+		        .createQuery( "from Animal a left join fetch a.offspring where a.description like :desc order by a.id" )
+		        .setString( "desc", "root%" )
+				.scroll( ScrollMode.FORWARD_ONLY );
+
+		int counter = 0;
+		while ( results.next() ) {
+			counter++;
+			Animal animal = ( Animal ) results.get( 0 );
+			checkResult( animal );
+		}
+		assertEquals( "unexpected result count", 2, counter );
+
+		txn.commit();
+		s.close();
+
+		data.cleanup();
+	}
+
+	public void testScrollingJoinFetchesReverse() {
+		TestData data = new TestData();
+		data.prepare();
+
+		Session s = openSession();
+		Transaction txn = s.beginTransaction();
+
+		ScrollableResults results = s
+		        .createQuery( "from Animal a left join fetch a.offspring where a.description like :desc order by a.id" )
+		        .setString( "desc", "root%" )
+		        .scroll();
+
+		results.afterLast();
+
+		int counter = 0;
+		while ( results.previous() ) {
+			counter++;
+			Animal animal = ( Animal ) results.get( 0 );
+			checkResult( animal );
+		}
+		assertEquals( "unexpected result count", 2, counter );
+
+		txn.commit();
+		s.close();
+
+		data.cleanup();
+	}
+
+	public void testScrollingJoinFetchesPositioning() {
+		TestData data = new TestData();
+		data.prepare();
+
+		Session s = openSession();
+		Transaction txn = s.beginTransaction();
+
+		ScrollableResults results = s
+		        .createQuery( "from Animal a left join fetch a.offspring where a.description like :desc order by a.id" )
+		        .setString( "desc", "root%" )
+		        .scroll();
+
+		results.first();
+		Animal animal = ( Animal ) results.get( 0 );
+		assertEquals( "first() did not return expected row", data.root1Id, animal.getId() );
+
+		results.scroll( 1 );
+		animal = ( Animal ) results.get( 0 );
+		assertEquals( "scroll(1) did not return expected row", data.root2Id, animal.getId() );
+
+		results.scroll( -1 );
+		animal = ( Animal ) results.get( 0 );
+		assertEquals( "scroll(-1) did not return expected row", data.root1Id, animal.getId() );
+
+		results.setRowNumber( 1 );
+		animal = ( Animal ) results.get( 0 );
+		assertEquals( "setRowNumber(1) did not return expected row", data.root1Id, animal.getId() );
+
+		results.setRowNumber( 2 );
+		animal = ( Animal ) results.get( 0 );
+		assertEquals( "setRowNumber(2) did not return expected row", data.root2Id, animal.getId() );
+
+		txn.commit();
+		s.close();
+
+		data.cleanup();
+	}
+
+	private void checkResult(Animal animal) {
+		if ( "root-1".equals( animal.getDescription() ) ) {
+			assertEquals( "root-1 did not contain both children", 2, animal.getOffspring().size() );
+		}
+		else if ( "root-2".equals( animal.getDescription() ) ) {
+			assertEquals( "root-2 did not contain zero children", 0, animal.getOffspring().size() );
+		}
+	}
+
+	private class TestData {
+
+		private Long root1Id;
+		private Long root2Id;
+
+		private void prepare() {
+			Session s = openSession();
+			Transaction txn = s.beginTransaction();
+
+			Animal mother = new Animal();
+			mother.setDescription( "root-1" );
+
+			Animal another = new Animal();
+			another.setDescription( "root-2" );
+
+			Animal son = new Animal();
+			son.setDescription( "son");
+
+			Animal daughter = new Animal();
+			daughter.setDescription( "daughter" );
+
+			Animal grandson = new Animal();
+			grandson.setDescription( "grandson" );
+
+			Animal grandDaughter = new Animal();
+			grandDaughter.setDescription( "granddaughter" );
+
+			son.setMother( mother );
+			mother.addOffspring( son );
+
+			daughter.setMother( mother );
+			mother.addOffspring( daughter );
+
+			grandson.setMother( daughter );
+			daughter.addOffspring( grandson );
+
+			grandDaughter.setMother( daughter );
+			daughter.addOffspring( grandDaughter );
+
+			s.save( mother );
+			s.save( another );
+			s.save( son );
+			s.save( daughter );
+			s.save( grandson );
+			s.save( grandDaughter );
+
+			txn.commit();
+			s.close();
+
+			root1Id = mother.getId();
+			root2Id = another.getId();
+		}
+
+		private void cleanup() {
+			Session s = openSession();
+			Transaction txn = s.beginTransaction();
+			
+			s.createQuery( "delete Animal where description like 'grand%'" ).executeUpdate();
+			s.createQuery( "delete Animal where not description like 'root%'" ).executeUpdate();
+			s.createQuery( "delete Animal" ).executeUpdate();
+
+			txn.commit();
+			s.close();
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/ScrollableCollectionFetchingTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/SimpleAssociatedEntity.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/SimpleAssociatedEntity.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/SimpleAssociatedEntity.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,63 @@
+package org.hibernate.test.hql;
+
+/**
+ * @author Steve Ebersole
+ */
+public class SimpleAssociatedEntity {
+	private Long id;
+	private String name;
+	private SimpleEntityWithAssociation owner;
+
+	public SimpleAssociatedEntity() {
+	}
+
+	public SimpleAssociatedEntity(String name) {
+		this.name = name;
+	}
+
+	public SimpleAssociatedEntity(String name, SimpleEntityWithAssociation owner) {
+		this( name );
+		bindToOwner( owner );
+	}
+
+	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 SimpleEntityWithAssociation getOwner() {
+		return owner;
+	}
+
+	public void setOwner(SimpleEntityWithAssociation owner) {
+		this.owner = owner;
+	}
+
+	public void bindToOwner(SimpleEntityWithAssociation owner) {
+		if ( owner != this.owner ) {
+			unbindFromCurrentOwner();
+			if ( owner != null ) {
+				owner.getAssociatedEntities().add( this );
+			}
+		}
+		this.owner = owner;
+	}
+
+	public void unbindFromCurrentOwner() {
+		if ( this.owner != null ) {
+			this.owner.getAssociatedEntities().remove( this );
+			this.owner = null;
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/SimpleAssociatedEntity.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/SimpleEntityWithAssociation.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/SimpleEntityWithAssociation.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/SimpleEntityWithAssociation.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+
+<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<hibernate-mapping package="org.hibernate.test.hql">
+
+    <!-- *Very* important for the test cases that these entities have identically named columns! -->
+
+    <class name="SimpleEntityWithAssociation" table="SIMPLE_1">
+        <id name="id" column="ID" type="long">
+            <generator class="native"/>
+        </id>
+        <property name="name" column="NAME" type="string"/>
+        <property name="negatedNumber">
+			<column name="negated_num"
+				read="-negated_num"
+				write="0 - ?"/>        
+        </property>
+        <set name="associatedEntities" cascade="all" inverse="true" lazy="true">
+            <key column="SIMPLE_1_ID"/>
+            <one-to-many class="SimpleAssociatedEntity"/>
+        </set>
+        <set name="manyToManyAssociatedEntities" cascade="save-update" inverse="false" lazy="true" table="MANY_TO_MANY">
+            <key column="IN_ID"/>
+            <many-to-many class="SimpleEntityWithAssociation" column="OUT_ID"/>
+        </set>
+    </class>
+
+    <class name="SimpleAssociatedEntity" table="SIMPLE_2">
+        <id name="id" column="ID" type="long">
+            <generator class="native"/>
+        </id>
+        <property name="name" column="NAME" type="string" />
+        <many-to-one name="owner" class="SimpleEntityWithAssociation" column="SIMPLE_1_ID"/>
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/SimpleEntityWithAssociation.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/SimpleEntityWithAssociation.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/SimpleEntityWithAssociation.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/SimpleEntityWithAssociation.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,79 @@
+package org.hibernate.test.hql;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author Steve Ebersole
+ */
+public class SimpleEntityWithAssociation {
+	private Long id;
+	private String name;
+	private Integer negatedNumber;
+	private Set associatedEntities = new HashSet();
+	private Set manyToManyAssociatedEntities = new HashSet();
+
+	public SimpleEntityWithAssociation() {
+	}
+
+	public SimpleEntityWithAssociation(String name) {
+		this.name = name;
+	}
+
+	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 Integer getNegatedNumber() {
+		return negatedNumber;
+	}
+
+	public void setNegatedNumber(Integer negatedNumber) {
+		this.negatedNumber = negatedNumber;
+	}	
+
+	public Set getAssociatedEntities() {
+		return associatedEntities;
+	}
+
+	public void setAssociatedEntities(Set associatedEntities) {
+		this.associatedEntities = associatedEntities;
+	}
+
+	public SimpleAssociatedEntity addAssociation(String name) {
+		return new SimpleAssociatedEntity( name, this );
+	}
+
+	public void addAssociation(SimpleAssociatedEntity association) {
+		association.bindToOwner( this );
+	}
+
+	public void removeAssociation(SimpleAssociatedEntity association) {
+		if ( getAssociatedEntities().contains( association ) ) {
+			association.unbindFromCurrentOwner();
+		}
+		else {
+			throw new IllegalArgumentException( "SimpleAssociatedEntity [" + association + "] not currently bound to this [" + this + "]" );
+		}
+	}
+
+	public Set getManyToManyAssociatedEntities() {
+		return manyToManyAssociatedEntities;
+	}
+
+	public void setManyToManyAssociatedEntities(Set manyToManyAssociatedEntities) {
+		this.manyToManyAssociatedEntities = manyToManyAssociatedEntities;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/SimpleEntityWithAssociation.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/StateProvince.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/StateProvince.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/StateProvince.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,37 @@
+// $Id: StateProvince.java 7996 2005-08-22 14:49:57Z steveebersole $
+package org.hibernate.test.hql;
+
+/**
+ * Implementation of StateProvince.
+ *
+ * @author Steve Ebersole
+ */
+public class StateProvince {
+	private Long id;
+	private String name;
+	private String isoCode;
+
+	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 String getIsoCode() {
+		return isoCode;
+	}
+
+	public void setIsoCode(String isoCode) {
+		this.isoCode = isoCode;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/StateProvince.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/TimestampVersioned.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/TimestampVersioned.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/TimestampVersioned.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,38 @@
+// $Id: TimestampVersioned.java 7384 2005-07-06 17:04:45Z steveebersole $
+package org.hibernate.test.hql;
+
+import java.util.Date;
+
+/**
+ * Implementation of TimestampVersioned.
+ *
+ * @author Steve Ebersole
+ */
+public class TimestampVersioned {
+	private Long id;
+	private Date version;
+	private String name;
+
+	public TimestampVersioned() {
+	}
+
+	public TimestampVersioned(String name) {
+		this.name = name;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public Date getVersion() {
+		return version;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/TimestampVersioned.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Truck.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Truck.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Truck.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,10 @@
+// $Id: Truck.java 7087 2005-06-08 18:23:44Z steveebersole $
+package org.hibernate.test.hql;
+
+/**
+ * Implementation of Truck.
+ *
+ * @author Steve Ebersole
+ */
+public class Truck extends Vehicle {
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Truck.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/User.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/User.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/User.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,48 @@
+//$Id: User.java 5891 2005-02-24 01:18:15Z oneovthafew $
+package org.hibernate.test.hql;
+
+import java.util.List;
+
+/**
+ * @author Gavin King
+ */
+public class User {
+	private Long id;
+	private String userName;
+	private Human human;
+	private List permissions;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getUserName() {
+		return userName;
+	}
+
+	public void setUserName(String userName) {
+		this.userName = userName;
+	}
+
+	public Human getHuman() {
+		return human;
+	}
+
+	public void setHuman(Human human) {
+		this.human = human;
+	}
+
+	public List getPermissions() {
+		return permissions;
+	}
+	
+
+	public void setPermissions(List permissions) {
+		this.permissions = permissions;
+	}
+	
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/User.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/VariousKeywordPropertyEntity.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/VariousKeywordPropertyEntity.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/VariousKeywordPropertyEntity.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,40 @@
+<?xml version="1.0"?>
+
+<!--
+  ~ Hibernate, Relational Persistence for Idiomatic Java
+  ~
+  ~ Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+  ~ indicated by the @author tags or express copyright attribution
+  ~ statements applied by the authors.  All third-party contributions are
+  ~ distributed under license by Red Hat Inc.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, as published by the Free Software Foundation.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  ~ or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+  ~ for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public License
+  ~ along with this distribution; if not, write to:
+  ~ Free Software Foundation, Inc.
+  ~ 51 Franklin Street, Fifth Floor
+  ~ Boston, MA  02110-1301  USA
+  -->
+<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<hibernate-mapping package="org.hibernate.test.hql">
+
+    <class name="VariousKeywordPropertyEntity">
+        <id name="id" type="long">
+            <generator class="increment"/>
+        </id>
+        <property name="type" type="string" />
+        <property name="value" type="string" />
+        <property name="key" type="string" />
+        <property name="entry" type="string" />
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/VariousKeywordPropertyEntity.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/VariousKeywordPropertyEntity.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/VariousKeywordPropertyEntity.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/VariousKeywordPropertyEntity.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,77 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.hql;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class VariousKeywordPropertyEntity {
+	private Long id;
+	private String value;
+	private String key;
+	private String entry;
+	private String type;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getValue() {
+		return value;
+	}
+
+	public void setValue(String value) {
+		this.value = value;
+	}
+
+	public String getKey() {
+		return key;
+	}
+
+	public void setKey(String key) {
+		this.key = key;
+	}
+
+	public String getEntry() {
+		return entry;
+	}
+
+	public void setEntry(String entry) {
+		this.entry = entry;
+	}
+
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/VariousKeywordPropertyEntity.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Vehicle.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Vehicle.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Vehicle.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.hql">
+
+	<!-- Vehicle represents an abstract root of a union-subclass hierarchy -->
+	<class name="Vehicle" abstract="true">
+		<id name="id" access="field" type="long">
+			<generator class="increment"/>
+		</id>
+		<property name="vin" type="string"/>
+		<property name="owner" type="string"/>
+
+		<!-- Car represents a concrete leaf of a union-subclass hierarchy with no concrete super -->
+		<union-subclass name="Car"/>
+
+		<!-- Truck represents a concrete subclass in a union-subclass hierarchy with concrete subclasses and no concrete super -->
+		<union-subclass name="Truck">
+			<!-- Both SUV and Pickup represent concrete leaf of a union-subclass hierarchy (like Car), but with a concrete super -->
+			<union-subclass name="SUV"/>
+			<union-subclass name="Pickup"/>
+		</union-subclass>
+	</class>
+
+	<sql-query name="native-delete-car">
+	    <synchronize table="Car"/>
+		delete from Car where owner = ?
+	</sql-query>
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Vehicle.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Vehicle.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Vehicle.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Vehicle.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,29 @@
+// $Id: Vehicle.java 7087 2005-06-08 18:23:44Z steveebersole $
+package org.hibernate.test.hql;
+
+/**
+ * Implementation of Vehicle.
+ *
+ * @author Steve Ebersole
+ */
+public abstract class Vehicle {
+	private Long id;
+	private String vin;
+	private String owner;
+
+	public String getVin() {
+		return vin;
+	}
+
+	public void setVin(String vin) {
+		this.vin = vin;
+	}
+
+	public String getOwner() {
+		return owner;
+	}
+
+	public void setOwner(String owner) {
+		this.owner = owner;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Vehicle.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Versions.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Versions.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Versions.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<hibernate-mapping package="org.hibernate.test.hql" default-access="field">
+
+	<class name="IntegerVersioned">
+		<id name="id">
+			<generator class="native"/>
+		</id>
+        <version name="version" column="vers"/>
+		<property name="name"/>
+	</class>
+
+	<class name="TimestampVersioned">
+		<id name="id">
+			<generator class="native"/>
+		</id>
+        <timestamp name="version" column="vers"/> 
+		<property name="name"/>
+	</class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Versions.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/WithClauseTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/WithClauseTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/WithClauseTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,200 @@
+// $Id: WithClauseTest.java 10945 2006-12-07 14:50:42Z steve.ebersole at jboss.com $
+package org.hibernate.test.hql;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.hql.ast.InvalidWithClauseException;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Implementation of WithClauseTest.
+ *
+ * @author Steve Ebersole
+ */
+public class WithClauseTest extends FunctionalTestCase {
+
+	public WithClauseTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "hql/Animal.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( WithClauseTest.class );
+	}
+
+	public void configure(Configuration cfg) {
+		super.configure( cfg );
+	}
+
+	public void testWithClauseFailsWithFetch() {
+		TestData data = new TestData();
+		data.prepare();
+
+		Session s = openSession();
+		Transaction txn = s.beginTransaction();
+
+		try {
+			s.createQuery( "from Animal a inner join fetch a.offspring as o with o.bodyWeight = :someLimit" )
+			        .setDouble( "someLimit", 1 )
+			        .list();
+			fail( "ad-hoc on clause allowed with fetched association" );
+		}
+		catch ( HibernateException e ) {
+			// the expected response...
+		}
+
+		txn.commit();
+		s.close();
+
+		data.cleanup();
+	}
+
+	public void testInvalidWithSemantics() {
+		Session s = openSession();
+		Transaction txn = s.beginTransaction();
+
+		try {
+			// PROBLEM : f.bodyWeight is a reference to a column on the Animal table; however, the 'f'
+			// alias relates to the Human.friends collection which the aonther Human entity.  The issue
+			// here is the way JoinSequence and Joinable (the persister) interact to generate the
+			// joins relating to the sublcass/superclass tables
+			s.createQuery( "from Human h inner join h.friends as f with f.bodyWeight < :someLimit" )
+					.setDouble( "someLimit", 1 )
+					.list();
+			fail( "failure expected" );
+		}
+		catch( InvalidWithClauseException expected ) {
+		}
+
+		try {
+			s.createQuery( "from Animal a inner join a.offspring o inner join o.mother as m inner join m.father as f with o.bodyWeight > 1" )
+					.list();
+			fail( "failure expected" );
+		}
+		catch( InvalidWithClauseException expected ) {
+		}
+
+		try {
+			s.createQuery( "from Human h inner join h.offspring o with o.mother.father = :cousin" )
+					.setEntity( "cousin", s.load( Human.class, new Long(123) ) )
+					.list();
+			fail( "failure expected" );
+		}
+		catch( InvalidWithClauseException expected ) {
+		}
+
+		txn.commit();
+		s.close();
+	}
+
+	public void testWithClause() {
+		TestData data = new TestData();
+		data.prepare();
+
+		Session s = openSession();
+		Transaction txn = s.beginTransaction();
+
+		// one-to-many
+		List list = s.createQuery( "from Human h inner join h.offspring as o with o.bodyWeight < :someLimit" )
+				.setDouble( "someLimit", 1 )
+				.list();
+		assertTrue( "ad-hoc on did not take effect", list.isEmpty() );
+
+		// many-to-one
+		list = s.createQuery( "from Animal a inner join a.mother as m with m.bodyWeight < :someLimit" )
+				.setDouble( "someLimit", 1 )
+				.list();
+		assertTrue( "ad-hoc on did not take effect", list.isEmpty() );
+
+		// many-to-many
+		list = s.createQuery( "from Human h inner join h.friends as f with f.nickName like 'bubba'" )
+				.list();
+		assertTrue( "ad-hoc on did not take effect", list.isEmpty() );
+
+		// http://opensource.atlassian.com/projects/hibernate/browse/HHH-1930
+		list = s.createQuery( "from Human h inner join h.nickNames as nicknames with nicknames = 'abc'" )
+				.list();
+		assertTrue( "ad-hoc on did not take effect", list.isEmpty() );
+
+		txn.commit();
+		s.close();
+
+		data.cleanup();
+	}
+
+	private class TestData {
+		public void prepare() {
+			Session session = openSession();
+			Transaction txn = session.beginTransaction();
+
+			Human mother = new Human();
+			mother.setBodyWeight( 10 );
+			mother.setDescription( "mother" );
+
+			Human father = new Human();
+			father.setBodyWeight( 15 );
+			father.setDescription( "father" );
+
+			Human child1 = new Human();
+			child1.setBodyWeight( 5 );
+			child1.setDescription( "child1" );
+
+			Human child2 = new Human();
+			child2.setBodyWeight( 6 );
+			child2.setDescription( "child2" );
+
+			Human friend = new Human();
+			friend.setBodyWeight( 20 );
+			friend.setDescription( "friend" );
+
+			child1.setMother( mother );
+			child1.setFather( father );
+			mother.addOffspring( child1 );
+			father.addOffspring( child1 );
+
+			child2.setMother( mother );
+			child2.setFather( father );
+			mother.addOffspring( child2 );
+			father.addOffspring( child2 );
+
+			father.setFriends( new ArrayList() );
+			father.getFriends().add( friend );
+
+			session.save( mother );
+			session.save( father );
+			session.save( child1 );
+			session.save( child2 );
+			session.save( friend );
+
+			txn.commit();
+			session.close();
+		}
+
+		public void cleanup() {
+			Session session = openSession();
+			Transaction txn = session.beginTransaction();
+			Human father = (Human) session.createQuery( "from Human where description = 'father'" ).uniqueResult();
+			father.getFriends().clear();
+			session.flush();
+			session.delete( session.createQuery( "from Human where description = 'friend'" ).uniqueResult() );
+			session.delete( session.createQuery( "from Human where description = 'child1'" ).uniqueResult() );
+			session.delete( session.createQuery( "from Human where description = 'child2'" ).uniqueResult() );
+			session.delete( session.createQuery( "from Human where description = 'mother'" ).uniqueResult() );
+			session.delete( father );
+			session.createQuery( "delete Animal" ).executeUpdate();
+			txn.commit();
+			session.close();
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/WithClauseTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Zoo.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Zoo.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Zoo.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,64 @@
+//$Id: Zoo.java 10653 2006-10-26 13:38:50Z steve.ebersole at jboss.com $
+package org.hibernate.test.hql;
+
+import java.util.Map;
+
+/**
+ * @author Gavin King
+ */
+public class Zoo {
+	private Long id;
+	private String name;
+	private Classification classification;
+	private Map animals;
+	private Map mammals;
+	private Address address;
+
+	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 Map getMammals() {
+		return mammals;
+	}
+
+	public void setMammals(Map mammals) {
+		this.mammals = mammals;
+	}
+
+	public Map getAnimals() {
+		return animals;
+	}
+
+	public void setAnimals(Map animals) {
+		this.animals = animals;
+	}
+
+	public Address getAddress() {
+		return address;
+	}
+
+	public void setAddress(Address address) {
+		this.address = address;
+	}
+
+	public Classification getClassification() {
+		return classification;
+	}
+
+	public void setClassification(Classification classification) {
+		this.classification = classification;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/hql/Zoo.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Car.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Car.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Car.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+  This mapping demonstrates the use of
+  the EJB3 compliant table hilo generator
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.id">
+
+    <class name="Car">
+    
+    	<id name="id">
+    		<generator class="org.hibernate.id.MultipleHiLoPerTableGenerator">
+				<param name="max_lo">0</param>
+ 			</generator>
+    	</id>
+        <property name="color"/>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Car.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Car.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Car.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Car.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,26 @@
+//$Id: Car.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Car {
+	private Long id;
+	private String color;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getColor() {
+		return color;
+	}
+
+	public void setColor(String color) {
+		this.color = color;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Car.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/MultipleHiLoPerTableGeneratorTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/MultipleHiLoPerTableGeneratorTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/MultipleHiLoPerTableGeneratorTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,107 @@
+//$Id: MultipleHiLoPerTableGeneratorTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.id;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class MultipleHiLoPerTableGeneratorTest extends FunctionalTestCase {
+	public MultipleHiLoPerTableGeneratorTest(String x) {
+		super(x);
+	}
+
+	public String[] getMappings() {
+		return new String[]{ "id/Car.hbm.xml", "id/Plane.hbm.xml", "id/Radio.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( MultipleHiLoPerTableGeneratorTest.class );
+	}
+
+	public void testDistinctId() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		int testLength = 8;
+		Car[] cars = new Car[testLength];
+		Plane[] planes = new Plane[testLength];
+		for (int i = 0; i < testLength ; i++) {
+			cars[i] = new Car();
+			cars[i].setColor("Color" + i);
+			planes[i] = new Plane();
+			planes[i].setNbrOfSeats(i);
+			s.persist(cars[i]);
+			//s.persist(planes[i]);
+		}
+		tx.commit();
+		s.close();
+		for (int i = 0; i < testLength ; i++) {
+			assertEquals(i+1, cars[i].getId().intValue());
+			//assertEquals(i+1, planes[i].getId().intValue());
+		}
+		
+		s = openSession();
+		tx = s.beginTransaction();
+		s.createQuery( "delete from Car" ).executeUpdate();
+		tx.commit();
+		s.close();
+	}
+
+	public void testRollingBack() throws Throwable {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		int testLength = 3;
+		Long lastId = null;
+		for (int i = 0; i < testLength ; i++) {
+			Car car = new Car();
+			car.setColor( "color " + i );
+			s.save( car );
+			lastId = car.getId();
+		}
+		tx.rollback();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		Car car = new Car();
+		car.setColor( "blue" );
+		s.save( car );
+		s.flush();
+		tx.commit();
+		s.close();
+
+		assertEquals( "id generation was rolled back", lastId.longValue() + 1, car.getId().longValue() );
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.createQuery( "delete Car" ).executeUpdate();
+		tx.commit();
+		s.close();
+	}
+
+	public void testAllParams() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Radio radio = new Radio();
+		radio.setFrequency("32 MHz");
+		s.persist(radio);
+		assertEquals( new Integer(1), radio.getId() );
+		radio = new Radio();
+		radio.setFrequency("32 MHz");
+		s.persist(radio);
+		assertEquals( new Integer(2), radio.getId() );
+		tx.commit();
+		s.close();
+		
+		s = openSession();
+		tx = s.beginTransaction();
+		s.createQuery( "delete from Radio" ).executeUpdate();
+		tx.commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/MultipleHiLoPerTableGeneratorTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Plane.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Plane.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Plane.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+  This mapping demonstrates the use of
+  the EJB3 compliant table hilo generator
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.id">
+
+    <class name="Plane">
+    
+    	<id name="id">
+    		<generator class="org.hibernate.id.MultipleHiLoPerTableGenerator">
+				<param name="max_lo">2</param>
+ 			</generator>
+    	</id>
+        <property name="nbrOfSeats"/>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Plane.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Plane.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Plane.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Plane.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,26 @@
+//$Id: Plane.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Plane {
+	private Long id;
+	private int nbrOfSeats;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public int getNbrOfSeats() {
+		return nbrOfSeats;
+	}
+
+	public void setNbrOfSeats(int nbrOfSeats) {
+		this.nbrOfSeats = nbrOfSeats;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Plane.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Product.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Product.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Product.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.id">
+
+	<class name="Product" table="t_product">
+		<id name="name">
+            <generator class="uuid"/>
+        </id>
+	</class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Product.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Product.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Product.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Product.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,17 @@
+//$Id: $
+package org.hibernate.test.id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Product {
+	private String name;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Product.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Radio.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Radio.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Radio.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+  This mapping demonstrates the use of
+  the EJB3 compliant table hilo generator
+  with all the parameters
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.id">
+
+    <class name="Radio">
+    
+    	<id name="id">
+    		<generator class="org.hibernate.id.MultipleHiLoPerTableGenerator">
+				<param name="table">sequences</param>
+				<param name="value_column">hi_value</param>
+                <param name="primary_key_column">name</param>
+				<param name="primary_key_length">50</param>
+				<param name="max_lo">2</param>
+				<param name="primary_key_value">Radio</param>
+ 			</generator>
+    	</id>
+        <property name="frequency"/>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Radio.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Radio.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Radio.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Radio.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,26 @@
+//$Id: Radio.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Radio {
+	private Integer id;
+	private String frequency;
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getFrequency() {
+		return frequency;
+	}
+
+	public void setFrequency(String frequency) {
+		this.frequency = frequency;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/Radio.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/UseIdentifierRollbackTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/UseIdentifierRollbackTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/UseIdentifierRollbackTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,45 @@
+//$Id: $
+package org.hibernate.test.id;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class UseIdentifierRollbackTest extends FunctionalTestCase {
+	public UseIdentifierRollbackTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "id/Product.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setProperty( Environment.USE_IDENTIFIER_ROLLBACK, "true");
+		super.configure( cfg );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( UseIdentifierRollbackTest.class );
+	}
+
+	public void testSimpleRollback() {
+		Session session = openSession();
+		Transaction t = session.beginTransaction();
+		Product prod = new Product();
+		assertNull( prod.getName() );
+		session.persist(prod);
+		session.flush();
+		assertNotNull( prod.getName() );
+		t.rollback();
+		session.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/UseIdentifierRollbackTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/sqlrep/Node.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/sqlrep/Node.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/sqlrep/Node.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,40 @@
+<?xml version="1.0"?>
+<!--
+  ~ Hibernate, Relational Persistence for Idiomatic Java
+  ~
+  ~ Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+  ~ indicated by the @author tags or express copyright attribution
+  ~ statements applied by the authors.  All third-party contributions are
+  ~ distributed under license by Red Hat Inc.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, as published by the Free Software Foundation.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  ~ or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+  ~ for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public License
+  ~ along with this distribution; if not, write to:
+  ~ Free Software Foundation, Inc.
+  ~ 51 Franklin Street, Fifth Floor
+  ~ Boston, MA  02110-1301  USA
+  -->
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.id.uuid.sqlrep">
+
+    <class name="Node">
+    
+    	<id name="id">
+    		<generator class="uuid2"/>
+    	</id>
+        <property name="name"/>
+        <many-to-one name="parent"/>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/sqlrep/Node.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/sqlrep/Node.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/sqlrep/Node.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/sqlrep/Node.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,73 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.id.uuid.sqlrep;
+
+import java.util.UUID;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class Node {
+	private UUID id;
+	private String name;
+	private Node parent;
+
+	public Node() {
+	}
+
+	public Node(String name) {
+		this.name = name;
+	}
+
+	public Node(String name, Node parent) {
+		this.name = name;
+		this.parent = parent;
+	}
+
+	public UUID getId() {
+		return id;
+	}
+
+	public void setId(UUID id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Node getParent() {
+		return parent;
+	}
+
+	public void setParent(Node parent) {
+		this.parent = parent;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/sqlrep/Node.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/sqlrep/sqlbinary/UUIDBinaryTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/sqlrep/sqlbinary/UUIDBinaryTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/sqlrep/sqlbinary/UUIDBinaryTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,81 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.id.uuid.sqlrep.sqlbinary;
+
+import org.hibernate.Session;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.test.id.uuid.sqlrep.Node;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class UUIDBinaryTest extends FunctionalTestCase {
+	public UUIDBinaryTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "id/uuid/sqlrep/Node.hbm.xml" };
+	}
+
+	public void testUsage() {
+		Session session = openSession();
+		session.beginTransaction();
+		Node root = new Node( "root" );
+		session.save( root );
+		assertNotNull( root.getId() );
+		Node child = new Node( "child", root );
+		session.save( child );
+		assertNotNull( child.getId() );
+		session.getTransaction().commit();
+		session.close();
+
+		session = openSession();
+		session.beginTransaction();
+		Node node = (Node) session.get( Node.class, root.getId() );
+		assertNotNull( node );
+		node = (Node) session.get( Node.class, child.getId() );
+		assertNotNull( node );
+		session.getTransaction().commit();
+		session.close();
+
+		session = openSession();
+		session.beginTransaction();
+		// test joining
+		node = (Node) session.createQuery( "from Node n join fetch n.parent where n.parent is not null" ).uniqueResult();
+		assertNotNull( node );
+		assertNotNull( node.getParent() );
+		session.getTransaction().commit();
+		session.close();
+
+		session = openSession();
+		session.beginTransaction();
+		session.delete( child );
+		session.delete( root );
+		session.getTransaction().commit();
+		session.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/sqlrep/sqlbinary/UUIDBinaryTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/sqlrep/sqlchar/UUIDCharTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/sqlrep/sqlchar/UUIDCharTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/sqlrep/sqlchar/UUIDCharTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,51 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.id.uuid.sqlrep.sqlchar;
+
+import org.hibernate.cfg.Configuration;
+import org.hibernate.test.id.uuid.sqlrep.sqlbinary.UUIDBinaryTest;
+import org.hibernate.type.UUIDCharType;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class UUIDCharTest extends UUIDBinaryTest {
+	public UUIDCharTest(String string) {
+		super( string );
+	}
+
+	@Override
+	public void configure(Configuration cfg) {
+		cfg.registerTypeOverride(
+				new UUIDCharType() {
+					@Override
+					protected boolean registerUnderJavaType() {
+						return true;
+					}
+				}
+		);
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/sqlrep/sqlchar/UUIDCharTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/strategy/CustomStrategyTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/strategy/CustomStrategyTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/strategy/CustomStrategyTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,60 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.id.uuid.strategy;
+
+import org.hibernate.Session;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class CustomStrategyTest extends FunctionalTestCase {
+	public CustomStrategyTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "id/uuid/strategy/Node.hbm.xml" };
+	}
+
+	public void testUsage() {
+		Session session = openSession();
+		session.beginTransaction();
+		Node node = new Node();
+		session.save( node );
+		assertNotNull( node.getId() );
+		assertEquals( 2, node.getId().variant() );
+		assertEquals( 1, node.getId().version() );
+		session.getTransaction().commit();
+		session.close();
+
+		session = openSession();
+		session.beginTransaction();
+		session.delete( node );
+		session.getTransaction().commit();
+		session.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/strategy/CustomStrategyTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/strategy/Node.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/strategy/Node.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/strategy/Node.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,42 @@
+<?xml version="1.0"?>
+<!--
+  ~ Hibernate, Relational Persistence for Idiomatic Java
+  ~
+  ~ Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+  ~ indicated by the @author tags or express copyright attribution
+  ~ statements applied by the authors.  All third-party contributions are
+  ~ distributed under license by Red Hat Inc.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, as published by the Free Software Foundation.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  ~ or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+  ~ for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public License
+  ~ along with this distribution; if not, write to:
+  ~ Free Software Foundation, Inc.
+  ~ 51 Franklin Street, Fifth Floor
+  ~ Boston, MA  02110-1301  USA
+  -->
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.id.uuid.strategy">
+
+    <class name="Node">
+    
+    	<id name="id">
+    		<generator class="uuid2">
+                <!-- the "standard random" strategy gets tested in the other id.uuid tests -->
+                <param name="uuid_gen_strategy_class">org.hibernate.id.uuid.CustomVersionOneStrategy</param>
+    		</generator>
+    	</id>
+        <property name="name"/>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/strategy/Node.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/strategy/Node.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/strategy/Node.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/strategy/Node.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,59 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.id.uuid.strategy;
+
+import java.util.UUID;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class Node {
+	private UUID id;
+	private String name;
+
+	public Node() {
+	}
+
+	public Node(String name) {
+		this.name = name;
+	}
+
+	public UUID getId() {
+		return id;
+	}
+
+	public void setId(UUID id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/id/uuid/strategy/Node.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idbag/Group.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idbag/Group.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idbag/Group.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,24 @@
+//$Id: Group.java 6058 2005-03-11 17:05:19Z oneovthafew $
+package org.hibernate.test.idbag;
+
+/**
+ * @author Gavin King
+ */
+public class Group {
+	private String name;
+	
+	Group() {}
+	
+	public Group(String name) {
+		this.name = name;
+	}
+	
+	public String getName() {
+		return name;
+	}
+	
+	void setName(String name) {
+		this.name = name;
+	}
+	
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idbag/Group.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idbag/IdBagTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idbag/IdBagTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idbag/IdBagTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,101 @@
+//$Id: IdBagTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.idbag;
+
+import java.sql.SQLException;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class IdBagTest extends FunctionalTestCase {
+	
+	public IdBagTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "idbag/UserGroup.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( IdBagTest.class );
+	}
+
+	public void testUpdateIdBag() throws HibernateException, SQLException {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		User gavin = new User("gavin");
+		Group admins = new Group("admins");
+		Group plebs = new Group("plebs");
+		Group moderators = new Group("moderators");
+		Group banned = new Group("banned");
+		gavin.getGroups().add(plebs);
+		//gavin.getGroups().add(moderators);
+		s.persist(gavin);
+		s.persist(plebs);
+		s.persist(admins);
+		s.persist(moderators);
+		s.persist(banned);
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		gavin = (User) s.createCriteria(User.class).uniqueResult();
+		admins = (Group) s.load(Group.class, "admins");
+		plebs = (Group) s.load(Group.class, "plebs");
+		banned = (Group) s.load(Group.class, "banned");
+		gavin.getGroups().add(admins);
+		gavin.getGroups().remove(plebs);
+		//gavin.getGroups().add(banned);
+
+		s.delete(plebs);
+		s.delete(banned);
+		s.delete(moderators);
+		s.delete(admins);
+		s.delete(gavin);
+		
+		t.commit();
+		s.close();		
+	}
+	
+	public void testJoin() throws HibernateException, SQLException {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		User gavin = new User("gavin");
+		Group admins = new Group("admins");
+		Group plebs = new Group("plebs");
+		gavin.getGroups().add(plebs);
+		gavin.getGroups().add(admins);
+		s.persist(gavin);
+		s.persist(plebs);
+		s.persist(admins);
+		
+		List l = s.createQuery("from User u join u.groups g").list();
+		assertEquals( l.size(), 2 );
+		s.clear();
+		
+		gavin = (User) s.createQuery("from User u join fetch u.groups").uniqueResult();
+		assertTrue( Hibernate.isInitialized( gavin.getGroups() ) );
+		assertEquals( gavin.getGroups().size(), 2 );
+		assertEquals( ( (Group) gavin.getGroups().get(0) ).getName(), "admins" );
+		
+		s.delete( gavin.getGroups().get(0) );
+		s.delete( gavin.getGroups().get(1) );
+		s.delete(gavin);
+		
+		t.commit();
+		s.close();		
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idbag/IdBagTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idbag/User.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idbag/User.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idbag/User.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,37 @@
+//$Id: User.java 6058 2005-03-11 17:05:19Z oneovthafew $
+package org.hibernate.test.idbag;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Gavin King
+ */
+public class User {
+	private String name;
+	private List groups = new ArrayList();
+	
+	User() {}
+	
+	public User(String name) {
+		this.name = name;
+	}
+
+	public String getName() {
+		return name;
+	}
+	
+
+	void setName(String name) {
+		this.name = name;
+	}
+
+	public List getGroups() {
+		return groups;
+	}
+	
+	void setGroups(List groups) {
+		this.groups = groups;
+	}
+	
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idbag/User.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idbag/UserGroup.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idbag/UserGroup.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idbag/UserGroup.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,38 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+  This mapping demonstrates how to use an idbag to represent
+  a many-to-many association where the association table has
+  a surrogate key.
+     
+-->
+
+<hibernate-mapping package="org.hibernate.test.idbag">
+	
+	<class name="User" table="`Users`">
+		<id name="name"/>
+		
+		<idbag name="groups" 
+				order-by="groupName asc" 
+				table="`UserGroups`">
+			<collection-id column="userGroupId" 
+					type="long">
+				<generator class="increment"/>
+			</collection-id>
+			<key column="userName"/>
+			<many-to-many column="groupName" 
+					class="Group"/>
+		</idbag>
+		
+	</class>
+	
+	<class name="Group" table="`Groups`">
+		<id name="name"/>
+	</class>
+	
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idbag/UserGroup.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idclass/Customer.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idclass/Customer.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idclass/Customer.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+  This mapping demonstrates how to use an id class not
+  embedded in the entity. Only the property values are
+  shared between the 2. This mimic the EJB2.1 and EJB3
+  semantic.
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.idclass">
+	
+	<class name="Customer">
+		<composite-id class="CustomerId" mapped="true">
+			<key-property name="orgName" column="org_name"/>
+			<key-property name="customerName" column="cust_name"/>
+		</composite-id>
+        <discriminator column="disc"/>
+        <property name="address"/>
+		<subclass name="FavoriteCustomer"/>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idclass/Customer.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idclass/Customer.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idclass/Customer.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idclass/Customer.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,90 @@
+//$Id: Customer.java 7858 2005-08-11 21:46:58Z epbernard $
+
+package org.hibernate.test.idclass;
+
+
+
+
+
+public class Customer {
+
+
+
+	public Customer() {
+
+		super();
+
+	}
+
+
+
+	public Customer(String orgName, String custName, String add) {
+
+		this.orgName = orgName;
+
+		this.customerName = custName;
+
+		this.address = add;
+
+	}
+
+
+
+	private String orgName;
+
+	private String customerName;
+
+	private String address;
+
+
+
+	public String getAddress() {
+
+		return address;
+
+	}
+
+
+
+	public void setAddress(String address) {
+
+		this.address = address;
+
+	}
+
+
+
+	public String getCustomerName() {
+
+		return customerName;
+
+	}
+
+
+
+	public void setCustomerName(String customerName) {
+
+		this.customerName = customerName;
+
+	}
+
+
+
+	public String getOrgName() {
+
+		return orgName;
+
+	}
+
+
+
+	public void setOrgName(String orgName) {
+
+		this.orgName = orgName;
+
+	}
+
+
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idclass/Customer.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idclass/CustomerId.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idclass/CustomerId.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idclass/CustomerId.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,36 @@
+//$Id: CustomerId.java 7239 2005-06-20 09:44:54Z oneovthafew $
+package org.hibernate.test.idclass;
+
+import java.io.Serializable;
+
+public class CustomerId implements Serializable {
+	
+	private String orgName;
+	private String customerName;
+
+	public CustomerId() {
+		super();
+	}
+
+	public CustomerId(String orgName, String custName) {
+		this.orgName = orgName;
+		this.customerName = custName;
+	}
+
+	public String getCustomerName() {
+		return customerName;
+	}
+
+	public void setCustomerName(String customerName) {
+		this.customerName = customerName;
+	}
+
+	public String getOrgName() {
+		return orgName;
+	}
+
+	public void setOrgName(String orgName) {
+		this.orgName = orgName;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idclass/CustomerId.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idclass/FavoriteCustomer.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idclass/FavoriteCustomer.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idclass/FavoriteCustomer.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,14 @@
+//$Id: FavoriteCustomer.java 7858 2005-08-11 21:46:58Z epbernard $
+package org.hibernate.test.idclass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class FavoriteCustomer extends Customer {
+	public FavoriteCustomer() {
+	}
+
+	public FavoriteCustomer(String orgName, String custName, String add) {
+		super( orgName, custName, add );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idclass/FavoriteCustomer.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idclass/IdClassTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idclass/IdClassTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idclass/IdClassTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,69 @@
+//$Id: IdClassTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.idclass;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class IdClassTest extends FunctionalTestCase {
+	
+	public IdClassTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "idclass/Customer.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( IdClassTest.class );
+	}
+
+	public void testIdClass() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Customer cust = new FavoriteCustomer("JBoss", "RouteOne", "Detroit");
+		s.persist(cust);
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		CustomerId custId = new CustomerId("JBoss", "RouteOne");
+		t = s.beginTransaction();
+		cust = (Customer) s.get(Customer.class, custId);
+		assertEquals( "Detroit", cust.getAddress() );
+		assertEquals( cust.getCustomerName(), custId.getCustomerName() );
+		assertEquals( cust.getOrgName(), custId.getOrgName() );
+		t.commit();
+		s.close();		
+
+		s = openSession();
+		t = s.beginTransaction();
+		cust = (Customer) s.createQuery("from Customer where id.customerName = 'RouteOne'").uniqueResult();
+		assertEquals( "Detroit", cust.getAddress() );
+		assertEquals( cust.getCustomerName(), custId.getCustomerName() );
+		assertEquals( cust.getOrgName(), custId.getOrgName() );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		cust = (Customer) s.createQuery("from Customer where customerName = 'RouteOne'").uniqueResult();
+		assertEquals( "Detroit", cust.getAddress() );
+		assertEquals( cust.getCustomerName(), custId.getCustomerName() );
+		assertEquals( cust.getOrgName(), custId.getOrgName() );
+		
+		s.createQuery( "delete from Customer" ).executeUpdate();
+		
+		t.commit();
+		s.close();
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idclass/IdClassTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/biginteger/increment/BigIntegerIncrementGeneratorTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/biginteger/increment/BigIntegerIncrementGeneratorTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/biginteger/increment/BigIntegerIncrementGeneratorTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,73 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.idgen.biginteger.increment;
+
+import java.math.BigInteger;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class BigIntegerIncrementGeneratorTest extends FunctionalTestCase {
+	public BigIntegerIncrementGeneratorTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "idgen/biginteger/increment/Mapping.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( BigIntegerIncrementGeneratorTest.class );
+	}
+
+	public void testBasics() {
+		Session s = openSession();
+		s.beginTransaction();
+		Entity entity = new Entity( "BigInteger + increment #1" );
+		s.save( entity );
+		Entity entity2 = new Entity( "BigInteger + increment #2" );
+		s.save( entity2 );
+		s.getTransaction().commit();
+		s.close();
+
+		assertEquals( BigInteger.valueOf( 1 ), entity.getId() );
+		assertEquals( BigInteger.valueOf( 2 ), entity2.getId() );
+
+		s = openSession();
+		s.beginTransaction();
+		s.delete( entity );
+		s.delete( entity2 );
+		s.getTransaction().commit();
+		s.close();
+
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/biginteger/increment/BigIntegerIncrementGeneratorTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/biginteger/increment/Entity.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/biginteger/increment/Entity.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/biginteger/increment/Entity.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,59 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.idgen.biginteger.increment;
+
+import java.math.BigInteger;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class Entity {
+	private BigInteger id;
+	private String name;
+
+	public Entity() {
+	}
+
+	public Entity(String name) {
+		this.name = name;
+	}
+
+	public BigInteger getId() {
+		return id;
+	}
+
+	public void setId(BigInteger id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/biginteger/increment/Entity.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/biginteger/increment/Mapping.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/biginteger/increment/Mapping.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/biginteger/increment/Mapping.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,42 @@
+<?xml version="1.0"?>
+<!--
+  ~ Hibernate, Relational Persistence for Idiomatic Java
+  ~
+  ~ Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+  ~ indicated by the @author tags or express copyright attribution
+  ~ statements applied by the authors.  All third-party contributions are
+  ~ distributed under license by Red Hat Inc.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, as published by the Free Software Foundation.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  ~ or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+  ~ for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public License
+  ~ along with this distribution; if not, write to:
+  ~ Free Software Foundation, Inc.
+  ~ 51 Franklin Street, Fifth Floor
+  ~ Boston, MA  02110-1301  USA
+  -->
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+    Demonstrates use of simple increment generator on a BigInteger property.
+-->
+
+<hibernate-mapping package="org.hibernate.test.idgen.biginteger.increment">
+
+    <class name="Entity">
+        <id name="id" column="ID" type="big_integer">
+            <generator class="increment" />
+        </id>
+        <property name="name" type="string"/>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/biginteger/increment/Mapping.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/biginteger/sequence/BigIntegerSequenceGeneratorTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/biginteger/sequence/BigIntegerSequenceGeneratorTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/biginteger/sequence/BigIntegerSequenceGeneratorTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,79 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.idgen.biginteger.sequence;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.testing.junit.functional.DatabaseSpecificFunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class BigIntegerSequenceGeneratorTest extends DatabaseSpecificFunctionalTestCase {
+	public BigIntegerSequenceGeneratorTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "idgen/biginteger/sequence/Mapping.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( BigIntegerSequenceGeneratorTest.class );
+	}
+
+	@Override
+	public boolean appliesTo(Dialect dialect) {
+		return dialect.supportsSequences();
+	}
+
+	public void testBasics() {
+		Session s = openSession();
+		s.beginTransaction();
+		Entity entity = new Entity( "BigInteger + sequence #1" );
+		s.save( entity );
+		Entity entity2 = new Entity( "BigInteger + sequence #2" );
+		s.save( entity2 );
+		s.getTransaction().commit();
+		s.close();
+
+// hsqldb defines different behavior for the initial select from a sequence
+// then say oracle
+//		assertEquals( BigInteger.valueOf( 1 ), entity.getId() );
+//		assertEquals( BigInteger.valueOf( 2 ), entity2.getId() );
+
+		s = openSession();
+		s.beginTransaction();
+		s.delete( entity );
+		s.delete( entity2 );
+		s.getTransaction().commit();
+		s.close();
+
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/biginteger/sequence/BigIntegerSequenceGeneratorTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/biginteger/sequence/Entity.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/biginteger/sequence/Entity.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/biginteger/sequence/Entity.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,59 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.idgen.biginteger.sequence;
+
+import java.math.BigInteger;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class Entity {
+	private BigInteger id;
+	private String name;
+
+	public Entity() {
+	}
+
+	public Entity(String name) {
+		this.name = name;
+	}
+
+	public BigInteger getId() {
+		return id;
+	}
+
+	public void setId(BigInteger id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/biginteger/sequence/Entity.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/biginteger/sequence/Mapping.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/biginteger/sequence/Mapping.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/biginteger/sequence/Mapping.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,43 @@
+<?xml version="1.0"?>
+<!--
+  ~ Hibernate, Relational Persistence for Idiomatic Java
+  ~
+  ~ Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+  ~ indicated by the @author tags or express copyright attribution
+  ~ statements applied by the authors.  All third-party contributions are
+  ~ distributed under license by Red Hat Inc.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, as published by the Free Software Foundation.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  ~ or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+  ~ for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public License
+  ~ along with this distribution; if not, write to:
+  ~ Free Software Foundation, Inc.
+  ~ 51 Franklin Street, Fifth Floor
+  ~ Boston, MA  02110-1301  USA
+  -->
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+    Demonstrates use of a sequence generator on a BigInteger property.
+-->
+
+<hibernate-mapping package="org.hibernate.test.idgen.biginteger.sequence">
+
+    <class name="Entity">
+        <id name="id" column="ID" type="big_integer">
+            <generator class="sequence">
+            </generator>
+        </id>
+        <property name="name" type="string"/>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/biginteger/sequence/Mapping.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/forcedtable/Basic.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/forcedtable/Basic.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/forcedtable/Basic.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+    Demonstrates use of the enhanced sequence-based identifier
+    generator, with no performance optimizations (the DB is hit
+    everytime when generating a value).
+-->
+
+<hibernate-mapping package="org.hibernate.test.idgen.enhanced.forcedtable">
+
+    <class name="Entity" table="ID_SEQ_TBL_BSC_ENTITY">
+        <id name="id" column="ID" type="long">
+            <generator class="org.hibernate.id.enhanced.SequenceStyleGenerator">
+                <param name="table_name">ID_SEQ_TBL_BSC_SEQ</param>
+                <param name="value_column">hi_val</param>
+                <param name="initial_value">1</param>
+                <param name="increment_size">1</param>
+                <param name="optimizer">none</param>
+                <param name="force_table_use">true</param>
+            </generator>
+        </id>
+        <property name="name" type="string"/>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/forcedtable/Basic.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/forcedtable/BasicForcedTableSequenceTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/forcedtable/BasicForcedTableSequenceTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/forcedtable/BasicForcedTableSequenceTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,72 @@
+package org.hibernate.test.idgen.enhanced.forcedtable;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.id.enhanced.OptimizerFactory;
+import org.hibernate.id.enhanced.SequenceStyleGenerator;
+import org.hibernate.id.enhanced.TableStructure;
+import org.hibernate.testing.junit.functional.DatabaseSpecificFunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.persister.entity.EntityPersister;
+
+import static org.hibernate.id.IdentifierGeneratorHelper.BasicHolder;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class BasicForcedTableSequenceTest extends DatabaseSpecificFunctionalTestCase {
+	public BasicForcedTableSequenceTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "idgen/enhanced/forcedtable/Basic.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( BasicForcedTableSequenceTest.class );
+	}
+
+	public void testNormalBoundary() {
+		EntityPersister persister = sfi().getEntityPersister( Entity.class.getName() );
+		assertTrue(
+				"sequence style generator was not used",
+				SequenceStyleGenerator.class.isInstance( persister.getIdentifierGenerator() )
+		);
+		SequenceStyleGenerator generator = ( SequenceStyleGenerator ) persister.getIdentifierGenerator();
+		assertTrue(
+				"table structure was not used",
+				TableStructure.class.isInstance( generator.getDatabaseStructure() )
+		);
+		assertTrue(
+				"no-op optimizer was not used",
+				OptimizerFactory.NoopOptimizer.class.isInstance( generator.getOptimizer() )
+		);
+
+		int count = 5;
+		Entity[] entities = new Entity[count];
+		Session s = openSession();
+		s.beginTransaction();
+		for ( int i = 0; i < count; i++ ) {
+			entities[i] = new Entity( "" + ( i + 1 ) );
+			s.save( entities[i] );
+			long expectedId = i + 1;
+			assertEquals( expectedId, entities[i].getId().longValue() );
+			assertEquals( expectedId, generator.getDatabaseStructure().getTimesAccessed() );
+			assertEquals( expectedId, ( (BasicHolder) generator.getOptimizer().getLastSourceValue() ).getActualLongValue() );
+		}
+		s.getTransaction().commit();
+
+		s.beginTransaction();
+		for ( int i = 0; i < count; i++ ) {
+			assertEquals( i + 1, entities[i].getId().intValue() );
+			s.delete( entities[i] );
+		}
+		s.getTransaction().commit();
+		s.close();
+
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/forcedtable/BasicForcedTableSequenceTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/forcedtable/Entity.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/forcedtable/Entity.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/forcedtable/Entity.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,34 @@
+package org.hibernate.test.idgen.enhanced.forcedtable;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class Entity {
+	private Long id;
+	private String name;
+
+	public Entity() {
+	}
+
+	public Entity(String name) {
+		this.name = name;
+	}
+
+	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;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/forcedtable/Entity.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/forcedtable/HiLo.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/forcedtable/HiLo.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/forcedtable/HiLo.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+    Demonstrates use of the enhanced table-based identifier
+    generator, using a hilo algorithm as the optimization (to
+    avoid hitting the database to generate each value).
+-->
+
+<hibernate-mapping package="org.hibernate.test.idgen.enhanced.forcedtable">
+
+    <class name="Entity" table="ID_SEQ_TBL_HILO_ENTITY">
+        <id name="id" column="ID" type="long">
+            <generator class="org.hibernate.id.enhanced.SequenceStyleGenerator">
+                <param name="table_name">ID_SEQ_TBL_HILO_SEQ</param>
+                <param name="initial_value">1</param>
+                <param name="increment_size">10</param>
+                <param name="optimizer">hilo</param>
+                <param name="force_table_use">true</param>
+            </generator>
+        </id>
+        <property name="name" type="string"/>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/forcedtable/HiLo.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/forcedtable/HiLoForcedTableSequenceTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/forcedtable/HiLoForcedTableSequenceTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/forcedtable/HiLoForcedTableSequenceTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,82 @@
+package org.hibernate.test.idgen.enhanced.forcedtable;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.id.enhanced.OptimizerFactory;
+import org.hibernate.id.enhanced.SequenceStyleGenerator;
+import org.hibernate.id.enhanced.TableStructure;
+import org.hibernate.testing.junit.functional.DatabaseSpecificFunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.persister.entity.EntityPersister;
+
+import static org.hibernate.id.IdentifierGeneratorHelper.BasicHolder;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class HiLoForcedTableSequenceTest extends DatabaseSpecificFunctionalTestCase {
+	public HiLoForcedTableSequenceTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "idgen/enhanced/forcedtable/HiLo.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( HiLoForcedTableSequenceTest.class );
+	}
+
+	public void testNormalBoundary() {
+		EntityPersister persister = sfi().getEntityPersister( Entity.class.getName() );
+		assertTrue(
+				"sequence style generator was not used",
+				SequenceStyleGenerator.class.isInstance( persister.getIdentifierGenerator() )
+		);
+		SequenceStyleGenerator generator = ( SequenceStyleGenerator ) persister.getIdentifierGenerator();
+		assertTrue(
+				"table structure was not used",
+				TableStructure.class.isInstance( generator.getDatabaseStructure() )
+		);
+		assertTrue(
+				"hilo optimizer was not used",
+				OptimizerFactory.HiLoOptimizer.class.isInstance( generator.getOptimizer() )
+		);
+		OptimizerFactory.HiLoOptimizer optimizer = ( OptimizerFactory.HiLoOptimizer ) generator.getOptimizer();
+
+		int increment = optimizer.getIncrementSize();
+		Entity[] entities = new Entity[ increment + 1 ];
+		Session s = openSession();
+		s.beginTransaction();
+		for ( int i = 0; i < increment; i++ ) {
+			entities[i] = new Entity( "" + ( i + 1 ) );
+			s.save( entities[i] );
+			long expectedId = i + 1;
+			assertEquals( expectedId, entities[i].getId().longValue() );
+			assertEquals( 1, ( (BasicHolder) optimizer.getLastSourceValue() ).getActualLongValue() );
+			assertEquals( i + 1, ( (BasicHolder) optimizer.getLastValue() ).getActualLongValue() );
+			assertEquals( increment + 1, ( (BasicHolder) optimizer.getHiValue() ).getActualLongValue() );
+		}
+		// now force a "clock over"
+		entities[ increment ] = new Entity( "" + increment );
+		s.save( entities[ increment ] );
+		long expectedId = optimizer.getIncrementSize() + 1;
+		assertEquals( expectedId, entities[ optimizer.getIncrementSize() ].getId().longValue() );
+		assertEquals( 2, ( (BasicHolder) optimizer.getLastSourceValue() ).getActualLongValue() ); // initialization + clock-over
+		assertEquals( increment + 1, ( (BasicHolder) optimizer.getLastValue() ).getActualLongValue() );
+		assertEquals( ( increment * 2 ) + 1, ( (BasicHolder) optimizer.getHiValue() ).getActualLongValue() );
+
+		s.getTransaction().commit();
+
+		s.beginTransaction();
+		for ( int i = 0; i < entities.length; i++ ) {
+			assertEquals( i + 1, entities[i].getId().intValue() );
+			s.delete( entities[i] );
+		}
+		s.getTransaction().commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/forcedtable/HiLoForcedTableSequenceTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/forcedtable/Pooled.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/forcedtable/Pooled.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/forcedtable/Pooled.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+    Demonstrates use of the enhanced table-based identifier
+    generator, using a hilo algorithm as the optimization (to
+    avoid hitting the database to generate each value).
+-->
+
+<hibernate-mapping package="org.hibernate.test.idgen.enhanced.forcedtable">
+
+    <class name="Entity" table="ID_SEQ_TBL_POOL_ENTITY">
+        <id name="id" column="ID" type="long">
+            <generator class="org.hibernate.id.enhanced.SequenceStyleGenerator">
+                <param name="table_name">ID_SEQ_TBL_POOL_SEQ</param>
+                <param name="initial_value">1</param>
+                <param name="increment_size">10</param>
+                <param name="optimizer">pooled</param>
+                <param name="force_table_use">true</param>
+            </generator>
+        </id>
+        <property name="name" type="string"/>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/forcedtable/Pooled.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/forcedtable/PooledForcedTableSequenceTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/forcedtable/PooledForcedTableSequenceTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/forcedtable/PooledForcedTableSequenceTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,84 @@
+package org.hibernate.test.idgen.enhanced.forcedtable;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.id.enhanced.OptimizerFactory;
+import org.hibernate.id.enhanced.SequenceStyleGenerator;
+import org.hibernate.id.enhanced.TableStructure;
+import org.hibernate.testing.junit.functional.DatabaseSpecificFunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.persister.entity.EntityPersister;
+
+import static org.hibernate.id.IdentifierGeneratorHelper.BasicHolder;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class PooledForcedTableSequenceTest extends DatabaseSpecificFunctionalTestCase {
+	public PooledForcedTableSequenceTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "idgen/enhanced/forcedtable/Pooled.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( PooledForcedTableSequenceTest.class );
+	}
+
+	public void testNormalBoundary() {
+		EntityPersister persister = sfi().getEntityPersister( Entity.class.getName() );
+		assertTrue(
+				"sequence style generator was not used",
+				SequenceStyleGenerator.class.isInstance( persister.getIdentifierGenerator() )
+		);
+		SequenceStyleGenerator generator = ( SequenceStyleGenerator ) persister.getIdentifierGenerator();
+		assertTrue(
+				"table structure was not used",
+				TableStructure.class.isInstance( generator.getDatabaseStructure() )
+		);
+		assertTrue(
+				"pooled optimizer was not used",
+				OptimizerFactory.PooledOptimizer.class.isInstance( generator.getOptimizer() )
+		);
+		OptimizerFactory.PooledOptimizer optimizer = ( OptimizerFactory.PooledOptimizer ) generator.getOptimizer();
+
+		int increment = optimizer.getIncrementSize();
+		Entity[] entities = new Entity[ increment + 1 ];
+		Session s = openSession();
+		s.beginTransaction();
+		for ( int i = 0; i < increment; i++ ) {
+			entities[i] = new Entity( "" + ( i + 1 ) );
+			s.save( entities[i] );
+			long expectedId = i + 1;
+			assertEquals( expectedId, entities[i].getId().longValue() );
+			// NOTE : initialization calls table twice
+			assertEquals( 2, generator.getDatabaseStructure().getTimesAccessed() );
+			assertEquals( increment + 1, ( (BasicHolder) optimizer.getLastSourceValue() ).getActualLongValue() );
+			assertEquals( i + 1, ( (BasicHolder) optimizer.getLastValue() ).getActualLongValue() );
+			assertEquals( increment + 1, ( (BasicHolder) optimizer.getLastSourceValue() ).getActualLongValue() );
+		}
+		// now force a "clock over"
+		entities[ increment ] = new Entity( "" + increment );
+		s.save( entities[ increment ] );
+		long expectedId = optimizer.getIncrementSize() + 1;
+		assertEquals( expectedId, entities[ optimizer.getIncrementSize() ].getId().longValue() );
+		// initialization (2) + clock over
+		assertEquals( 3, generator.getDatabaseStructure().getTimesAccessed() );
+		assertEquals( ( increment * 2 ) + 1, ( (BasicHolder) optimizer.getLastSourceValue() ).getActualLongValue() );
+		assertEquals( increment + 1, ( (BasicHolder) optimizer.getLastValue() ).getActualLongValue() );
+		s.getTransaction().commit();
+
+		s.beginTransaction();
+		for ( int i = 0; i < entities.length; i++ ) {
+			assertEquals( i + 1, entities[i].getId().intValue() );
+			s.delete( entities[i] );
+		}
+		s.getTransaction().commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/forcedtable/PooledForcedTableSequenceTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/sequence/Basic.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/sequence/Basic.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/sequence/Basic.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+    Demonstrates use of the enhanced sequence-based identifier
+    generator, with no performance optimizations (the DB is hit
+    everytime when generating a value).
+-->
+
+<hibernate-mapping package="org.hibernate.test.idgen.enhanced.sequence">
+
+    <class name="Entity" table="ID_SEQ_BSC_ENTITY">
+        <id name="id" column="ID" type="long">
+            <generator class="org.hibernate.id.enhanced.SequenceStyleGenerator">
+                <param name="sequence_name">ID_SEQ_BSC_SEQ</param>
+                <param name="initial_value">1</param>
+                <param name="increment_size">1</param>
+                <param name="optimizer">none</param>
+            </generator>
+        </id>
+        <property name="name" type="string"/>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/sequence/Basic.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/sequence/BasicSequenceTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/sequence/BasicSequenceTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/sequence/BasicSequenceTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,59 @@
+package org.hibernate.test.idgen.enhanced.sequence;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.Session;
+import org.hibernate.id.enhanced.SequenceStyleGenerator;
+import org.hibernate.persister.entity.EntityPersister;
+
+import static org.hibernate.id.IdentifierGeneratorHelper.BasicHolder;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class BasicSequenceTest extends FunctionalTestCase {
+	public BasicSequenceTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "idgen/enhanced/sequence/Basic.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( BasicSequenceTest.class );
+	}
+
+	public void testNormalBoundary() {
+		EntityPersister persister = sfi().getEntityPersister( Entity.class.getName() );
+		assertClassAssignability( SequenceStyleGenerator.class, persister.getIdentifierGenerator().getClass() );
+		SequenceStyleGenerator generator = ( SequenceStyleGenerator ) persister.getIdentifierGenerator();
+
+		int count = 5;
+		Entity[] entities = new Entity[count];
+		Session s = openSession();
+		s.beginTransaction();
+		for ( int i = 0; i < count; i++ ) {
+			entities[i] = new Entity( "" + ( i + 1 ) );
+			s.save( entities[i] );
+			long expectedId = i + 1;
+			assertEquals( expectedId, entities[i].getId().longValue() );
+			assertEquals( expectedId, generator.getDatabaseStructure().getTimesAccessed() );
+			assertEquals( expectedId, ( (BasicHolder) generator.getOptimizer().getLastSourceValue() ).getActualLongValue() );
+		}
+		s.getTransaction().commit();
+
+		s.beginTransaction();
+		for ( int i = 0; i < count; i++ ) {
+			assertEquals( i + 1, entities[i].getId().intValue() );
+			s.delete( entities[i] );
+		}
+		s.getTransaction().commit();
+		s.close();
+
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/sequence/BasicSequenceTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/sequence/Entity.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/sequence/Entity.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/sequence/Entity.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,34 @@
+package org.hibernate.test.idgen.enhanced.sequence;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class Entity {
+	private Long id;
+	private String name;
+
+	public Entity() {
+	}
+
+	public Entity(String name) {
+		this.name = name;
+	}
+
+	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;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/sequence/Entity.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/sequence/HiLo.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/sequence/HiLo.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/sequence/HiLo.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+    Demonstrates use of the enhanced sequence-based identifier
+    generator, using a hilo algorithm as the optimization (to
+    avoid hitting the database to generate each value).
+-->
+
+<hibernate-mapping package="org.hibernate.test.idgen.enhanced.sequence">
+
+    <class name="Entity" table="ID_SEQ_HILO_ENTITY">
+        <id name="id" column="ID" type="long">
+            <generator class="org.hibernate.id.enhanced.SequenceStyleGenerator">
+                <param name="sequence_name">ID_SEQ_HILO_SEQ</param>
+                <param name="initial_value">1</param>
+                <param name="increment_size">10</param>
+                <param name="optimizer">hilo</param>
+            </generator>
+        </id>
+        <property name="name" type="string"/>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/sequence/HiLo.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/sequence/HiLoSequenceTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/sequence/HiLoSequenceTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/sequence/HiLoSequenceTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,70 @@
+package org.hibernate.test.idgen.enhanced.sequence;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.Session;
+import org.hibernate.id.enhanced.OptimizerFactory;
+import org.hibernate.id.enhanced.SequenceStyleGenerator;
+import org.hibernate.persister.entity.EntityPersister;
+
+import static org.hibernate.id.IdentifierGeneratorHelper.BasicHolder;
+
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class HiLoSequenceTest extends FunctionalTestCase {
+	public HiLoSequenceTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "idgen/enhanced/sequence/HiLo.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( HiLoSequenceTest.class );
+	}
+
+	public void testNormalBoundary() {
+		EntityPersister persister = sfi().getEntityPersister( Entity.class.getName() );
+		assertClassAssignability( SequenceStyleGenerator.class, persister.getIdentifierGenerator().getClass() );
+		SequenceStyleGenerator generator = ( SequenceStyleGenerator ) persister.getIdentifierGenerator();
+		assertClassAssignability( OptimizerFactory.HiLoOptimizer.class, generator.getOptimizer().getClass() );
+		OptimizerFactory.HiLoOptimizer optimizer = ( OptimizerFactory.HiLoOptimizer ) generator.getOptimizer();
+
+		int increment = optimizer.getIncrementSize();
+		Entity[] entities = new Entity[ increment + 1 ];
+		Session s = openSession();
+		s.beginTransaction();
+		for ( int i = 0; i < increment; i++ ) {
+			entities[i] = new Entity( "" + ( i + 1 ) );
+			s.save( entities[i] );
+			assertEquals( 1, generator.getDatabaseStructure().getTimesAccessed() ); // initialization
+			assertEquals( 1, ( (BasicHolder) optimizer.getLastSourceValue() ).getActualLongValue() ); // initialization
+			assertEquals( i + 1, ( (BasicHolder) optimizer.getLastValue() ).getActualLongValue() );
+			assertEquals( increment + 1, ( (BasicHolder) optimizer.getHiValue() ).getActualLongValue() );
+		}
+		// now force a "clock over"
+		entities[ increment ] = new Entity( "" + increment );
+		s.save( entities[ increment ] );
+		assertEquals( 2, generator.getDatabaseStructure().getTimesAccessed() ); // initialization
+		assertEquals( 2, ( (BasicHolder) optimizer.getLastSourceValue() ).getActualLongValue() ); // initialization
+		assertEquals( increment + 1, ( (BasicHolder) optimizer.getLastValue() ).getActualLongValue() );
+		assertEquals( ( increment * 2 ) + 1, ( (BasicHolder) optimizer.getHiValue() ).getActualLongValue() );
+
+		s.getTransaction().commit();
+
+		s.beginTransaction();
+		for ( int i = 0; i < entities.length; i++ ) {
+			assertEquals( i + 1, entities[i].getId().intValue() );
+			s.delete( entities[i] );
+		}
+		s.getTransaction().commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/sequence/HiLoSequenceTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/sequence/Pooled.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/sequence/Pooled.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/sequence/Pooled.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+    Demonstrates use of the enhanced sequence-based identifier
+    generator, using a pooled algorithm as the optimization (to
+    avoid hitting the database to generate each value).
+-->
+
+<hibernate-mapping package="org.hibernate.test.idgen.enhanced.sequence">
+
+    <class name="Entity" table="ID_SEQ_POOL_ENTITY">
+        <id name="id" column="ID" type="long">
+            <generator class="org.hibernate.id.enhanced.SequenceStyleGenerator">
+                <param name="sequence_name">ID_SEQ_POOL_SEQ</param>
+                <param name="initial_value">1</param>
+                <param name="increment_size">10</param>
+                <param name="optimizer">pooled</param>
+            </generator>
+        </id>
+        <property name="name" type="string"/>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/sequence/Pooled.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/sequence/PooledSequenceTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/sequence/PooledSequenceTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/sequence/PooledSequenceTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,67 @@
+package org.hibernate.test.idgen.enhanced.sequence;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.persister.entity.EntityPersister;
+import org.hibernate.id.enhanced.OptimizerFactory;
+import org.hibernate.id.enhanced.SequenceStyleGenerator;
+import org.hibernate.Session;
+
+import static org.hibernate.id.IdentifierGeneratorHelper.BasicHolder;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class PooledSequenceTest extends FunctionalTestCase {
+	public PooledSequenceTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "idgen/enhanced/sequence/Pooled.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( PooledSequenceTest.class );
+	}
+
+	public void testNormalBoundary() {
+		EntityPersister persister = sfi().getEntityPersister( Entity.class.getName() );
+		assertClassAssignability( SequenceStyleGenerator.class, persister.getIdentifierGenerator().getClass() );
+		SequenceStyleGenerator generator = ( SequenceStyleGenerator ) persister.getIdentifierGenerator();
+		assertClassAssignability( OptimizerFactory.PooledOptimizer.class, generator.getOptimizer().getClass() );
+		OptimizerFactory.PooledOptimizer optimizer = ( OptimizerFactory.PooledOptimizer ) generator.getOptimizer();
+
+		int increment = optimizer.getIncrementSize();
+		Entity[] entities = new Entity[ increment + 1 ];
+		Session s = openSession();
+		s.beginTransaction();
+		for ( int i = 0; i < increment; i++ ) {
+			entities[i] = new Entity( "" + ( i + 1 ) );
+			s.save( entities[i] );
+			assertEquals( 2, generator.getDatabaseStructure().getTimesAccessed() ); // initialization calls seq twice
+			assertEquals( increment + 1, ( (BasicHolder) optimizer.getLastSourceValue() ).getActualLongValue() ); // initialization calls seq twice
+			assertEquals( i + 1, ( (BasicHolder) optimizer.getLastValue() ).getActualLongValue() );
+			assertEquals( increment + 1, ( (BasicHolder) optimizer.getLastSourceValue() ).getActualLongValue() );
+		}
+		// now force a "clock over"
+		entities[ increment ] = new Entity( "" + increment );
+		s.save( entities[ increment ] );
+		assertEquals( 3, generator.getDatabaseStructure().getTimesAccessed() ); // initialization (2) + clock over
+		assertEquals( ( increment * 2 ) + 1, ( (BasicHolder) optimizer.getLastSourceValue() ).getActualLongValue() ); // initialization (2) + clock over
+		assertEquals( increment + 1, ( (BasicHolder) optimizer.getLastValue() ).getActualLongValue() );
+		s.getTransaction().commit();
+
+		s.beginTransaction();
+		for ( int i = 0; i < entities.length; i++ ) {
+			assertEquals( i + 1, entities[i].getId().intValue() );
+			s.delete( entities[i] );
+		}
+		s.getTransaction().commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/sequence/PooledSequenceTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/table/Basic.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/table/Basic.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/table/Basic.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.idgen.enhanced.table">
+
+    <identifier-generator name="table" class="org.hibernate.id.enhanced.TableGenerator"/>
+
+    <class name="Entity" table="ID_TBL_BSC_ENTITY">
+        <id name="id" column="ID" type="long">
+            <generator class="table">
+                <param name="table_name">ID_TBL_BSC_TBL</param>
+                <param name="segment_value">test</param>
+                <param name="initial_value">1</param>
+                <param name="increment_size">1</param>
+                <param name="optimizer">none</param>
+            </generator>
+        </id>
+        <property name="name" type="string"/>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/table/Basic.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/table/BasicTableTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/table/BasicTableTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/table/BasicTableTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,59 @@
+package org.hibernate.test.idgen.enhanced.table;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.persister.entity.EntityPersister;
+import org.hibernate.id.enhanced.TableGenerator;
+import org.hibernate.Session;
+
+import static org.hibernate.id.IdentifierGeneratorHelper.BasicHolder;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class BasicTableTest extends FunctionalTestCase {
+	public BasicTableTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "idgen/enhanced/table/Basic.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( BasicTableTest.class );
+	}
+
+	public void testNormalBoundary() {
+		EntityPersister persister = sfi().getEntityPersister( Entity.class.getName() );
+		assertClassAssignability( TableGenerator.class, persister.getIdentifierGenerator().getClass() );
+		TableGenerator generator = ( TableGenerator ) persister.getIdentifierGenerator();
+
+		int count = 5;
+		Entity[] entities = new Entity[count];
+		Session s = openSession();
+		s.beginTransaction();
+		for ( int i = 0; i < count; i++ ) {
+			entities[i] = new Entity( "" + ( i + 1 ) );
+			s.save( entities[i] );
+			long expectedId = i + 1;
+			assertEquals( expectedId, entities[i].getId().longValue() );
+			assertEquals( expectedId, generator.getTableAccessCount() );
+			assertEquals( expectedId, ( (BasicHolder) generator.getOptimizer().getLastSourceValue() ).getActualLongValue() );
+		}
+		s.getTransaction().commit();
+
+		s.beginTransaction();
+		for ( int i = 0; i < count; i++ ) {
+			assertEquals( i + 1, entities[i].getId().intValue() );
+			s.delete( entities[i] );
+		}
+		s.getTransaction().commit();
+		s.close();
+
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/table/BasicTableTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/table/Entity.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/table/Entity.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/table/Entity.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,34 @@
+package org.hibernate.test.idgen.enhanced.table;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class Entity {
+	private Long id;
+	private String name;
+
+	public Entity() {
+	}
+
+	public Entity(String name) {
+		this.name = name;
+	}
+
+	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;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/table/Entity.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/table/HiLo.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/table/HiLo.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/table/HiLo.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.idgen.enhanced.table">
+
+    <identifier-generator name="table" class="org.hibernate.id.enhanced.TableGenerator"/>
+
+    <class name="Entity" table="ID_TBL_HILO_ENTITY">
+        <id name="id" column="ID" type="long">
+            <generator class="table">
+                <param name="table_name">ID_TBL_HILO_TBL</param>
+                <param name="segment_value">test</param>
+                <param name="initial_value">1</param>
+                <param name="increment_size">10</param>
+                <param name="optimizer">hilo</param>
+            </generator>
+        </id>
+        <property name="name" type="string"/>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/table/HiLo.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/table/HiLoTableTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/table/HiLoTableTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/table/HiLoTableTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,69 @@
+package org.hibernate.test.idgen.enhanced.table;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.persister.entity.EntityPersister;
+import org.hibernate.id.enhanced.OptimizerFactory;
+import org.hibernate.id.enhanced.TableGenerator;
+import org.hibernate.Session;
+
+import static org.hibernate.id.IdentifierGeneratorHelper.BasicHolder;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class HiLoTableTest extends FunctionalTestCase {
+	public HiLoTableTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "idgen/enhanced/table/HiLo.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( HiLoTableTest.class );
+	}
+
+	public void testNormalBoundary() {
+		EntityPersister persister = sfi().getEntityPersister( Entity.class.getName() );
+		assertClassAssignability( TableGenerator.class, persister.getIdentifierGenerator().getClass() );
+		TableGenerator generator = ( TableGenerator ) persister.getIdentifierGenerator();
+		assertClassAssignability( OptimizerFactory.HiLoOptimizer.class, generator.getOptimizer().getClass() );
+		OptimizerFactory.HiLoOptimizer optimizer = ( OptimizerFactory.HiLoOptimizer ) generator.getOptimizer();
+
+		int increment = optimizer.getIncrementSize();
+		Entity[] entities = new Entity[ increment + 1 ];
+		Session s = openSession();
+		s.beginTransaction();
+		for ( int i = 0; i < increment; i++ ) {
+			entities[i] = new Entity( "" + ( i + 1 ) );
+			s.save( entities[i] );
+			assertEquals( 1, generator.getTableAccessCount() ); // initialization
+			assertEquals( 1, ( (BasicHolder) optimizer.getLastSourceValue() ).getActualLongValue() ); // initialization
+			assertEquals( i + 1, ( (BasicHolder) optimizer.getLastValue() ).getActualLongValue() );
+			assertEquals( increment + 1, ( (BasicHolder) optimizer.getHiValue() ).getActualLongValue() );
+		}
+		// now force a "clock over"
+		entities[ increment ] = new Entity( "" + increment );
+		s.save( entities[ increment ] );
+		assertEquals( 2, generator.getTableAccessCount() ); // initialization
+		assertEquals( 2, ( (BasicHolder) optimizer.getLastSourceValue() ).getActualLongValue() ); // initialization
+		assertEquals( increment + 1, ( (BasicHolder) optimizer.getLastValue() ).getActualLongValue() );
+		assertEquals( ( increment * 2 ) + 1, ( (BasicHolder) optimizer.getHiValue() ).getActualLongValue() );
+
+		s.getTransaction().commit();
+
+		s.beginTransaction();
+		for ( int i = 0; i < entities.length; i++ ) {
+			assertEquals( i + 1, entities[i].getId().intValue() );
+			s.delete( entities[i] );
+		}
+		s.getTransaction().commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/table/HiLoTableTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/table/Pooled.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/table/Pooled.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/table/Pooled.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+    Demonstrates use of the enhanced sequence-based identifier
+    generator, using a pooled algorithm as the optimization (to
+    avoid hitting the database to generate each value).
+-->
+
+<hibernate-mapping package="org.hibernate.test.idgen.enhanced.table">
+
+    <class name="Entity" table="ID_TBL_POOL_ENTITY">
+        <id name="id" column="ID" type="long">
+            <generator class="org.hibernate.id.enhanced.TableGenerator">
+                <param name="table_name">ID_TBL_POOL_TBL</param>
+                <param name="segment_value">test</param>
+                <param name="initial_value">1</param>
+                <param name="increment_size">10</param>
+                <param name="optimizer">pooled</param>
+            </generator>
+        </id>
+        <property name="name" type="string"/>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/table/Pooled.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/table/PooledTableTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/table/PooledTableTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/table/PooledTableTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,67 @@
+package org.hibernate.test.idgen.enhanced.table;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.persister.entity.EntityPersister;
+import org.hibernate.id.enhanced.OptimizerFactory;
+import org.hibernate.id.enhanced.TableGenerator;
+import org.hibernate.Session;
+
+import static org.hibernate.id.IdentifierGeneratorHelper.BasicHolder;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class PooledTableTest extends FunctionalTestCase {
+	public PooledTableTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "idgen/enhanced/table/Pooled.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( PooledTableTest.class );
+	}
+
+	public void testNormalBoundary() {
+		EntityPersister persister = sfi().getEntityPersister( Entity.class.getName() );
+		assertClassAssignability( TableGenerator.class, persister.getIdentifierGenerator().getClass() );
+		TableGenerator generator = ( TableGenerator ) persister.getIdentifierGenerator();
+		assertClassAssignability( OptimizerFactory.PooledOptimizer.class, generator.getOptimizer().getClass() );
+		OptimizerFactory.PooledOptimizer optimizer = ( OptimizerFactory.PooledOptimizer ) generator.getOptimizer();
+
+		int increment = optimizer.getIncrementSize();
+		Entity[] entities = new Entity[ increment + 1 ];
+		Session s = openSession();
+		s.beginTransaction();
+		for ( int i = 0; i < increment; i++ ) {
+			entities[i] = new Entity( "" + ( i + 1 ) );
+			s.save( entities[i] );
+			assertEquals( 2, generator.getTableAccessCount() ); // initialization calls seq twice
+			assertEquals( increment + 1, ( (BasicHolder) optimizer.getLastSourceValue() ).getActualLongValue() ); // initialization calls seq twice
+			assertEquals( i + 1, ( (BasicHolder) optimizer.getLastValue() ).getActualLongValue() );
+			assertEquals( increment + 1, ( (BasicHolder) optimizer.getLastSourceValue() ).getActualLongValue() );
+		}
+		// now force a "clock over"
+		entities[ increment ] = new Entity( "" + increment );
+		s.save( entities[ increment ] );
+		assertEquals( 3, generator.getTableAccessCount() ); // initialization (2) + clock over
+		assertEquals( ( increment * 2 ) + 1, ( (BasicHolder) optimizer.getLastSourceValue() ).getActualLongValue() ); // initialization (2) + clock over
+		assertEquals( increment + 1, ( (BasicHolder) optimizer.getLastValue() ).getActualLongValue() );
+		s.getTransaction().commit();
+
+		s.beginTransaction();
+		for ( int i = 0; i < entities.length; i++ ) {
+			assertEquals( i + 1, entities[i].getId().intValue() );
+			s.delete( entities[i] );
+		}
+		s.getTransaction().commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idgen/enhanced/table/PooledTableTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idprops/IdentifierPropertyReferencesTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idprops/IdentifierPropertyReferencesTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idprops/IdentifierPropertyReferencesTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,187 @@
+package org.hibernate.test.idprops;
+
+import junit.framework.Test;
+
+import org.hibernate.Criteria;
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.criterion.Projections;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class IdentifierPropertyReferencesTest extends FunctionalTestCase {
+	public IdentifierPropertyReferencesTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "idprops/Mapping.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( IdentifierPropertyReferencesTest.class );
+	}
+
+	public void testHqlIdPropertyReferences() {
+		Session s = openSession();
+		s.beginTransaction();
+		Person p = new Person( new Long(1), "steve", 123 );
+		s.save( p );
+		Order o = new Order( new Long(1), p );
+		LineItem l = new LineItem( o, "my-product", 2 );
+		l.setId( "456" );
+		s.save( o );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+
+		long count = extractCount( s, "select count(*) from Person p where p.id = 123" );
+		assertEquals( "Person by id prop (non-identifier)", 1, count );
+		count = extractCount( s, "select count(*) from Person p where p.pk = 1" );
+		assertEquals( "Person by pk prop (identifier)", 1, count );
+
+		count = extractCount( s, "select count(*) from Order o where o.id = 1" );
+		assertEquals( "Order by number prop (named identifier)", 1, count );
+		count = extractCount( s, "select count(*) from Order o where o.number = 1" );
+		assertEquals( "Order by id prop (virtual identifier)", 1, count );
+
+		count = extractCount( s, "select count(*) from LineItem l where l.id = '456'" );
+		assertEquals( "LineItem by id prop (non-identifier", 1, count );
+
+		if ( getDialect().supportsRowValueConstructorSyntax() ) {
+			Query q = s.createQuery( "select count(*) from LineItem l where l.pk = (:order, :product)" )
+					.setEntity( "order", o )
+					.setString( "product", "my-product" );
+			count = extractCount( q );
+			assertEquals( "LineItem by pk prop (named composite identifier", 1, count );
+		}
+
+		count = extractCount( s, "select count(*) from Order o where o.orderee.id = 1" );
+		assertEquals( 0, count );
+		count = extractCount( s, "select count(*) from Order o where o.orderee.pk = 1" );
+		assertEquals( 1, count );
+		count = extractCount( s, "select count(*) from Order o where o.orderee.id = 123" );
+		assertEquals( 1, count );
+
+		count = extractCount( s, "select count(*) from LineItem l where l.pk.order.id = 1" );
+		assertEquals( 1, count );
+		count = extractCount( s, "select count(*) from LineItem l where l.pk.order.number = 1" );
+		assertEquals( 1, count );
+		count = extractCount( s, "select count(*) from LineItem l where l.pk.order.orderee.pk = 1" );
+		assertEquals( 1, count );
+
+		s.delete( o );
+		s.delete( p );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testCriteriaIdPropertyReferences() {
+		Session s = openSession();
+		s.beginTransaction();
+		Person p = new Person( new Long(1), "steve", 123 );
+		s.save( p );
+		Order o = new Order( new Long(1), p );
+		LineItem l = new LineItem( o, "my-product", 2 );
+		l.setId( "456" );
+		s.save( o );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+
+		Criteria crit = s.createCriteria( Person.class );
+		crit.setProjection( Projections.rowCount() );
+		crit.add( Restrictions.eq( "id", new Integer(123) ) );
+		long count = extractCount( crit );
+		assertEquals( "Person by id prop (non-identifier)", 1, count );
+
+		crit = s.createCriteria( Person.class );
+		crit.setProjection( Projections.rowCount() );
+		crit.add( Restrictions.eq( "pk", new Long(1) ) );
+		count = extractCount( crit );
+		assertEquals( "Person by pk prop (identifier)", 1, count );
+
+		crit = s.createCriteria( Order.class );
+		crit.setProjection( Projections.rowCount() );
+		crit.add(  Restrictions.eq( "number", new Long(1) ) );
+		count = extractCount( crit );
+		assertEquals( "Order by number prop (named identifier)", 1, count );
+
+		crit = s.createCriteria( Order.class );
+		crit.setProjection( Projections.rowCount() );
+		crit.add(  Restrictions.eq( "id", new Long(1) ) );
+		count = extractCount( crit );
+		assertEquals( "Order by id prop (virtual identifier)", 1, count );
+
+		crit = s.createCriteria( LineItem.class );
+		crit.setProjection( Projections.rowCount() );
+		crit.add(  Restrictions.eq( "id", "456" ) );
+		count = extractCount( crit );
+		assertEquals( "LineItem by id prop (non-identifier", 1, count );
+
+		if ( getDialect().supportsRowValueConstructorSyntax() ) {
+			crit = s.createCriteria( LineItem.class );
+			crit.setProjection( Projections.rowCount() );
+			crit.add( Restrictions.eq( "pk", new LineItemPK( o, "my-product" ) ) );
+			count = extractCount( crit );
+			assertEquals( "LineItem by pk prop (named composite identifier)", 1, count );
+		}
+
+		crit = s.createCriteria( Order.class );
+		crit.setProjection( Projections.rowCount() );
+		crit.createAlias( "orderee", "p" ).add( Restrictions.eq( "p.id", new Integer(1) ) );
+		count = extractCount( crit );
+		assertEquals( 0, count );
+
+		crit = s.createCriteria( Order.class );
+		crit.setProjection( Projections.rowCount() );
+		crit.createAlias( "orderee", "p" ).add( Restrictions.eq( "p.pk", new Long(1) ) );
+		count = extractCount( crit );
+		assertEquals( 1, count );
+
+		crit = s.createCriteria( Order.class );
+		crit.setProjection( Projections.rowCount() );
+		crit.createAlias( "orderee", "p" ).add( Restrictions.eq( "p.id", new Integer(123) ) );
+		count = extractCount( crit );
+		assertEquals( 1, count );
+
+		crit = s.createCriteria( LineItem.class );
+		crit.setProjection( Projections.rowCount() );
+		crit.add( Restrictions.eq( "pk.order.id", new Long(1) ) );
+		count = extractCount( crit );
+		assertEquals( 1, count );
+
+		crit = s.createCriteria( LineItem.class );
+		crit.setProjection( Projections.rowCount() );
+		crit.add( Restrictions.eq( "pk.order.number", new Long(1) ) );
+		count = extractCount( crit );
+		assertEquals( 1, count );
+
+		s.delete( o );
+		s.delete( p );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	private long extractCount(Session s, String hql) {
+		return extractCount( s.createQuery( hql ) );
+	}
+
+	private long extractCount(Query query) {
+		return ( ( Long ) query.list().get( 0 ) ).longValue();
+	}
+
+	private long extractCount(Criteria crit) {
+		return ( ( Long ) crit.list().get( 0 ) ).longValue();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idprops/IdentifierPropertyReferencesTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idprops/LineItem.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idprops/LineItem.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idprops/LineItem.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,49 @@
+package org.hibernate.test.idprops;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class LineItem {
+	private LineItemPK pk;
+	private int quantity;
+	private String id;
+
+	public LineItem() {
+	}
+
+	public LineItem(LineItemPK pk, int quantity) {
+		this.pk = pk;
+		this.quantity = quantity;
+		this.pk.getOrder().getLineItems().add( this );
+	}
+
+	public LineItem(Order order, String productCode, int quantity) {
+		this( new LineItemPK( order, productCode ), quantity );
+	}
+
+	public LineItemPK getPk() {
+		return pk;
+	}
+
+	public void setPk(LineItemPK pk) {
+		this.pk = pk;
+	}
+
+	public int getQuantity() {
+		return quantity;
+	}
+
+	public void setQuantity(int quantity) {
+		this.quantity = quantity;
+	}
+
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idprops/LineItem.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idprops/LineItemPK.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idprops/LineItemPK.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idprops/LineItemPK.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,64 @@
+package org.hibernate.test.idprops;
+
+import java.io.Serializable;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class LineItemPK implements Serializable {
+	private Order order;
+	private String productCode;
+
+	public LineItemPK() {
+	}
+
+	public LineItemPK(Order order, String productCode) {
+		this.order = order;
+		this.productCode = productCode;
+	}
+
+	public Order getOrder() {
+		return order;
+	}
+
+	public void setOrder(Order order) {
+		this.order = order;
+	}
+
+	public String getProductCode() {
+		return productCode;
+	}
+
+	public void setProductCode(String productCode) {
+		this.productCode = productCode;
+	}
+
+	public boolean equals(Object o) {
+		if ( this == o ) {
+			return true;
+		}
+		if ( o == null || getClass() != o.getClass() ) {
+			return false;
+		}
+
+		LineItemPK that = ( LineItemPK ) o;
+
+		if ( !order.equals( that.order ) ) {
+			return false;
+		}
+		if ( !productCode.equals( that.productCode ) ) {
+			return false;
+		}
+
+		return true;
+	}
+
+	public int hashCode() {
+		int result;
+		result = order.hashCode();
+		result = 31 * result + productCode.hashCode();
+		return result;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idprops/LineItemPK.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idprops/Mapping.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idprops/Mapping.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idprops/Mapping.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,48 @@
+<?xml version="1.0"?>
+
+<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<hibernate-mapping package="org.hibernate.test.idprops">
+
+    <!--
+        Person has an identitifer property named something other than 'id';
+        additionally, it has a non-identitifer property named 'id'
+    -->
+    <class name="Person" table="T_ID_PERSON">
+        <id name="pk" column="PK" type="long">
+            <generator class="assigned"/>
+        </id>
+        <property name="name" column="NAME" type="string"/>
+        <property name="id" column="ID_NON_ID" type="int" />
+    </class>
+
+    <!--
+        Order has an identitifer property named something other than 'id';
+        it has no non-identitifer property named 'id'
+    -->
+    <class name="Order" table="T_ID_ORDER">
+        <id name="number" column="PK" type="long">
+            <generator class="assigned"/>
+        </id>
+        <property name="placed" column="ORDR_DT" type="timestamp"/>
+        <many-to-one name="orderee" class="Person" column="ORDEREE"/>
+        <set name="lineItems" cascade="all-delete-orphan" lazy="true" inverse="true">
+            <key column="ORDR_ID"/>
+            <one-to-many class="LineItem"/>
+        </set>
+    </class>
+
+    <!--
+        LineItem has a composite identitifer property named something other than 'id';
+        additionally, it has a non-identitifer property named 'id'
+    -->
+    <class name="LineItem" table="T_ID_LINE_ITEM">
+        <composite-id class="LineItemPK" name="pk">
+            <key-many-to-one name="order" class="Order" column="ORDR_ID" />
+            <key-property name="productCode" column="PROD_CODE" type="string"/>
+        </composite-id>
+        <property name="quantity" column="QTY" type="int"/>
+        <property name="id" column="ID_NON_ID2" type="string"/>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idprops/Mapping.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idprops/Order.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idprops/Order.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idprops/Order.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,60 @@
+package org.hibernate.test.idprops;
+
+import java.util.Date;
+import java.util.Set;
+import java.util.HashSet;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class Order {
+	private Long number;
+	private Date placed;
+	private Person orderee;
+
+	private Set lineItems = new HashSet();
+
+	public Order() {
+	}
+
+	public Order(Long number, Person orderee) {
+		this.number = number;
+		this.orderee = orderee;
+		this.placed = new Date();
+	}
+
+	public Long getNumber() {
+		return number;
+	}
+
+	public void setNumber(Long number) {
+		this.number = number;
+	}
+
+	public Date getPlaced() {
+		return placed;
+	}
+
+	public void setPlaced(Date placed) {
+		this.placed = placed;
+	}
+
+	public Person getOrderee() {
+		return orderee;
+	}
+
+	public void setOrderee(Person orderee) {
+		this.orderee = orderee;
+	}
+
+
+	public Set getLineItems() {
+		return lineItems;
+	}
+
+	public void setLineItems(Set lineItems) {
+		this.lineItems = lineItems;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idprops/Order.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idprops/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idprops/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idprops/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,45 @@
+package org.hibernate.test.idprops;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class Person {
+	private Long pk;
+	private String name;
+	private int id;
+
+	public Person() {
+	}
+
+	public Person(Long pk, String name, int id) {
+		this.pk = pk;
+		this.name = name;
+		this.id = id;
+	}
+
+	public Long getPk() {
+		return pk;
+	}
+
+	public void setPk(Long pk) {
+		this.pk = pk;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public int getId() {
+		return id;
+	}
+
+	public void setId(int id) {
+		this.id = id;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/idprops/Person.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/Contract.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/Contract.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/Contract.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,136 @@
+//$Id: Contract.java 7222 2005-06-19 17:22:01Z oneovthafew $
+package org.hibernate.test.immutable;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+public class Contract implements Serializable {
+	
+	private long id;
+	private long version;
+	private String customerName;
+	private String type;
+	private List variations;
+	private Contract parent;
+	private Set subcontracts;
+	private Set plans;
+	private Set parties;
+	private Set infos;
+
+	public Contract() {
+		super();
+	}
+
+	public Contract(Plan plan, String customerName, String type) {
+		plans = new HashSet();
+		if ( plan != null ) {
+			plans.add( plan );
+			plan.getContracts().add( this );
+		}
+		this.customerName = customerName;
+		this.type = type;
+		variations = new ArrayList();
+		subcontracts = new HashSet();
+		parties = new HashSet();
+		infos = new HashSet();
+	}
+
+	public long getVersion() {
+		return version;
+	}
+
+	public void setVersion(long version) {
+		this.version = version;
+	}
+	
+	public Set getPlans() {
+		return plans;
+	}
+
+	public void setPlans(Set plans) {
+		this.plans = plans;
+	}
+
+	public String getCustomerName() {
+		return customerName;
+	}
+
+	public void setCustomerName(String customerName) {
+		this.customerName = customerName;
+	}
+
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	public List getVariations() {
+		return variations;
+	}
+
+	public void setVariations(List variations) {
+		this.variations = variations;
+	}
+
+	public Contract getParent() {
+		return parent;
+	}
+
+	public void setParent(Contract parent) {
+		this.parent = parent;
+	}
+
+	public Set getSubcontracts() {
+		return subcontracts;
+	}
+
+	public void setSubcontracts(Set subcontracts) {
+		this.subcontracts = subcontracts;
+	}
+
+	public void addSubcontract(Contract subcontract) {
+		subcontracts.add( subcontract );
+		subcontract.setParent( this );
+	}
+
+	public Set getParties() {
+		return parties;
+	}
+
+	public void setParties(Set parties) {
+		this.parties = parties;
+	}
+
+	public void addParty(Party party) {
+		parties.add( party );
+		party.setContract( this );
+	}
+
+	public void removeParty(Party party) {
+		parties.remove( party );
+		party.setContract( null );
+	}
+
+	public Set getInfos() {
+		return infos;
+	}
+
+	public void setInfos(Set infos) {
+		this.infos = infos;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/Contract.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/ContractVariation.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/ContractVariation.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/ContractVariation.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,95 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+  Test for immutable classes/collections.
+     
+-->
+
+<hibernate-mapping package="org.hibernate.test.immutable">
+    <class name="Info" mutable="true">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <property name="text"/>        
+    </class>
+
+    <class name="Plan" table="tbl_plan" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <property name="description" not-null="true"/>
+        <set name="contracts" table="plan_contract" inverse="false" mutable="true" cascade="all" fetch="join">
+            <key column="col_plan"/>
+            <many-to-many column="contract" class="Contract"/>
+        </set>
+        <set name="infos" inverse="false"  mutable="true" cascade="all-delete-orphan">
+            <key column="col_plan"/>
+            <one-to-many class="Info"/>
+        </set>
+    </class>
+
+    <class name="Party" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <!-- <many-to-one name="contract" update="false" insert="false"/> -->
+        <many-to-one name="contract" not-null="false"/>
+        <property name="name" not-null="true"/>
+        <set name="infos" inverse="false"  mutable="true" cascade="all-delete-orphan">
+            <key column="party"/>
+            <one-to-many class="Info"/>
+        </set>
+    </class>
+
+	<class name="Contract" mutable="false">
+		<id name="id">
+			<generator class="increment"/>
+		</id>
+		<property name="customerName" not-null="true"/>
+		<property name="type" not-null="true"/>
+		<bag name="variations" inverse="true" order-by="version asc"
+				mutable="false" cascade="all" fetch="join">
+			<key column="contract"/>
+			<one-to-many class="ContractVariation"/>
+		</bag>
+        <!-- <many-to-one name="parent" /> -->
+        <many-to-one name="parent" update="false" insert="false"/>
+        <set name="subcontracts" inverse="false"
+                mutable="true" cascade="all" fetch="join">
+            <key column="parent"/>
+            <one-to-many class="Contract"/>
+        </set>
+        <set name="plans" table="plan_contract" inverse="true" mutable="true" cascade="none">
+            <key column="contract"/>
+            <many-to-many column="col_plan" class="Plan"/>
+        </set>
+        <set name="parties" inverse="true"  mutable="true" cascade="all" fetch="join">
+            <key column="contract"/>
+            <one-to-many class="Party"/>
+        </set>
+        <set name="infos" inverse="false"  mutable="true" cascade="all-delete-orphan">
+            <key column="contract"/>
+            <one-to-many class="Info"/>
+        </set>
+	</class>
+
+	<class name="ContractVariation" mutable="false">
+		<composite-id>
+			<key-many-to-one name="contract"/>
+			<key-property name="version"/>
+		</composite-id>
+		<property name="text" type="text"/>
+        <set name="infos" inverse="false"  mutable="true" cascade="all-delete-orphan">
+            <key>
+                <column name="contractvariation"/>
+                <column name="version"/>
+            </key>
+            <one-to-many class="Info"/>
+        </set>
+	</class>
+	
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/ContractVariation.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/ContractVariation.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/ContractVariation.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/ContractVariation.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,56 @@
+//$Id: ContractVariation.java 7222 2005-06-19 17:22:01Z oneovthafew $
+package org.hibernate.test.immutable;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+
+public class ContractVariation implements Serializable {
+	
+	private int version;
+	private Contract contract;
+	private String text;
+	private Set infos = new HashSet();
+
+	public Contract getContract() {
+		return contract;
+	}
+
+	public void setContract(Contract contract) {
+		this.contract = contract;
+	}
+
+	public String getText() {
+		return text;
+	}
+
+	public void setText(String text) {
+		this.text = text;
+	}
+
+	public int getVersion() {
+		return version;
+	}
+
+	public void setVersion(int version) {
+		this.version = version;
+	}
+
+	public ContractVariation() {
+		super();
+	}
+
+	public ContractVariation(int version, Contract contract) {
+		this.contract = contract;
+		this.version = version;
+		contract.getVariations().add(this);
+	}
+
+	public Set getInfos() {
+		return infos;
+	}
+
+	public void setInfos(Set infos) {
+		this.infos = infos;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/ContractVariation.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/ImmutableTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/ImmutableTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/ImmutableTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,1550 @@
+//$Id: ImmutableTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.immutable;
+
+import java.util.Iterator;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.criterion.Projections;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.proxy.HibernateProxy;
+
+/**
+ * @author Gavin King
+ */
+public class ImmutableTest extends FunctionalTestCase {
+
+	public ImmutableTest(String str) {
+		super(str);
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setProperty( Environment.GENERATE_STATISTICS, "true");
+		cfg.setProperty( Environment.STATEMENT_BATCH_SIZE, "0" );
+	}	
+
+	public String[] getMappings() {
+		return new String[] { "immutable/ContractVariation.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( ImmutableTest.class );
+	}
+
+	public void testChangeImmutableEntityProxyToModifiable() {
+		Contract c = new Contract( null, "gavin", "phone");
+		ContractVariation cv1 = new ContractVariation(1, c);
+		cv1.setText("expensive");
+		ContractVariation cv2 = new ContractVariation(2, c);
+		cv2.setText("more expensive");
+
+		clearCounts();
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(c);
+		assertTrue( s.isReadOnly( c ) );
+		assertTrue( s.isReadOnly( cv1 ) );
+		assertTrue( s.isReadOnly( cv2 ) );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 3 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria(Contract.class).uniqueResult();
+		assertTrue( s.isReadOnly( c ) );
+		assertEquals( c.getCustomerName(), "gavin" );
+		assertEquals( c.getVariations().size(), 2 );
+		Iterator it = c.getVariations().iterator();
+		cv1 = (ContractVariation) it.next();
+		assertEquals( cv1.getText(), "expensive" );
+		cv2 = (ContractVariation) it.next();
+		assertEquals( cv2.getText(), "more expensive" );
+		assertTrue( s.isReadOnly( cv1 ) );
+		assertTrue( s.isReadOnly( cv2 ) );
+
+		try {
+			assertTrue( c instanceof HibernateProxy );
+			s.setReadOnly( c, false );
+		}
+		catch (IllegalStateException ex) {
+			// expected
+		}
+		finally {
+			t.rollback();
+			s.close();
+		}
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete(c);
+		assertEquals( s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		assertEquals( s.createCriteria(ContractVariation.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 3 );
+	}
+
+	public void testChangeImmutableEntityToModifiable() {
+		Contract c = new Contract( null, "gavin", "phone");
+		ContractVariation cv1 = new ContractVariation(1, c);
+		cv1.setText("expensive");
+		ContractVariation cv2 = new ContractVariation(2, c);
+		cv2.setText("more expensive");
+
+		clearCounts();
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(c);
+		assertTrue( s.isReadOnly( c ) );
+		assertTrue( s.isReadOnly( cv1 ) );
+		assertTrue( s.isReadOnly( cv2 ) );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 3 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria(Contract.class).uniqueResult();
+		assertTrue( s.isReadOnly( c ) );
+		assertEquals( c.getCustomerName(), "gavin" );
+		assertEquals( c.getVariations().size(), 2 );
+		Iterator it = c.getVariations().iterator();
+		cv1 = (ContractVariation) it.next();
+		assertEquals( cv1.getText(), "expensive" );
+		cv2 = (ContractVariation) it.next();
+		assertEquals( cv2.getText(), "more expensive" );
+		assertTrue( s.isReadOnly( cv1 ) );
+		assertTrue( s.isReadOnly( cv2 ) );
+
+		try {
+			assertTrue( c instanceof HibernateProxy );
+			s.setReadOnly( ( ( HibernateProxy ) c ).getHibernateLazyInitializer().getImplementation(), false );
+		}
+		catch (IllegalStateException ex) {
+			// expected
+		}
+		finally {
+			t.rollback();
+			s.close();
+		}
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete(c);
+		assertEquals( s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		assertEquals( s.createCriteria(ContractVariation.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 3 );
+	}
+
+	public void testPersistImmutable() {
+		Contract c = new Contract( null, "gavin", "phone");
+		ContractVariation cv1 = new ContractVariation(1, c);
+		cv1.setText("expensive");
+		ContractVariation cv2 = new ContractVariation(2, c);
+		cv2.setText("more expensive");
+
+		clearCounts();
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(c);
+		assertTrue( s.isReadOnly( c ) );
+		assertTrue( s.isReadOnly( cv1 ) );
+		assertTrue( s.isReadOnly( cv2 ) );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 3 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria(Contract.class).uniqueResult();
+		assertTrue( s.isReadOnly( c ) );
+		assertEquals( c.getCustomerName(), "gavin" );
+		assertEquals( c.getVariations().size(), 2 );
+		Iterator it = c.getVariations().iterator();
+		cv1 = (ContractVariation) it.next();
+		assertEquals( cv1.getText(), "expensive" );
+		cv2 = (ContractVariation) it.next();
+		assertEquals( cv2.getText(), "more expensive" );
+		assertTrue( s.isReadOnly( cv1 ) );
+		assertTrue( s.isReadOnly( cv2 ) );
+		s.delete(c);
+		assertEquals( s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		assertEquals( s.createCriteria(ContractVariation.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 3 );
+	}
+
+	public void testPersistUpdateImmutableInSameTransaction() {
+		Contract c = new Contract( null, "gavin", "phone");
+		ContractVariation cv1 = new ContractVariation(1, c);
+		cv1.setText("expensive");
+		ContractVariation cv2 = new ContractVariation(2, c);
+		cv2.setText("more expensive");
+
+		clearCounts();
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(c);
+		assertTrue( s.isReadOnly( c ) );
+		assertTrue( s.isReadOnly( cv1 ) );
+		assertTrue( s.isReadOnly( cv2 ) );
+		c.setCustomerName( "gail" );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 3 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria(Contract.class).uniqueResult();
+		assertTrue( s.isReadOnly( c ) );
+		assertEquals( c.getCustomerName(), "gavin" );
+		assertEquals( c.getVariations().size(), 2 );
+		Iterator it = c.getVariations().iterator();
+		cv1 = (ContractVariation) it.next();
+		assertEquals( cv1.getText(), "expensive" );
+		cv2 = (ContractVariation) it.next();
+		assertEquals( cv2.getText(), "more expensive" );
+		assertTrue( s.isReadOnly( cv1 ) );
+		assertTrue( s.isReadOnly( cv2 ) );
+		s.delete(c);
+		assertEquals( s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		assertEquals( s.createCriteria(ContractVariation.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 3 );
+	}
+
+	public void testSaveImmutable() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gavin", "phone");
+		ContractVariation cv1 = new ContractVariation(1, c);
+		cv1.setText("expensive");
+		ContractVariation cv2 = new ContractVariation(2, c);
+		cv2.setText("more expensive");
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.save(c);
+		assertTrue( s.isReadOnly( c ) );
+		assertTrue( s.isReadOnly( cv1 ) );
+		assertTrue( s.isReadOnly( cv2 ) );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 3 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria(Contract.class).uniqueResult();
+		assertTrue( s.isReadOnly( c ) );
+		assertEquals( c.getCustomerName(), "gavin" );
+		assertEquals( c.getVariations().size(), 2 );
+		Iterator it = c.getVariations().iterator();
+		cv1 = (ContractVariation) it.next();
+		assertEquals( cv1.getText(), "expensive" );
+		cv2 = (ContractVariation) it.next();
+		assertEquals( cv2.getText(), "more expensive" );
+		assertTrue( s.isReadOnly( cv1 ) );
+		assertTrue( s.isReadOnly( cv2 ) );
+		s.delete(c);
+		assertEquals( s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		assertEquals( s.createCriteria(ContractVariation.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 3 );
+	}
+
+	public void testSaveOrUpdateImmutable() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gavin", "phone");
+		ContractVariation cv1 = new ContractVariation(1, c);
+		cv1.setText("expensive");
+		ContractVariation cv2 = new ContractVariation(2, c);
+		cv2.setText("more expensive");
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.saveOrUpdate(c);
+		assertTrue( s.isReadOnly( c ) );
+		assertTrue( s.isReadOnly( cv1 ) );
+		assertTrue( s.isReadOnly( cv2 ) );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 3 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria(Contract.class).uniqueResult();
+		assertTrue( s.isReadOnly( c ) );
+		assertEquals( c.getCustomerName(), "gavin" );
+		assertEquals( c.getVariations().size(), 2 );
+		Iterator it = c.getVariations().iterator();
+		cv1 = (ContractVariation) it.next();
+		assertEquals( cv1.getText(), "expensive" );
+		cv2 = (ContractVariation) it.next();
+		assertEquals( cv2.getText(), "more expensive" );
+		assertTrue( s.isReadOnly( cv1 ) );
+		assertTrue( s.isReadOnly( cv2 ) );
+		s.delete(c);
+		assertEquals( s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		assertEquals( s.createCriteria(ContractVariation.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 3 );
+	}
+
+	public void testRefreshImmutable() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gavin", "phone");
+		ContractVariation cv1 = new ContractVariation(1, c);
+		cv1.setText("expensive");
+		ContractVariation cv2 = new ContractVariation(2, c);
+		cv2.setText("more expensive");
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.saveOrUpdate( c );
+		assertTrue( s.isReadOnly( c ) );
+		assertTrue( s.isReadOnly( cv1 ) );
+		assertTrue( s.isReadOnly( cv2 ) );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 3 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		// refresh detached
+		s.refresh( c );
+		assertTrue( s.isReadOnly( c ) );
+		assertEquals( c.getCustomerName(), "gavin" );
+		assertEquals( c.getVariations().size(), 2 );
+		Iterator it = c.getVariations().iterator();
+		cv1 = (ContractVariation) it.next();
+		assertEquals( cv1.getText(), "expensive" );
+		cv2 = (ContractVariation) it.next();
+		assertEquals( cv2.getText(), "more expensive" );
+		assertTrue( s.isReadOnly( cv1 ) );
+		assertTrue( s.isReadOnly( cv2 ) );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 0 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		c.setCustomerName( "joe" );
+
+		s = openSession();
+		t = s.beginTransaction();
+		// refresh updated detached
+		s.refresh( c );
+		assertTrue( s.isReadOnly( c ) );
+		assertEquals( c.getCustomerName(), "gavin" );
+		assertEquals( c.getVariations().size(), 2 );
+		it = c.getVariations().iterator();
+		cv1 = (ContractVariation) it.next();
+		assertEquals( cv1.getText(), "expensive" );
+		cv2 = (ContractVariation) it.next();
+		assertEquals( cv2.getText(), "more expensive" );
+		assertTrue( s.isReadOnly( cv1 ) );
+		assertTrue( s.isReadOnly( cv2 ) );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 0 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete(c);
+		assertEquals( s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		assertEquals( s.createCriteria(ContractVariation.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 3 );
+	}
+
+	public void testImmutable() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gavin", "phone");
+		ContractVariation cv1 = new ContractVariation(1, c);
+		cv1.setText("expensive");
+		ContractVariation cv2 = new ContractVariation(2, c);
+		cv2.setText("more expensive");
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(c);
+		assertTrue( s.isReadOnly( c ) );
+		assertTrue( s.isReadOnly( cv1 ) );
+		assertTrue( s.isReadOnly( cv2 ) );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 3 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria(Contract.class).uniqueResult();
+		assertTrue( s.isReadOnly( c ) );
+		c.setCustomerName("foo bar");
+		cv1 = (ContractVariation) c.getVariations().iterator().next();
+		cv1.setText("blah blah");
+		assertTrue( s.isReadOnly( cv1 ) );
+		assertFalse( s.contains( cv2 ) );
+		t.commit();
+		assertTrue( s.isReadOnly( c ) );
+		assertTrue( s.isReadOnly( cv1 ) );
+		assertFalse( s.contains( cv2 ) );
+		s.close();
+
+		assertInsertCount( 0 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria(Contract.class).uniqueResult();
+		assertTrue( s.isReadOnly( c ) );
+		assertEquals( c.getCustomerName(), "gavin" );
+		assertEquals( c.getVariations().size(), 2 );
+		Iterator it = c.getVariations().iterator();
+		cv1 = (ContractVariation) it.next();
+		assertEquals( cv1.getText(), "expensive" );
+		cv2 = (ContractVariation) it.next();
+		assertEquals( cv2.getText(), "more expensive" );
+		assertTrue( s.isReadOnly( cv1 ) );
+		assertTrue( s.isReadOnly( cv2 ) );
+		s.delete(c);
+		assertEquals( s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		assertEquals( s.createCriteria(ContractVariation.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 3 );
+	}
+
+	public void testPersistAndUpdateImmutable() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gavin", "phone");
+		ContractVariation cv1 = new ContractVariation(1, c);
+		cv1.setText("expensive");
+		ContractVariation cv2 = new ContractVariation(2, c);
+		cv2.setText("more expensive");
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(c);
+		assertTrue( s.isReadOnly( c ) );
+		assertTrue( s.isReadOnly( cv1 ) );
+		assertTrue( s.isReadOnly( cv2 ) );
+		c.setCustomerName( "Sherman" );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 3 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria(Contract.class).uniqueResult();
+		assertTrue( s.isReadOnly( c ) );
+		c.setCustomerName("foo bar");
+		cv1 = (ContractVariation) c.getVariations().iterator().next();
+		cv1.setText("blah blah");
+		assertTrue( s.isReadOnly( cv1 ) );
+		assertFalse( s.contains( cv2 ) );
+		t.commit();
+		assertTrue( s.isReadOnly( c ) );
+		assertTrue( s.isReadOnly( cv1 ) );
+		assertFalse( s.contains( cv2 ) );
+		s.close();
+
+		assertInsertCount( 0 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria(Contract.class).uniqueResult();
+		assertTrue( s.isReadOnly( c ) );
+		assertEquals( c.getCustomerName(), "gavin" );
+		assertEquals( c.getVariations().size(), 2 );
+		Iterator it = c.getVariations().iterator();
+		cv1 = (ContractVariation) it.next();
+		assertEquals( cv1.getText(), "expensive" );
+		cv2 = (ContractVariation) it.next();
+		assertEquals( cv2.getText(), "more expensive" );
+		assertTrue( s.isReadOnly( cv1 ) );
+		assertTrue( s.isReadOnly( cv2 ) );
+		s.delete(c);
+		assertEquals( s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		assertEquals( s.createCriteria(ContractVariation.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 3 );
+	}
+
+	public void testUpdateAndDeleteManagedImmutable() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gavin", "phone");
+		ContractVariation cv1 = new ContractVariation(1, c);
+		cv1.setText("expensive");
+		ContractVariation cv2 = new ContractVariation(2, c);
+		cv2.setText("more expensive");
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(c);
+		t.commit();
+		s.close();
+
+		assertInsertCount( 3 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria(Contract.class).uniqueResult();
+		assertTrue( s.isReadOnly( c ) );
+		assertEquals( c.getCustomerName(), "gavin" );
+		assertEquals( c.getVariations().size(), 2 );
+		Iterator it = c.getVariations().iterator();
+		cv1 = (ContractVariation) it.next();
+		assertEquals( cv1.getText(), "expensive" );
+		cv2 = (ContractVariation) it.next();
+		assertEquals( cv2.getText(), "more expensive" );
+		assertTrue( s.isReadOnly( cv1 ) );
+		assertTrue( s.isReadOnly( cv2 ) );
+		c.setCustomerName( "Sherman" );
+		s.delete(c);
+		assertEquals( s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		assertEquals( s.createCriteria(ContractVariation.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 3 );
+	}
+
+	public void testGetAndDeleteManagedImmutable() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gavin", "phone");
+		ContractVariation cv1 = new ContractVariation(1, c);
+		cv1.setText("expensive");
+		ContractVariation cv2 = new ContractVariation(2, c);
+		cv2.setText("more expensive");
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(c);
+		t.commit();
+		s.close();
+
+		assertInsertCount( 3 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.get( Contract.class, c.getId() );
+		assertTrue( s.isReadOnly( c ) );
+		assertEquals( c.getCustomerName(), "gavin" );
+		assertEquals( c.getVariations().size(), 2 );
+		Iterator it = c.getVariations().iterator();
+		cv1 = (ContractVariation) it.next();
+		assertEquals( cv1.getText(), "expensive" );
+		cv2 = (ContractVariation) it.next();
+		assertEquals( cv2.getText(), "more expensive" );
+		assertTrue( s.isReadOnly( cv1 ) );
+		assertTrue( s.isReadOnly( cv2 ) );
+		c.setCustomerName( "Sherman" );
+		s.delete(c);
+		assertEquals( s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		assertEquals( s.createCriteria(ContractVariation.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 3 );
+	}
+
+	public void testDeleteDetachedImmutable() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gavin", "phone");
+		ContractVariation cv1 = new ContractVariation(1, c);
+		cv1.setText("expensive");
+		ContractVariation cv2 = new ContractVariation(2, c);
+		cv2.setText("more expensive");
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(c);
+		t.commit();
+		s.close();
+
+		assertInsertCount( 3 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete( c );
+		c = (Contract) s.createCriteria(Contract.class).uniqueResult();
+		assertNull( c );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 3 );
+	}
+
+	public void testDeleteDetachedModifiedImmutable() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gavin", "phone");
+		ContractVariation cv1 = new ContractVariation(1, c);
+		cv1.setText("expensive");
+		ContractVariation cv2 = new ContractVariation(2, c);
+		cv2.setText("more expensive");
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(c);
+		t.commit();
+		s.close();
+
+		assertInsertCount( 3 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c.setCustomerName( "sherman" );
+		s.delete( c );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 3 );		
+	}
+
+
+	public void testImmutableParentEntityWithUpdate() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gavin", "phone");
+		ContractVariation cv1 = new ContractVariation(1, c);
+		cv1.setText("expensive");
+		ContractVariation cv2 = new ContractVariation(2, c);
+		cv2.setText("more expensive");
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(c);
+		t.commit();
+		s.close();
+
+		assertInsertCount( 3 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c.setCustomerName("foo bar");
+		s.update( c );
+		assertTrue( s.isReadOnly( c ) );
+		for ( Iterator it = c.getVariations().iterator(); it.hasNext(); ) {
+			assertTrue( s.contains( it.next() ) );
+		}
+		t.commit();
+		assertTrue( s.isReadOnly( c ) );
+		for ( Iterator it = c.getVariations().iterator(); it.hasNext(); ) {
+			ContractVariation cv = ( ContractVariation ) it.next();
+			assertTrue( s.contains( cv ) );
+			assertTrue( s.isReadOnly( cv ) );
+		}
+		s.close();
+
+		assertUpdateCount( 0 );
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria(Contract.class).uniqueResult();
+		assertEquals( c.getCustomerName(), "gavin" );
+		assertEquals( c.getVariations().size(), 2 );
+		Iterator it = c.getVariations().iterator();
+		cv1 = (ContractVariation) it.next();
+		assertEquals( cv1.getText(), "expensive" );
+		cv2 = (ContractVariation) it.next();
+		assertEquals( cv2.getText(), "more expensive" );
+		s.delete(c);
+		assertEquals( s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		assertEquals( s.createCriteria(ContractVariation.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 3 );
+	}
+
+	public void testImmutableChildEntityWithUpdate() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gavin", "phone");
+		ContractVariation cv1 = new ContractVariation(1, c);
+		cv1.setText("expensive");
+		ContractVariation cv2 = new ContractVariation(2, c);
+		cv2.setText("more expensive");
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(c);
+		t.commit();
+		s.close();
+
+		assertInsertCount( 3 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		cv1 = (ContractVariation) c.getVariations().iterator().next();
+		cv1.setText("blah blah");
+		s.update( c );
+		assertTrue( s.isReadOnly( c ) );
+		assertTrue( s.contains( cv1 ) );
+		assertTrue( s.contains( cv2 ) );
+		t.commit();
+		assertTrue( s.isReadOnly( c ) );
+		assertTrue( s.isReadOnly( cv1 ) );
+		assertTrue( s.isReadOnly( cv2 ) );
+		s.close();
+
+		assertUpdateCount( 0 );
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria(Contract.class).uniqueResult();
+		assertEquals( c.getCustomerName(), "gavin" );
+		assertEquals( c.getVariations().size(), 2 );
+		Iterator it = c.getVariations().iterator();
+		cv1 = (ContractVariation) it.next();
+		assertEquals( cv1.getText(), "expensive" );
+		cv2 = (ContractVariation) it.next();
+		assertEquals( cv2.getText(), "more expensive" );
+		s.delete(c);
+		assertEquals( s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		assertEquals( s.createCriteria(ContractVariation.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 3 );
+	}
+
+	public void testImmutableCollectionWithUpdate() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gavin", "phone");
+		ContractVariation cv1 = new ContractVariation(1, c);
+		cv1.setText("expensive");
+		ContractVariation cv2 = new ContractVariation(2, c);
+		cv2.setText("more expensive");
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(c);
+		t.commit();
+		s.close();
+
+		assertInsertCount( 3 );
+		assertUpdateCount( 0 );
+
+		s = openSession();
+		t = s.beginTransaction();
+		c.getVariations().add( new ContractVariation(3, c) );
+		s.update( c );
+		try {
+			t.commit();
+			fail( "should have failed because reassociated object has a dirty collection");
+		}
+		catch ( HibernateException ex ) {
+			// expected
+		}
+		finally {
+			t.rollback();
+			s.close();
+		}
+
+		assertUpdateCount( 0 );
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria(Contract.class).uniqueResult();
+		assertEquals( c.getCustomerName(), "gavin" );
+		assertEquals( c.getVariations().size(), 2 );
+		Iterator it = c.getVariations().iterator();
+		cv1 = (ContractVariation) it.next();
+		assertEquals( cv1.getText(), "expensive" );
+		cv2 = (ContractVariation) it.next();
+		assertEquals( cv2.getText(), "more expensive" );
+		s.delete(c);
+		assertEquals( s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		assertEquals( s.createCriteria(ContractVariation.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 3 );
+	}
+
+	public void testUnmodifiedImmutableParentEntityWithMerge() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gavin", "phone");
+		ContractVariation cv1 = new ContractVariation(1, c);
+		cv1.setText("expensive");
+		ContractVariation cv2 = new ContractVariation(2, c);
+		cv2.setText("more expensive");
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(c);
+		t.commit();
+		s.close();
+
+		assertInsertCount( 3 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = ( Contract ) s.merge( c );
+		assertTrue( s.isReadOnly( c ) );
+		assertTrue( Hibernate.isInitialized( c.getVariations() ) );
+		Iterator it = c.getVariations().iterator();
+		cv1 = (ContractVariation) it.next();
+		cv2 = (ContractVariation) it.next();
+		assertTrue( s.isReadOnly( cv1 ) );
+		assertTrue( s.isReadOnly( cv2 ) );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria(Contract.class).uniqueResult();
+		assertEquals( c.getCustomerName(), "gavin" );
+		assertEquals( c.getVariations().size(), 2 );
+		it = c.getVariations().iterator();
+		cv1 = (ContractVariation) it.next();
+		assertEquals( cv1.getText(), "expensive" );
+		cv2 = (ContractVariation) it.next();
+		assertEquals( cv2.getText(), "more expensive" );
+		s.delete(c);
+		assertEquals( s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		assertEquals( s.createCriteria(ContractVariation.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 3 );
+	}
+
+	public void testImmutableParentEntityWithMerge() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gavin", "phone");
+		ContractVariation cv1 = new ContractVariation(1, c);
+		cv1.setText("expensive");
+		ContractVariation cv2 = new ContractVariation(2, c);
+		cv2.setText("more expensive");
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(c);
+		t.commit();
+		s.close();
+
+		assertInsertCount( 3 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c.setCustomerName("foo bar");
+		c = ( Contract ) s.merge( c );
+		assertTrue( s.isReadOnly( c ) );
+		assertTrue( Hibernate.isInitialized( c.getVariations() ) );
+		Iterator it = c.getVariations().iterator();
+		cv1 = (ContractVariation) it.next();
+		cv2 = (ContractVariation) it.next();
+		assertTrue( s.isReadOnly( c ) );
+		assertTrue( s.isReadOnly( c ) );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria(Contract.class).uniqueResult();
+		assertEquals( c.getCustomerName(), "gavin" );
+		assertEquals( c.getVariations().size(), 2 );
+		it = c.getVariations().iterator();
+		cv1 = (ContractVariation) it.next();
+		assertEquals( cv1.getText(), "expensive" );
+		cv2 = (ContractVariation) it.next();
+		assertEquals( cv2.getText(), "more expensive" );
+		s.delete(c);
+		assertEquals( s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		assertEquals( s.createCriteria(ContractVariation.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 3 );
+
+	}
+
+	public void testImmutableChildEntityWithMerge() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gavin", "phone");
+		ContractVariation cv1 = new ContractVariation(1, c);
+		cv1.setText("expensive");
+		ContractVariation cv2 = new ContractVariation(2, c);
+		cv2.setText("more expensive");
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(c);
+		t.commit();
+		s.close();
+
+		assertInsertCount( 3 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		cv1 = (ContractVariation) c.getVariations().iterator().next();
+		cv1.setText("blah blah");
+		c = ( Contract ) s.merge( c );
+		assertTrue( s.isReadOnly( c ) );
+		assertTrue( Hibernate.isInitialized( c.getVariations() ) );
+		Iterator it = c.getVariations().iterator();
+		cv1 = (ContractVariation) it.next();
+		cv2 = (ContractVariation) it.next();
+		assertTrue( s.isReadOnly( c ) );
+		assertTrue( s.isReadOnly( c ) );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria(Contract.class).uniqueResult();
+		assertEquals( c.getCustomerName(), "gavin" );
+		assertEquals( c.getVariations().size(), 2 );
+		it = c.getVariations().iterator();
+		cv1 = (ContractVariation) it.next();
+		assertEquals( cv1.getText(), "expensive" );
+		cv2 = (ContractVariation) it.next();
+		assertEquals( cv2.getText(), "more expensive" );
+		s.delete(c);
+		assertEquals( s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		assertEquals( s.createCriteria(ContractVariation.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 3 );
+	}
+
+	public void testImmutableCollectionWithMerge() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gavin", "phone");
+		ContractVariation cv1 = new ContractVariation(1, c);
+		cv1.setText("expensive");
+		ContractVariation cv2 = new ContractVariation(2, c);
+		cv2.setText("more expensive");
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(c);
+		t.commit();
+		s.close();
+
+		assertInsertCount( 3 );
+		assertUpdateCount( 0 );
+
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c.getVariations().add( new ContractVariation(3, c) );
+		s.merge( c );
+		try {
+			t.commit();
+			fail( "should have failed because an immutable collection was changed");
+		}
+		catch ( HibernateException ex ) {
+			// expected
+			t.rollback();
+		}
+		finally {
+			s.close();
+		}
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria(Contract.class).uniqueResult();
+		assertEquals( c.getCustomerName(), "gavin" );
+		assertEquals( c.getVariations().size(), 2 );
+		Iterator it = c.getVariations().iterator();
+		cv1 = (ContractVariation) it.next();
+		assertEquals( cv1.getText(), "expensive" );
+		cv2 = (ContractVariation) it.next();
+		assertEquals( cv2.getText(), "more expensive" );
+		s.delete(c);
+		assertEquals( s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		assertEquals( s.createCriteria(ContractVariation.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 3 );		
+	}
+
+	public void testNewEntityViaImmutableEntityWithImmutableCollectionUsingSaveOrUpdate() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gavin", "phone");
+		ContractVariation cv1 = new ContractVariation(1, c);
+		cv1.setText("expensive");
+		ContractVariation cv2 = new ContractVariation(2, c);
+		cv2.setText("more expensive");
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(c);
+		t.commit();
+		s.close();
+
+		assertInsertCount( 3 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		cv1.getInfos().add( new Info( "cv1 info" ) );
+		s.saveOrUpdate( c );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( 0 );
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria(Contract.class).uniqueResult();
+		assertEquals( c.getCustomerName(), "gavin" );
+		assertEquals( c.getVariations().size(), 2 );
+		Iterator it = c.getVariations().iterator();
+		cv1 = (ContractVariation) it.next();
+		assertEquals( cv1.getText(), "expensive" );
+		assertEquals( 1, cv1.getInfos().size() );
+		assertEquals( "cv1 info", ( ( Info ) cv1.getInfos().iterator().next() ).getText() );
+		cv2 = (ContractVariation) it.next();
+		assertEquals( cv2.getText(), "more expensive" );
+		s.delete(c);
+		assertEquals( s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		assertEquals( s.createCriteria(ContractVariation.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 4 );
+	}
+
+	public void testNewEntityViaImmutableEntityWithImmutableCollectionUsingMerge() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gavin", "phone");
+		ContractVariation cv1 = new ContractVariation(1, c);
+		cv1.setText("expensive");
+		ContractVariation cv2 = new ContractVariation(2, c);
+		cv2.setText("more expensive");
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(c);
+		t.commit();
+		s.close();
+
+		assertInsertCount( 3 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		cv1.getInfos().add( new Info( "cv1 info" ) );
+		s.merge( c );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( 0 );
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria(Contract.class).uniqueResult();
+		assertEquals( c.getCustomerName(), "gavin" );
+		assertEquals( c.getVariations().size(), 2 );
+		Iterator it = c.getVariations().iterator();
+		cv1 = (ContractVariation) it.next();
+		assertEquals( cv1.getText(), "expensive" );
+		assertEquals( 1, cv1.getInfos().size() );
+		assertEquals( "cv1 info", ( ( Info ) cv1.getInfos().iterator().next() ).getText() );
+		cv2 = (ContractVariation) it.next();
+		assertEquals( cv2.getText(), "more expensive" );
+		s.delete(c);
+		assertEquals( s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		assertEquals( s.createCriteria(ContractVariation.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 4 );
+	}
+
+	public void testUpdatedEntityViaImmutableEntityWithImmutableCollectionUsingSaveOrUpdate() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gavin", "phone");
+		ContractVariation cv1 = new ContractVariation(1, c);
+		cv1.setText("expensive");
+		Info cv1Info = new Info( "cv1 info" );
+		cv1.getInfos().add( cv1Info );
+		ContractVariation cv2 = new ContractVariation(2, c);
+		cv2.setText("more expensive");
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(c);
+		t.commit();
+		s.close();
+
+		assertInsertCount( 4 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		cv1Info.setText( "new cv1 info" );
+		s.saveOrUpdate( c );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 0 );
+		assertUpdateCount( 1 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria(Contract.class).uniqueResult();
+		assertEquals( c.getCustomerName(), "gavin" );
+		assertEquals( c.getVariations().size(), 2 );
+		Iterator it = c.getVariations().iterator();
+		cv1 = (ContractVariation) it.next();
+		assertEquals( cv1.getText(), "expensive" );
+		assertEquals( 1, cv1.getInfos().size() );
+		assertEquals( "new cv1 info", ( ( Info ) cv1.getInfos().iterator().next() ).getText() );
+		cv2 = (ContractVariation) it.next();
+		assertEquals( cv2.getText(), "more expensive" );
+		s.delete(c);
+		assertEquals( s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		assertEquals( s.createCriteria(ContractVariation.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 4 );
+	}
+
+	public void testUpdatedEntityViaImmutableEntityWithImmutableCollectionUsingMerge() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gavin", "phone");
+		ContractVariation cv1 = new ContractVariation(1, c);
+		cv1.setText("expensive");
+		Info cv1Info = new Info( "cv1 info" );
+		cv1.getInfos().add( cv1Info );
+		ContractVariation cv2 = new ContractVariation(2, c);
+		cv2.setText("more expensive");
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(c);
+		t.commit();
+		s.close();
+
+		assertInsertCount( 4 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		cv1Info.setText( "new cv1 info" );
+		s.merge( c );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 0 );
+		assertUpdateCount( 1 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria(Contract.class).uniqueResult();
+		assertEquals( c.getCustomerName(), "gavin" );
+		assertEquals( c.getVariations().size(), 2 );
+		Iterator it = c.getVariations().iterator();
+		cv1 = (ContractVariation) it.next();
+		assertEquals( cv1.getText(), "expensive" );
+		assertEquals( 1, cv1.getInfos().size() );
+		assertEquals( "new cv1 info", ( ( Info ) cv1.getInfos().iterator().next() ).getText() );
+		cv2 = (ContractVariation) it.next();
+		assertEquals( cv2.getText(), "more expensive" );
+		s.delete(c);
+		assertEquals( s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		assertEquals( s.createCriteria(ContractVariation.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 4 );
+	}
+
+	public void testImmutableEntityAddImmutableToInverseMutableCollection() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gavin", "phone");
+		ContractVariation cv1 = new ContractVariation(1, c);
+		cv1.setText("expensive");
+		ContractVariation cv2 = new ContractVariation(2, c);
+		cv2.setText("more expensive");
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(c);
+		Party party = new Party( "a party" );
+		s.persist( party );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 4 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c.addParty( new Party( "a new party" ) );
+		s.update( c );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c.addParty( party );
+		s.update( c );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria(Contract.class).uniqueResult();
+		assertEquals( c.getCustomerName(), "gavin" );
+		assertEquals( c.getVariations().size(), 2 );
+		Iterator it = c.getVariations().iterator();
+		cv1 = (ContractVariation) it.next();
+		assertEquals( cv1.getText(), "expensive" );
+		cv2 = (ContractVariation) it.next();
+		assertEquals( cv2.getText(), "more expensive" );
+		//assertEquals( 2, c.getParties().size() );
+		s.delete(c);
+		assertEquals( s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		assertEquals( s.createCriteria(ContractVariation.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 4 );
+	}
+	
+	public void testImmutableEntityRemoveImmutableFromInverseMutableCollection() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gavin", "phone");
+		ContractVariation cv1 = new ContractVariation(1, c);
+		cv1.setText("expensive");
+		ContractVariation cv2 = new ContractVariation(2, c);
+		cv2.setText("more expensive");
+		Party party = new Party( "party1" );
+		c.addParty( party );
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(c);
+		t.commit();
+		s.close();
+
+		assertInsertCount( 4 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		party = ( Party ) c.getParties().iterator().next();
+		c.removeParty( party );
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.update( c );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria(Contract.class).uniqueResult();
+		assertEquals( c.getCustomerName(), "gavin" );
+		assertEquals( c.getVariations().size(), 2 );
+		Iterator it = c.getVariations().iterator();
+		cv1 = (ContractVariation) it.next();
+		assertEquals( cv1.getText(), "expensive" );
+		cv2 = (ContractVariation) it.next();
+		assertEquals( cv2.getText(), "more expensive" );
+		//assertEquals( 0, c.getParties().size() );
+		s.delete(c);
+		assertEquals( s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		assertEquals( s.createCriteria(ContractVariation.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 4 );
+	}
+
+	public void testImmutableEntityRemoveImmutableFromInverseMutableCollectionByDelete() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gavin", "phone");
+		ContractVariation cv1 = new ContractVariation(1, c);
+		cv1.setText("expensive");
+		ContractVariation cv2 = new ContractVariation(2, c);
+		cv2.setText("more expensive");
+		Party party = new Party( "party1" );
+		c.addParty( party );
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(c);
+		t.commit();
+		s.close();
+
+		assertInsertCount( 4 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		party = ( Party ) c.getParties().iterator().next();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete( party );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 1 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria(Contract.class).uniqueResult();
+		assertEquals( c.getCustomerName(), "gavin" );
+		assertEquals( c.getVariations().size(), 2 );
+		Iterator it = c.getVariations().iterator();
+		cv1 = (ContractVariation) it.next();
+		assertEquals( cv1.getText(), "expensive" );
+		cv2 = (ContractVariation) it.next();
+		assertEquals( cv2.getText(), "more expensive" );
+		assertEquals( 0, c.getParties().size() );
+		s.delete(c);
+		assertEquals( s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		assertEquals( s.createCriteria(ContractVariation.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 3 );
+	}
+
+	public void testImmutableEntityRemoveImmutableFromInverseMutableCollectionByDeref() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gavin", "phone");
+		ContractVariation cv1 = new ContractVariation(1, c);
+		cv1.setText("expensive");
+		ContractVariation cv2 = new ContractVariation(2, c);
+		cv2.setText("more expensive");
+		Party party = new Party( "party1" );
+		c.addParty( party );
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(c);
+		t.commit();
+		s.close();
+
+		assertInsertCount( 4 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		party = ( Party ) c.getParties().iterator().next();
+		party.setContract( null );
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.update( party );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		party = ( Party ) s.get( Party.class, party.getId() );
+		assertNotNull( party.getContract() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria(Contract.class).uniqueResult();
+		assertEquals( c.getCustomerName(), "gavin" );
+		assertEquals( c.getVariations().size(), 2 );
+		Iterator it = c.getVariations().iterator();
+		cv1 = (ContractVariation) it.next();
+		assertEquals( cv1.getText(), "expensive" );
+		cv2 = (ContractVariation) it.next();
+		assertEquals( cv2.getText(), "more expensive" );
+		assertEquals( 1, c.getParties().size() );
+	    party = ( Party ) c.getParties().iterator().next();
+		assertEquals( "party1", party.getName() );
+		assertSame( c, party.getContract() );
+		s.delete(c);
+		assertEquals( s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		assertEquals( s.createCriteria(ContractVariation.class).setProjection( Projections.rowCount() ).uniqueResult(), new Long(0) );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 4 );
+	}
+
+	protected void clearCounts() {
+		getSessions().getStatistics().clear();
+	}
+
+	protected void assertInsertCount(int expected) {
+		int inserts = ( int ) getSessions().getStatistics().getEntityInsertCount();
+		assertEquals( "unexpected insert count", expected, inserts );
+	}
+
+	protected void assertUpdateCount(int expected) {
+		int updates = ( int ) getSessions().getStatistics().getEntityUpdateCount();
+		assertEquals( "unexpected update counts", expected, updates );
+	}
+
+	protected void assertDeleteCount(int expected) {
+		int deletes = ( int ) getSessions().getStatistics().getEntityDeleteCount();
+		assertEquals( "unexpected delete counts", expected, deletes );
+	}
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/ImmutableTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/Info.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/Info.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/Info.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,43 @@
+//$Id: Contract.java 7222 2005-06-19 17:22:01Z oneovthafew $
+package org.hibernate.test.immutable;
+
+import java.io.Serializable;
+
+public class Info implements Serializable {
+
+	private long id;
+	private String text;
+	private long version;
+
+	public Info() {
+		super();
+	}
+
+	public Info(String text) {
+		this.text = text;
+	}
+
+	public long getVersion() {
+		return version;
+	}
+
+	public void setVersion(long version) {
+		this.version = version;
+	}
+
+	public String getText() {
+		return text;
+	}
+
+	public void setText(String text) {
+		this.text = text;
+	}
+
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/Info.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/Party.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/Party.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/Party.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,65 @@
+//$Id: Contract.java 7222 2005-06-19 17:22:01Z oneovthafew $
+package org.hibernate.test.immutable;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class Party implements Serializable {
+
+	private long id;
+	private long version;
+	private Contract contract;
+	private String name;
+	private Set infos = new HashSet();
+
+	public Party() {
+		super();
+	}
+
+	public Party(String name) {
+		this.name = name;
+	}
+
+	public long getVersion() {
+		return version;
+	}
+
+	public void setVersion(long version) {
+		this.version = version;
+	}
+	
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	public Contract getContract() {
+		return contract;
+	}
+
+	public void setContract(Contract contract) {
+		this.contract = contract;
+	}
+
+	public Set getInfos() {
+		return infos;
+	}
+
+	public void setInfos(Set infos) {
+		this.infos = infos;
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/Party.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/Plan.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/Plan.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/Plan.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,99 @@
+//$Id: ContractVariation.java 7222 2005-06-19 17:22:01Z oneovthafew $
+package org.hibernate.test.immutable;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+public class Plan implements Serializable {
+
+	private long id;
+	private long version;
+	private String description;
+	private Set contracts;
+	private Set infos;
+
+	public Plan() {
+		this( null );
+	}
+
+	public Plan(String description) {
+		this.description = description;
+		contracts = new HashSet();
+		infos = new HashSet();
+	}
+
+	public long getVersion() {
+		return version;
+	}
+
+	public void setVersion(long version) {
+		this.version = version;
+	}
+
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	public String getDescription() {
+		return description;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
+	public Set getContracts() {
+		return contracts;
+	}
+
+	public void setContracts(Set contracts) {
+		this.contracts = contracts;
+	}
+
+	public void addContract(Contract contract) {
+		if ( ! contracts.add( contract ) ) {
+			return;
+		}
+		if ( contract.getParent() != null ) {
+			addContract( contract.getParent() );
+		}
+		contract.getPlans().add( this );
+		for ( Iterator it=contract.getSubcontracts().iterator(); it.hasNext(); ) {
+			Contract sub = ( Contract ) it.next();
+			addContract( sub );
+		}
+	}
+
+	public void removeContract(Contract contract) {
+		if ( contract.getParent() != null ) {
+			contract.getParent().getSubcontracts().remove( contract );
+			contract.setParent( null );			
+		}
+		removeSubcontracts( contract );
+		contract.getPlans().remove( this );
+		contracts.remove( contract );
+	}
+
+	public void removeSubcontracts(Contract contract) {
+		for ( Iterator it=contract.getSubcontracts().iterator(); it.hasNext(); ) {
+			Contract sub = ( Contract ) it.next();
+			removeSubcontracts( sub );
+			sub.getPlans().remove( this );
+			contracts.remove( sub );
+		}
+	}
+
+	public Set getInfos() {
+		return infos;
+	}
+
+	public void setInfos(Set infos) {
+		this.infos = infos;
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/Plan.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/AbstractEntityWithManyToManyTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/AbstractEntityWithManyToManyTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/AbstractEntityWithManyToManyTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,1103 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.immutable.entitywithmutablecollection;
+
+import java.util.Iterator;
+
+import org.hibernate.MappingException;
+import org.hibernate.Session;
+import org.hibernate.StaleObjectStateException;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.criterion.Projections;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.impl.SessionFactoryImpl;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+
+/**
+ * @author Gail Badner
+ */
+public abstract class AbstractEntityWithManyToManyTest extends FunctionalTestCase {
+	private boolean isPlanContractsInverse;
+	private boolean isPlanContractsBidirectional;
+	private boolean isPlanVersioned;
+	private boolean isContractVersioned;
+
+	public AbstractEntityWithManyToManyTest(String str) {
+		super(str);
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setProperty( Environment.GENERATE_STATISTICS, "true");
+		cfg.setProperty( Environment.STATEMENT_BATCH_SIZE, "0" );
+	}
+
+	public abstract String[] getMappings();
+
+	protected void prepareTest() throws Exception {
+		super.prepareTest();
+		isPlanContractsInverse = ( ( SessionFactoryImpl ) getSessions() ).getCollectionPersister( Plan.class.getName() + ".contracts" ).isInverse();
+		try {
+			 ( ( SessionFactoryImpl ) getSessions() ).getCollectionPersister( Contract.class.getName() + ".plans" );
+			isPlanContractsBidirectional = true;
+		}
+		catch ( MappingException ex) {
+			isPlanContractsBidirectional = false;	
+		}
+		isPlanVersioned = ( ( SessionFactoryImpl ) getSessions() ).getEntityPersister( Plan.class.getName() ).isVersioned();
+		isContractVersioned = ( ( SessionFactoryImpl ) getSessions() ).getEntityPersister( Contract.class.getName() ).isVersioned();
+	}
+
+	public void testUpdateProperty() {
+		clearCounts();
+
+		Plan p = new Plan( "plan" );
+		p.addContract( new Contract( null, "gail", "phone") );
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(p);
+		t.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		p = (Plan) s.createCriteria( Plan.class ).uniqueResult();
+		p.setDescription( "new plan" );
+		assertEquals( 1, p.getContracts().size() );
+		Contract c = ( Contract ) p.getContracts().iterator().next();
+		c.setCustomerName( "yogi" );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		p = (Plan) s.createCriteria( Plan.class ).uniqueResult();
+		assertEquals( 1, p.getContracts().size() );
+		c = ( Contract ) p.getContracts().iterator().next();
+		assertEquals( "gail", c.getCustomerName() );
+		if ( isPlanContractsBidirectional ) {
+			assertEquals( 1, c.getPlans().size() );
+			assertSame( p, c.getPlans().iterator().next() );
+		}
+		s.delete( p );
+		assertEquals( new Long( 0 ), s.createCriteria( Contract.class ).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria( Plan.class ).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 2 );
+	}
+
+	public void testCreateWithNonEmptyManyToManyCollectionOfNew() {
+		clearCounts();
+
+		Plan p = new Plan( "plan" );
+		p.addContract( new Contract( null, "gail", "phone") );
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(p);
+		t.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		p = ( Plan ) s.createCriteria( Plan.class ).uniqueResult();
+		assertEquals( 1, p.getContracts().size() );
+		Contract c = ( Contract ) p.getContracts().iterator().next();
+		assertEquals( "gail", c.getCustomerName() );
+		if ( isPlanContractsBidirectional ) {
+			assertEquals( 1, c.getPlans().size() );
+			assertSame( p, c.getPlans().iterator().next() );
+		}
+		s.delete(p);
+		assertEquals( new Long( 0 ), s.createCriteria( Contract.class ).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria( Plan.class ).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 2 );
+	}
+
+	public void testCreateWithNonEmptyManyToManyCollectionOfExisting() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gail", "phone");
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(c);
+		t.commit();
+		s.close();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		Plan p = new Plan( "plan" );
+		p.addContract( c );
+		s = openSession();
+		t = s.beginTransaction();
+		s.save(p);
+		t.commit();
+		s.close();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( isContractVersioned ? 1 : 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		p = ( Plan ) s.createCriteria( Plan.class ).uniqueResult();
+		assertEquals( 1, p.getContracts().size() );
+		c = ( Contract ) p.getContracts().iterator().next();
+		assertEquals( "gail", c.getCustomerName() );
+		if ( isPlanContractsBidirectional ) {
+			assertEquals( 1, c.getPlans().size() );
+			assertSame( p, c.getPlans().iterator().next() );
+		}
+		s.delete(p);
+		assertEquals( new Long( 0 ), s.createCriteria( Contract.class ).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria( Plan.class ).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 2 );
+	}
+
+	public void testAddNewManyToManyElementToPersistentEntity() {
+		clearCounts();
+
+		Plan p = new Plan( "plan" );
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist( p );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		p = ( Plan ) s.get( Plan.class, p.getId() );
+		assertEquals( 0, p.getContracts().size() );
+		p.addContract( new Contract( null, "gail", "phone") );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( isContractVersioned ? 1 : 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		p = ( Plan) s.createCriteria( Plan.class ).uniqueResult();
+		assertEquals( 1, p.getContracts().size() );
+		Contract c = ( Contract ) p.getContracts().iterator().next();
+		assertEquals( "gail", c.getCustomerName() );
+		if ( isPlanContractsBidirectional ) {
+			assertEquals( 1, c.getPlans().size() );
+			assertSame( p, c.getPlans().iterator().next() );
+		}
+		s.delete( p );
+		assertEquals( new Long( 0 ), s.createCriteria( Contract.class ).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria( Plan.class ).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 2 );
+	}
+
+	public void testAddExistingManyToManyElementToPersistentEntity() {
+		clearCounts();
+
+		Plan p = new Plan( "plan" );
+		Contract c = new Contract( null, "gail", "phone" );
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist( p );
+		s.persist( c );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		p = ( Plan ) s.get( Plan.class, p.getId() );
+		assertEquals( 0, p.getContracts().size() );
+		c = ( Contract ) s.get( Contract.class, c.getId() );
+		if ( isPlanContractsBidirectional ) {
+			assertEquals( 0, c.getPlans().size() );
+		}
+		p.addContract( c );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 0 );
+		assertUpdateCount( isContractVersioned && isPlanVersioned ? 2 : 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		p = ( Plan ) s.createCriteria( Plan.class ).uniqueResult();
+		assertEquals( 1, p.getContracts().size() );
+		c = ( Contract ) p.getContracts().iterator().next();
+		assertEquals( "gail", c.getCustomerName() );
+		if ( isPlanContractsBidirectional ) {
+			assertSame( p, c.getPlans().iterator().next() );
+		}
+		s.delete( p );
+		assertEquals( new Long( 0 ), s.createCriteria( Plan.class ).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria( Contract.class ).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 2 );
+	}
+
+	public void testCreateWithEmptyManyToManyCollectionUpdateWithExistingElement() {
+		clearCounts();
+
+		Plan p = new Plan( "plan" );
+		Contract c = new Contract( null, "gail", "phone");
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist( p );
+		s.persist( c );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		p.addContract( c );
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.update( p );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 0 );
+		assertUpdateCount( isContractVersioned && isPlanVersioned ? 2 : 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		p = ( Plan ) s.createCriteria( Plan.class ).uniqueResult();
+		assertEquals( 1, p.getContracts().size() );
+		c = ( Contract ) p.getContracts().iterator().next();
+		assertEquals( "gail", c.getCustomerName() );
+		if ( isPlanContractsBidirectional ) {
+			assertSame( p, c.getPlans().iterator().next() );
+		}
+		s.delete( p );
+		assertEquals( new Long( 0 ), s.createCriteria( Contract.class ).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria( Plan.class ).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 2 );
+	}
+
+	public void testCreateWithNonEmptyManyToManyCollectionUpdateWithNewElement() {
+		clearCounts();
+
+		Plan p = new Plan( "plan" );
+		Contract c = new Contract( null, "gail", "phone");
+		p.addContract( c );
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(p);
+		t.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		Contract newC = new Contract( null, "sherman", "telepathy" );
+		p.addContract( newC );
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.update( p );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( isContractVersioned ? 1 : 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		p = ( Plan ) s.createCriteria( Plan.class ).uniqueResult();
+		assertEquals( 2, p.getContracts().size() );
+		for ( Iterator it=p.getContracts().iterator(); it.hasNext(); ) {
+			Contract aContract = ( Contract ) it.next();
+			if ( aContract.getId() == c.getId() ) {
+				assertEquals( "gail", aContract.getCustomerName() );
+			}
+			else if ( aContract.getId() == newC.getId() ) {
+				assertEquals( "sherman", aContract.getCustomerName() );
+			}
+			else {
+				fail( "unknown contract" );
+			}
+			if ( isPlanContractsBidirectional ) {
+				assertSame( p, aContract.getPlans().iterator().next() );
+			}
+		}
+		s.delete( p );
+		assertEquals( new Long( 0 ), s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria(Plan.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 3 );
+	}
+
+	public void testCreateWithEmptyManyToManyCollectionMergeWithExistingElement() {
+		clearCounts();
+
+		Plan p = new Plan( "plan" );
+		Contract c = new Contract( null, "gail", "phone");
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist( p );
+		s.persist( c );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		p.addContract( c );
+
+		s = openSession();
+		t = s.beginTransaction();
+		p = ( Plan ) s.merge( p );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 0 );
+		assertUpdateCount( isContractVersioned && isPlanVersioned ? 2 : 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		p = ( Plan ) s.createCriteria( Plan.class ).uniqueResult();
+		assertEquals( 1, p.getContracts().size() );
+		c = ( Contract ) p.getContracts().iterator().next();
+		assertEquals( "gail", c.getCustomerName() );
+		if ( isPlanContractsBidirectional ) {
+			assertSame( p, c.getPlans().iterator().next() );
+		}
+		s.delete( p );
+		assertEquals( new Long( 0 ), s.createCriteria(Plan.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 2 );
+	}
+
+	public void testCreateWithNonEmptyManyToManyCollectionMergeWithNewElement() {
+		clearCounts();
+
+		Plan p = new Plan( "plan" );
+		Contract c = new Contract( null, "gail", "phone");
+		p.addContract( c );
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist( p );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		Contract newC = new Contract( null, "yogi", "mail" );
+		p.addContract( newC );
+
+		s = openSession();
+		t = s.beginTransaction();
+		p = ( Plan ) s.merge( p );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( isContractVersioned && isPlanVersioned ? 2 : 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		p = ( Plan ) s.createCriteria( Plan.class ).uniqueResult();
+		assertEquals( 2, p.getContracts().size() );
+		for ( Iterator it=p.getContracts().iterator(); it.hasNext(); ) {
+			Contract aContract = ( Contract ) it.next();
+			if ( aContract.getId() == c.getId() ) {
+				assertEquals( "gail", aContract.getCustomerName() );
+			}
+			else if ( ! aContract.getCustomerName().equals( newC.getCustomerName() ) ) {
+				fail( "unknown contract:" + aContract.getCustomerName() );
+			}
+			if ( isPlanContractsBidirectional ) {
+				assertSame( p, aContract.getPlans().iterator().next() );
+			}
+		}
+		s.delete( p );
+		assertEquals( new Long( 0 ), s.createCriteria( Plan.class ).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria( Contract.class ).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 3 );
+	}
+
+	public void testRemoveManyToManyElementUsingUpdate() {
+		clearCounts();
+
+		Plan p = new Plan( "plan" );
+		Contract c = new Contract( null, "gail", "phone");
+		p.addContract( c );
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist( p );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		p.removeContract( c );
+		assertEquals( 0, p.getContracts().size() );
+		if ( isPlanContractsBidirectional ) {
+			assertEquals( 0, c.getPlans().size() );
+		}
+		s = openSession();
+		t = s.beginTransaction();
+		s.update( p );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( isContractVersioned ? 1 : 0 );
+		assertDeleteCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		p = ( Plan ) s.createCriteria( Plan.class ).uniqueResult();
+		if ( isPlanContractsInverse ) {
+			assertEquals( 1, p.getContracts().size() );
+			c = ( Contract ) p.getContracts().iterator().next();
+			assertEquals( "gail", c.getCustomerName() );
+			assertSame( p, c.getPlans().iterator().next() );
+		}
+		else {
+			assertEquals( 0, p.getContracts().size() );
+			c = ( Contract ) s.createCriteria( Contract.class ).uniqueResult();
+			if ( isPlanContractsBidirectional ) {
+				assertEquals( 0, c.getPlans().size() );
+			}
+			s.delete( c );
+		}
+		s.delete( p );
+		assertEquals( new Long( 0 ), s.createCriteria(Plan.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 2 );
+	}
+
+	public void testRemoveManyToManyElementUsingUpdateBothSides() {
+		clearCounts();
+
+		Plan p = new Plan( "plan" );
+		Contract c = new Contract( null, "gail", "phone");
+		p.addContract( c );
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist( p );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		p.removeContract( c );
+		assertEquals( 0, p.getContracts().size() );
+		if ( isPlanContractsBidirectional ) {
+			assertEquals( 0, c.getPlans().size() );
+		}
+		s = openSession();
+		t = s.beginTransaction();
+		s.update( p );
+		s.update( c );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( isContractVersioned && isPlanVersioned ? 2 : 0 );
+		assertDeleteCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		p = ( Plan ) s.createCriteria( Plan.class ).uniqueResult();
+		assertEquals( 0, p.getContracts().size() );
+		c = ( Contract ) s.createCriteria( Contract.class ).uniqueResult();
+		if ( isPlanContractsBidirectional ) {
+			assertEquals( 0, c.getPlans().size() );
+		}
+		s.delete( c );
+		s.delete( p );
+		assertEquals( new Long( 0 ), s.createCriteria(Plan.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 2 );
+	}
+
+	public void testRemoveManyToManyElementUsingMerge() {
+		clearCounts();
+
+		Plan p = new Plan( "plan" );
+		Contract c = new Contract( null, "gail", "phone");
+		p.addContract( c );
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist( p );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		p.removeContract( c );
+		assertEquals( 0, p.getContracts().size() );
+		if ( isPlanContractsBidirectional ) {
+			assertEquals( 0, c.getPlans().size() );
+		}
+		s = openSession();
+		t = s.beginTransaction();
+		p = ( Plan ) s.merge( p );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( isContractVersioned ? 1 : 0 );
+		assertDeleteCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		p = ( Plan ) s.createCriteria( Plan.class ).uniqueResult();
+		if ( isPlanContractsInverse ) {
+			assertEquals( 1, p.getContracts().size() );
+			c = ( Contract ) p.getContracts().iterator().next();
+			assertEquals( "gail", c.getCustomerName() );
+			assertSame( p, c.getPlans().iterator().next() );
+		}
+		else {
+			assertEquals( 0, p.getContracts().size() );
+			c = ( Contract ) s.createCriteria( Contract.class ).uniqueResult();
+			if ( isPlanContractsBidirectional ) {
+				assertEquals( 0, c.getPlans().size() );
+			}
+			s.delete( c );
+		}
+		s.delete( p );
+		assertEquals( new Long( 0 ), s.createCriteria(Plan.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 2 );
+	}
+
+	public void testRemoveManyToManyElementUsingMergeBothSides() {
+		clearCounts();
+
+		Plan p = new Plan( "plan" );
+		Contract c = new Contract( null, "gail", "phone");
+		p.addContract( c );
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist( p );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		p.removeContract( c );
+		assertEquals( 0, p.getContracts().size() );
+		if ( isPlanContractsBidirectional ) {
+			assertEquals( 0, c.getPlans().size() );
+		}
+
+		s = openSession();
+		t = s.beginTransaction();
+		p = ( Plan ) s.merge( p );
+		c = ( Contract ) s.merge( c );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( isContractVersioned  && isPlanVersioned ? 2 : 0 );
+		assertDeleteCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		p = ( Plan ) s.createCriteria( Plan.class ).uniqueResult();
+		assertEquals( 0, p.getContracts().size() );
+		c = ( Contract ) s.createCriteria( Contract.class ).uniqueResult();
+		if ( isPlanContractsBidirectional ) {
+			assertEquals( 0, c.getPlans().size() );
+		}
+		s.delete( c );
+		s.delete( p );
+		assertEquals( new Long( 0 ), s.createCriteria(Plan.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 2 );
+	}
+
+	public void testDeleteManyToManyElement() {
+		clearCounts();
+
+		Plan p = new Plan( "plan" );
+		Contract c = new Contract( null, "gail", "phone");
+		p.addContract( c );
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist( p );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.update( p );
+		p.removeContract( c );
+		s.delete( c );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( isContractVersioned ? 1 : 0 );
+		assertDeleteCount( 1 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		p = ( Plan ) s.createCriteria( Plan.class ).uniqueResult();
+		assertEquals( 0, p.getContracts().size() );
+		c = ( Contract ) s.createCriteria( Contract.class ).uniqueResult();
+		assertNull( c );
+		s.delete( p );
+		assertEquals( new Long( 0 ), s.createCriteria(Plan.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 1 );
+	}
+
+	public void testRemoveManyToManyElementByDelete() {
+		clearCounts();
+
+		Plan p = new Plan( "plan" );
+		Contract c = new Contract( null, "gail", "phone");
+		p.addContract( c );
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist( p );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		p.removeContract( c );
+		assertEquals( 0, p.getContracts().size() );
+		if ( isPlanContractsBidirectional ) {
+			assertEquals( 0, c.getPlans().size() );
+		}
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.update( p );
+		s.delete( c );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( isPlanVersioned ? 1 : 0 );
+		assertDeleteCount( 1 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		p = ( Plan ) s.createCriteria( Plan.class ).uniqueResult();
+		assertEquals( 0, p.getContracts().size() );
+		s.delete( p );
+		assertEquals( new Long( 0 ), s.createCriteria(Plan.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 1 );
+	}
+
+	public void testManyToManyCollectionOptimisticLockingWithMerge() {
+		clearCounts();
+
+		Plan pOrig = new Plan( "plan" );
+		Contract cOrig = new Contract( null, "gail", "phone");
+		pOrig.addContract( cOrig );
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist( pOrig );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Plan p = ( Plan ) s.get( Plan.class, pOrig.getId() );
+		Contract newC = new Contract( null, "sherman", "note" );
+		p.addContract( newC );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( isContractVersioned ? 1 : 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		pOrig.removeContract( cOrig );
+		try {
+			s.merge( pOrig );
+			assertFalse( isContractVersioned );
+		}
+		catch (StaleObjectStateException ex) {
+			assertTrue( isContractVersioned);
+		}
+		finally {
+			t.rollback();
+		}
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		p = ( Plan ) s.createCriteria( Plan.class ).uniqueResult();
+		s.delete( p );
+		assertEquals( new Long( 0 ), s.createCriteria(Plan.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 3 );
+	}
+
+	public void testManyToManyCollectionOptimisticLockingWithUpdate() {
+		clearCounts();
+
+		Plan pOrig = new Plan( "plan" );
+		Contract cOrig = new Contract( null, "gail", "phone");
+		pOrig.addContract( cOrig );
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(pOrig);
+		t.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Plan p = ( Plan ) s.get( Plan.class, pOrig.getId() );
+		Contract newC = new Contract( null, "yogi", "pawprint" );
+		p.addContract( newC );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( isContractVersioned ? 1 : 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		pOrig.removeContract( cOrig );
+		s.update( pOrig );
+		try {
+			t.commit();
+			assertFalse( isContractVersioned );
+		}
+		catch (StaleObjectStateException ex) {
+			assertTrue( isContractVersioned);
+			t.rollback();
+		}
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		p = ( Plan ) s.createCriteria( Plan.class ).uniqueResult();
+		s.delete( p );
+		s.createQuery( "delete from Contract" ).executeUpdate();
+		assertEquals( new Long( 0 ), s.createCriteria(Plan.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+	}
+
+	public void testMoveManyToManyElementToNewEntityCollection() {
+		clearCounts();
+
+		Plan p = new Plan( "plan" );
+		p.addContract( new Contract( null, "gail", "phone" ) );
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist( p );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		p = (Plan) s.createCriteria( Plan.class ).uniqueResult();
+		assertEquals( 1, p.getContracts().size() );
+		Contract c = ( Contract ) p.getContracts().iterator().next();
+		assertEquals( "gail", c.getCustomerName() );
+		if ( isPlanContractsBidirectional ) {
+			assertSame( p, c.getPlans().iterator().next() );
+		}
+		p.removeContract( c );
+		Plan p2 = new Plan( "new plan" );
+		p2.addContract( c );
+		s.save( p2 );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( isPlanVersioned && isContractVersioned ? 2 : 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		p = (Plan) s.createCriteria( Plan.class ).add( Restrictions.idEq( new Long( p.getId() ) )).uniqueResult();
+		p2 = (Plan) s.createCriteria( Plan.class ).add( Restrictions.idEq( new Long( p2.getId() ) )).uniqueResult();
+		/*
+		if ( isPlanContractsInverse ) {
+			assertEquals( 1, p.getContracts().size() );
+			c = ( Contract ) p.getContracts().iterator().next();
+			assertEquals( "gail", c.getCustomerName() );
+			if ( isPlanContractsBidirectional ) {
+				assertSame( p, c.getPlans().iterator().next() );
+			}
+			assertEquals( 0, p2.getContracts().size() );
+		}
+		else {
+		*/
+			assertEquals( 0, p.getContracts().size() );
+			assertEquals( 1, p2.getContracts().size() );
+			c = ( Contract ) p2.getContracts().iterator().next();
+			assertEquals( "gail", c.getCustomerName() );
+			if ( isPlanContractsBidirectional ) {
+				assertSame( p2, c.getPlans().iterator().next() );
+			}
+		//}
+		s.delete( p );
+		s.delete( p2 );
+		assertEquals( new Long( 0 ), s.createCriteria( Plan.class ).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria( Contract.class ).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 3 );
+	}
+
+	public void testMoveManyToManyElementToExistingEntityCollection() {
+		clearCounts();
+
+		Plan p = new Plan( "plan" );
+		p.addContract( new Contract( null, "gail", "phone" ) );
+		Plan p2 = new Plan( "plan2" );
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist( p );
+		s.persist( p2 );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 3 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		p = (Plan) s.createCriteria( Plan.class ).add( Restrictions.idEq( new Long( p.getId() ) )).uniqueResult();
+		assertEquals( 1, p.getContracts().size() );
+		Contract c = ( Contract ) p.getContracts().iterator().next();
+		assertEquals( "gail", c.getCustomerName() );
+		if ( isPlanContractsBidirectional ) {
+			assertSame( p, c.getPlans().iterator().next() );
+		}
+		p.removeContract( c );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 0 );
+		assertUpdateCount( isPlanVersioned && isContractVersioned ? 2 : 0 );
+		clearCounts();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		p2 = (Plan) s.createCriteria( Plan.class ).add( Restrictions.idEq( new Long( p2.getId() ) )).uniqueResult();
+		c = (Contract) s.createCriteria( Contract.class ).add( Restrictions.idEq( new Long( c.getId() ) )).uniqueResult();
+		p2.addContract( c );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 0 );
+		assertUpdateCount( isPlanVersioned && isContractVersioned ? 2 : 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		p = (Plan) s.createCriteria( Plan.class ).add( Restrictions.idEq( new Long( p.getId() ) )).uniqueResult();
+		p2 = (Plan) s.createCriteria( Plan.class ).add( Restrictions.idEq( new Long( p2.getId() ) )).uniqueResult();
+		/*
+		if ( isPlanContractsInverse ) {
+			assertEquals( 1, p.getContracts().size() );
+			c = ( Contract ) p.getContracts().iterator().next();
+			assertEquals( "gail", c.getCustomerName() );
+			if ( isPlanContractsBidirectional ) {
+				assertSame( p, c.getPlans().iterator().next() );
+			}
+			assertEquals( 0, p2.getContracts().size() );
+		}
+		else {
+		*/
+			assertEquals( 0, p.getContracts().size() );
+			assertEquals( 1, p2.getContracts().size() );
+			c = ( Contract ) p2.getContracts().iterator().next();
+			assertEquals( "gail", c.getCustomerName() );
+			if ( isPlanContractsBidirectional ) {
+				assertSame( p2, c.getPlans().iterator().next() );
+			}
+		//}
+		s.delete( p );
+		s.delete( p2 );
+		assertEquals( new Long( 0 ), s.createCriteria( Plan.class ).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria( Contract.class ).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 3 );
+	}
+
+	protected void clearCounts() {
+		getSessions().getStatistics().clear();
+	}
+
+	protected void assertInsertCount(int expected) {
+		int inserts = ( int ) getSessions().getStatistics().getEntityInsertCount();
+		assertEquals( "unexpected insert count", expected, inserts );
+	}
+
+	protected void assertUpdateCount(int expected) {
+		int updates = ( int ) getSessions().getStatistics().getEntityUpdateCount();
+		assertEquals( "unexpected update counts", expected, updates );
+	}
+
+	protected void assertDeleteCount(int expected) {
+		int deletes = ( int ) getSessions().getStatistics().getEntityDeleteCount();
+		assertEquals( "unexpected delete counts", expected, deletes );
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/AbstractEntityWithManyToManyTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/AbstractEntityWithOneToManyTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/AbstractEntityWithOneToManyTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/AbstractEntityWithOneToManyTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,1180 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.immutable.entitywithmutablecollection;
+
+import java.util.Iterator;
+
+import org.hibernate.QueryException;
+import org.hibernate.Session;
+import org.hibernate.StaleObjectStateException;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.criterion.Projections;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.impl.SessionFactoryImpl;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+
+/**
+ * @author Gail Badner
+ */
+public abstract class AbstractEntityWithOneToManyTest extends FunctionalTestCase {
+	private boolean isContractPartiesInverse;
+	private boolean isContractPartiesBidirectional;
+	private boolean isContractVariationsBidirectional;
+	private boolean isContractVersioned;
+
+	public AbstractEntityWithOneToManyTest(String str) {
+		super(str);
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setProperty( Environment.GENERATE_STATISTICS, "true");
+		cfg.setProperty( Environment.STATEMENT_BATCH_SIZE, "0" );
+	}
+
+	public abstract String[] getMappings();
+
+	protected boolean checkUpdateCountsAfterAddingExistingElement() {
+		return true;
+	}
+
+	protected boolean checkUpdateCountsAfterRemovingElementWithoutDelete() {
+		return true;
+	}
+
+	protected void prepareTest() throws Exception {
+		super.prepareTest();
+		isContractPartiesInverse = ( ( SessionFactoryImpl ) getSessions() ).getCollectionPersister( Contract.class.getName() + ".parties" ).isInverse();
+		try {
+			 ( ( SessionFactoryImpl ) getSessions() ).getEntityPersister( Party.class.getName() ).getPropertyType( "contract" );
+			isContractPartiesBidirectional = true;
+		}
+		catch ( QueryException ex) {
+			isContractPartiesBidirectional = false;
+		}
+		try {
+			 ( ( SessionFactoryImpl ) getSessions() ).getEntityPersister( ContractVariation.class.getName() ).getPropertyType( "contract" );
+			isContractVariationsBidirectional = true;
+		}
+		catch ( QueryException ex) {
+			isContractVariationsBidirectional = false;
+		}
+
+		isContractVersioned = ( ( SessionFactoryImpl ) getSessions() ).getEntityPersister( Contract.class.getName() ).isVersioned();
+	}
+
+	public void testUpdateProperty() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gail", "phone");
+		c.addParty( new Party( "party" ) );
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(c);
+		t.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria( Contract.class ).uniqueResult();
+		c.setCustomerName( "yogi" );
+		assertEquals( 1, c.getParties().size() );
+		Party party = ( Party ) c.getParties().iterator().next();
+		party.setName( "new party" );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria( Contract.class ).uniqueResult();
+		assertEquals( 1, c.getParties().size() );
+		party = ( Party ) c.getParties().iterator().next();
+		assertEquals( "party", party.getName() );
+		if ( isContractPartiesBidirectional ) {
+			assertSame( c, party.getContract() );
+		}
+		s.delete(c);
+		assertEquals( new Long( 0 ), s.createCriteria( Contract.class ).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria( Party.class ).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 2 );
+	}
+
+	public void testCreateWithNonEmptyOneToManyCollectionOfNew() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gail", "phone");
+		c.addParty( new Party( "party" ) );
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(c);
+		t.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria( Contract.class ).uniqueResult();
+		assertEquals( 1, c.getParties().size() );
+		Party party = ( Party ) c.getParties().iterator().next();
+		assertEquals( "party", party.getName() );
+		if ( isContractPartiesBidirectional ) {
+			assertSame( c, party.getContract() );
+		}
+		s.delete(c);
+		assertEquals( new Long( 0 ), s.createCriteria( Contract.class ).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria( Party.class ).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 2 );
+	}
+
+	public void testCreateWithNonEmptyOneToManyCollectionOfExisting() {
+		clearCounts();
+
+		Party party = new Party( "party" );
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist( party );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		Contract c = new Contract( null, "gail", "phone");
+		c.addParty( party );
+		s = openSession();
+		t = s.beginTransaction();
+		s.save( c );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 1 );
+		// BUG, should be assertUpdateCount( ! isContractPartiesInverse && isPartyVersioned ? 1 : 0 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria( Contract.class ).uniqueResult();
+		if ( isContractPartiesInverse ) {
+			assertEquals( 0 , c.getParties().size() );
+			party = ( Party ) s.createCriteria( Party.class ).uniqueResult();
+			assertNull( party.getContract() );
+			s.delete( party );
+		}
+		else {
+			assertEquals( 1 , c.getParties().size() );
+			party = ( Party ) c.getParties().iterator().next();
+			assertEquals( "party", party.getName() );
+			if ( isContractPartiesBidirectional ) {
+				assertSame( c, party.getContract() );
+			}
+		}
+		s.delete(c);
+		assertEquals( new Long( 0 ), s.createCriteria( Contract.class ).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria( Party.class ).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 2 );
+	}
+
+	public void testAddNewOneToManyElementToPersistentEntity() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gail", "phone" );
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist( c );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = ( Contract ) s.get( Contract.class, c.getId() );
+		assertEquals( 0, c.getParties().size() );
+		c.addParty( new Party( "party" ) );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( isContractVersioned ? 1 : 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria( Contract.class ).uniqueResult();
+		assertEquals( 1, c.getParties().size() );
+		Party party = ( Party ) c.getParties().iterator().next();
+		assertEquals( "party", party.getName() );
+		if ( isContractPartiesBidirectional ) {
+			assertSame( c, party.getContract() );
+		}
+		s.delete(c);
+		assertEquals( new Long( 0 ), s.createCriteria( Contract.class ).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria( Party.class ).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 2 );
+	}
+
+	public void testAddExistingOneToManyElementToPersistentEntity() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gail", "phone" );
+		Party party = new Party( "party" );
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist( c );
+		s.persist( party );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = ( Contract ) s.get( Contract.class, c.getId() );
+		assertEquals( 0, c.getParties().size() );
+		party = ( Party ) s.get( Party.class, party.getId() );
+		if ( isContractPartiesBidirectional ) {
+			assertNull( party.getContract() );
+		}
+		c.addParty( party );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 0 );
+		if ( checkUpdateCountsAfterAddingExistingElement() ) {
+			assertUpdateCount( isContractVersioned && ! isContractPartiesInverse ? 1 : 0 );
+		}
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria( Contract.class ).uniqueResult();
+		if ( isContractPartiesInverse ) {
+			assertEquals( 0, c.getParties().size() );
+			s.delete( party );
+		}
+		else {
+			assertEquals( 1, c.getParties().size() );
+			party = ( Party ) c.getParties().iterator().next();
+			assertEquals( "party", party.getName() );
+			if ( isContractPartiesBidirectional ) {
+				assertSame( c, party.getContract() );
+			}
+		}
+		s.delete(c);
+		assertEquals( new Long( 0 ), s.createCriteria( Contract.class ).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria( Party.class ).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 2 );
+	}
+	
+	public void testCreateWithEmptyOneToManyCollectionUpdateWithExistingElement() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gail", "phone");
+		Party party = new Party( "party" );
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist( c );
+		s.persist( party );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		c.addParty( party );
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.update( c );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 0 );
+		if ( checkUpdateCountsAfterAddingExistingElement() ) {
+			assertUpdateCount( isContractVersioned && ! isContractPartiesInverse ? 1 : 0 );
+		}
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria(Contract.class).uniqueResult();
+		if ( isContractPartiesInverse ) {
+			assertEquals( 0, c.getParties().size() );
+			s.delete( party );
+		}
+		else {
+			assertEquals( 1, c.getParties().size() );
+			party = ( Party ) c.getParties().iterator().next();
+			assertEquals( "party", party.getName() );
+			if ( isContractPartiesBidirectional ) {
+				assertSame( c, party.getContract() );
+			}
+		}
+		s.delete(c);
+		assertEquals( new Long( 0 ), s.createCriteria( Contract.class ).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria( Party.class ).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 2 );
+	}
+
+	public void testCreateWithNonEmptyOneToManyCollectionUpdateWithNewElement() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gail", "phone");
+		Party party = new Party( "party" );
+		c.addParty( party );
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(c);
+		t.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		Party newParty = new Party( "new party" );
+		c.addParty( newParty );
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.update( c );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( isContractVersioned ? 1 : 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria(Contract.class).uniqueResult();
+		assertEquals( 2, c.getParties().size() );
+		for ( Iterator it=c.getParties().iterator(); it.hasNext(); ) {
+			Party aParty = ( Party ) it.next();
+			if ( aParty.getId() == party.getId() ) {
+				assertEquals( "party", aParty.getName() );
+			}
+			else if ( aParty.getId() == newParty.getId() ) {
+				assertEquals( "new party", aParty.getName() );
+			}
+			else {
+				fail( "unknown party" );
+			}
+			if ( isContractPartiesBidirectional ) {
+				assertSame( c, aParty.getContract() );
+			}
+		}
+		s.delete(c);
+		assertEquals( new Long( 0 ), s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria(Party.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 3 );
+	}
+
+	public void testCreateWithEmptyOneToManyCollectionMergeWithExistingElement() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gail", "phone");
+		Party party = new Party( "party" );
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist( c );
+		s.persist( party );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		c.addParty( party );
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = ( Contract ) s.merge( c );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 0 );
+		if ( checkUpdateCountsAfterAddingExistingElement() ) {
+			assertUpdateCount( isContractVersioned && ! isContractPartiesInverse ? 1 : 0 );
+		}
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria( Contract.class ).uniqueResult();
+		if ( isContractPartiesInverse ) {
+			assertEquals( 0, c.getParties().size() );
+			s.delete( party );
+		}
+		else {
+			assertEquals( 1, c.getParties().size() );
+			party = ( Party ) c.getParties().iterator().next();
+			assertEquals( "party", party.getName() );
+			if ( isContractPartiesBidirectional ) {
+				assertSame( c, party.getContract() );
+			}
+		}
+		s.delete(c);
+		assertEquals( new Long( 0 ), s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria(Party.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 2 );
+	}
+
+	public void testCreateWithNonEmptyOneToManyCollectionMergeWithNewElement() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gail", "phone");
+		Party party = new Party( "party" );
+		c.addParty( party );
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(c);
+		t.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		Party newParty = new Party( "new party" );
+		c.addParty( newParty );
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = ( Contract ) s.merge( c );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( isContractVersioned ? 1 : 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria(Contract.class).uniqueResult();
+		assertEquals( 2, c.getParties().size() );
+		for ( Iterator it=c.getParties().iterator(); it.hasNext(); ) {
+			Party aParty = ( Party ) it.next();
+			if ( aParty.getId() == party.getId() ) {
+				assertEquals( "party", aParty.getName() );
+			}
+			else if ( ! aParty.getName().equals( newParty.getName() ) ) {
+				fail( "unknown party:" + aParty.getName() );
+			}
+			if ( isContractPartiesBidirectional ) {
+				assertSame( c, aParty.getContract() );
+			}
+		}
+		s.delete(c);
+		assertEquals( new Long( 0 ), s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria(Party.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 3 );
+	}
+
+	public void testMoveOneToManyElementToNewEntityCollection() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gail", "phone");
+		c.addParty( new Party( "party" ) );
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(c);
+		t.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria( Contract.class ).uniqueResult();
+		assertEquals( 1, c.getParties().size() );
+		Party party = ( Party ) c.getParties().iterator().next();
+		assertEquals( "party", party.getName() );
+		if ( isContractPartiesBidirectional ) {
+			assertSame( c, party.getContract() );
+		}
+		c.removeParty( party );
+		Contract c2 = new Contract(null, "david", "phone" );
+		c2.addParty( party );
+		s.save( c2 );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( isContractVersioned ? 1 : 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria( Contract.class ).add( Restrictions.idEq( new Long( c.getId() ) )).uniqueResult();
+		c2 = (Contract) s.createCriteria( Contract.class ).add( Restrictions.idEq( new Long( c2.getId() ) )).uniqueResult();
+		if ( isContractPartiesInverse ) {
+			assertEquals( 1, c.getParties().size() );
+			party = ( Party ) c.getParties().iterator().next();
+			assertEquals( "party", party.getName() );
+			if ( isContractPartiesBidirectional ) {
+				assertSame( c, party.getContract() );
+			}
+			assertEquals( 0, c2.getParties().size() );
+		}
+		else {
+			assertEquals( 0, c.getParties().size() );
+			assertEquals( 1, c2.getParties().size() );
+			party = ( Party ) c2.getParties().iterator().next();
+			assertEquals( "party", party.getName() );
+			if ( isContractPartiesBidirectional ) {
+				assertSame( c2, party.getContract() );
+			}
+		}
+		s.delete(c);
+		s.delete( c2 );
+		assertEquals( new Long( 0 ), s.createCriteria( Contract.class ).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria( Party.class ).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 3 );
+	}
+
+	public void testMoveOneToManyElementToExistingEntityCollection() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gail", "phone");
+		c.addParty( new Party( "party" ) );
+		Contract c2 = new Contract(null, "david", "phone" );
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist( c );
+		s.persist( c2 );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 3 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria( Contract.class ).add( Restrictions.idEq( new Long( c.getId() ) )).uniqueResult();
+		assertEquals( 1, c.getParties().size() );
+		Party party = ( Party ) c.getParties().iterator().next();
+		assertEquals( "party", party.getName() );
+		if ( isContractPartiesBidirectional ) {
+			assertSame( c, party.getContract() );
+		}
+		c.removeParty( party );
+		c2 = (Contract) s.createCriteria( Contract.class ).add( Restrictions.idEq( new Long( c2.getId() ) )).uniqueResult();
+		c2.addParty( party );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 0 );
+		assertUpdateCount( isContractVersioned ? 2 : 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria( Contract.class ).add( Restrictions.idEq( new Long( c.getId() ) )).uniqueResult();
+		c2 = (Contract) s.createCriteria( Contract.class ).add( Restrictions.idEq( new Long( c2.getId() ) )).uniqueResult();
+		if ( isContractPartiesInverse ) {
+			assertEquals( 1, c.getParties().size() );
+			party = ( Party ) c.getParties().iterator().next();
+			assertEquals( "party", party.getName() );
+			if ( isContractPartiesBidirectional ) {
+				assertSame( c, party.getContract() );
+			}
+			assertEquals( 0, c2.getParties().size() );
+		}
+		else {
+			assertEquals( 0, c.getParties().size() );
+			assertEquals( 1, c2.getParties().size() );
+			party = ( Party ) c2.getParties().iterator().next();
+			assertEquals( "party", party.getName() );
+			if ( isContractPartiesBidirectional ) {
+				assertSame( c2, party.getContract() );
+			}
+		}
+		s.delete(c);
+		s.delete( c2 );
+		assertEquals( new Long( 0 ), s.createCriteria( Contract.class ).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria( Party.class ).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 3 );
+	}
+
+	public void testRemoveOneToManyElementUsingUpdate() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gail", "phone");
+		Party party = new Party( "party" );
+		c.addParty( party );
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist( c );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		c.removeParty( party );
+		assertEquals( 0, c.getParties().size() );
+		if ( isContractPartiesBidirectional ) {
+			assertNull( party.getContract() );
+		}
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.update( c );
+		s.update( party );
+		t.commit();
+		s.close();
+
+		if ( checkUpdateCountsAfterRemovingElementWithoutDelete() ) {
+			assertUpdateCount( isContractVersioned && ! isContractPartiesInverse ? 1 : 0 );
+		}
+		assertDeleteCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = ( Contract ) s.createCriteria( Contract.class ).uniqueResult();
+		if ( isContractPartiesInverse ) {
+			assertEquals( 1, c.getParties().size() );
+			party = ( Party ) c.getParties().iterator().next();
+			assertEquals( "party", party.getName() );
+			assertSame( c, party.getContract() );
+		}
+		else {
+			assertEquals( 0, c.getParties().size() );
+			party = ( Party ) s.createCriteria( Party.class ).uniqueResult();
+			if ( isContractPartiesBidirectional ) {
+				assertNull( party.getContract() );
+			}
+			s.delete( party );
+		}
+		s.delete( c );
+		assertEquals( new Long( 0 ), s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria(Party.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 2 );
+	}
+
+	public void testRemoveOneToManyElementUsingMerge() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gail", "phone");
+		Party party = new Party( "party" );
+		c.addParty( party );
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist( c );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		c.removeParty( party );
+		assertEquals( 0, c.getParties().size() );
+		if ( isContractPartiesBidirectional ) {
+			assertNull( party.getContract() );
+		}
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = ( Contract ) s.merge( c );
+		party = ( Party ) s.merge( party );
+		t.commit();
+		s.close();
+
+		if ( checkUpdateCountsAfterRemovingElementWithoutDelete() ) {
+			assertUpdateCount( isContractVersioned && ! isContractPartiesInverse ? 1 : 0 );
+		}
+		assertDeleteCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = ( Contract ) s.createCriteria( Contract.class ).uniqueResult();
+		if ( isContractPartiesInverse ) {
+			assertEquals( 1, c.getParties().size() );
+			party = ( Party ) c.getParties().iterator().next();
+			assertEquals( "party", party.getName() );
+			assertSame( c, party.getContract() );
+		}
+		else {
+			assertEquals( 0, c.getParties().size() );
+			party = ( Party ) s.createCriteria( Party.class ).uniqueResult();
+			if ( isContractPartiesBidirectional ) {
+				assertNull( party.getContract() );
+			}
+			s.delete( party );
+		}
+		s.delete( c );
+		assertEquals( new Long( 0 ), s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria(Party.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 2 );
+	}
+
+	public void testDeleteOneToManyElement() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gail", "phone");
+		Party party = new Party( "party" );
+		c.addParty( party );
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist( c );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.update( c );
+		c.removeParty( party );
+		s.delete( party );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( isContractVersioned ? 1 : 0 );
+		assertDeleteCount( 1 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = ( Contract ) s.createCriteria( Contract.class ).uniqueResult();
+		assertEquals( 0, c.getParties().size() );
+		party = ( Party ) s.createCriteria( Party.class ).uniqueResult();
+		assertNull( party );
+		s.delete( c );
+		assertEquals( new Long( 0 ), s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria(Party.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 1 );
+	}
+
+	public void testRemoveOneToManyElementByDelete() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gail", "phone");
+		Party party = new Party( "party" );
+		c.addParty( party );
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist( c );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		c.removeParty( party );
+		assertEquals( 0, c.getParties().size() );
+		if ( isContractPartiesBidirectional ) {
+			assertNull( party.getContract() );
+		}
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.update( c );
+		s.delete( party );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( isContractVersioned ? 1 : 0 );
+		assertDeleteCount( 1 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = ( Contract ) s.createCriteria( Contract.class ).uniqueResult();
+		assertEquals( 0, c.getParties().size() );
+		s.delete( c );
+		assertEquals( new Long( 0 ), s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria(Party.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 1 );
+	}
+
+	public void testRemoveOneToManyOrphanUsingUpdate() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gail", "phone");
+		ContractVariation cv = new ContractVariation( 1, c );
+		cv.setText( "cv1" );
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist( c );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		c.getVariations().remove( cv );
+		cv.setContract( null );
+		assertEquals( 0, c.getVariations().size() );
+		if ( isContractVariationsBidirectional ) {
+			assertNull( cv.getContract() );
+		}
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.update( c );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( isContractVersioned ? 1 : 0 );
+		assertDeleteCount( 1 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = ( Contract ) s.createCriteria( Contract.class ).uniqueResult();
+		assertEquals( 0, c.getVariations().size() );
+		cv = ( ContractVariation ) s.createCriteria( ContractVariation.class ).uniqueResult();
+		assertNull( cv );
+		s.delete( c );
+		assertEquals( new Long( 0 ), s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria(ContractVariation.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 1 );
+	}
+
+	public void testRemoveOneToManyOrphanUsingMerge() {
+		Contract c = new Contract( null, "gail", "phone");
+		ContractVariation cv = new ContractVariation( 1, c );
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist( c );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		c.getVariations().remove( cv );
+		cv.setContract( null );
+		assertEquals( 0, c.getVariations().size() );
+		if ( isContractVariationsBidirectional ) {
+			assertNull( cv.getContract() );
+		}
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = ( Contract ) s.merge( c );
+		cv = ( ContractVariation ) s.merge( cv );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( isContractVersioned ? 1 : 0 );
+		assertDeleteCount( 1 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = ( Contract ) s.createCriteria( Contract.class ).uniqueResult();
+		assertEquals( 0, c.getVariations().size() );
+		cv = ( ContractVariation ) s.createCriteria( ContractVariation.class ).uniqueResult();
+		assertNull( cv );
+		s.delete( c );
+		assertEquals( new Long( 0 ), s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria(ContractVariation.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 1 );
+	}
+
+	public void testDeleteOneToManyOrphan() {
+		clearCounts();
+
+		Contract c = new Contract( null, "gail", "phone");
+		ContractVariation cv = new ContractVariation( 1, c );
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist( c );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.update( c );
+		c.getVariations().remove( cv );
+		cv.setContract( null );
+		assertEquals( 0, c.getVariations().size() );
+		s.delete( cv );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( isContractVersioned ? 1 : 0 );
+		assertDeleteCount( 1 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = ( Contract ) s.createCriteria( Contract.class ).uniqueResult();
+		assertEquals( 0, c.getVariations().size() );
+		cv = ( ContractVariation ) s.createCriteria( ContractVariation.class ).uniqueResult();
+		assertNull( cv );
+		s.delete( c );
+		assertEquals( new Long( 0 ), s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria(ContractVariation.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 1 );
+	}
+
+	public void testOneToManyCollectionOptimisticLockingWithMerge() {
+		clearCounts();
+
+		Contract cOrig = new Contract( null, "gail", "phone");
+		Party partyOrig = new Party( "party" );
+		cOrig.addParty( partyOrig );
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(cOrig);
+		t.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Contract c = ( Contract ) s.get( Contract.class, cOrig.getId() );
+		Party newParty = new Party( "new party" );
+		c.addParty( newParty );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( isContractVersioned ? 1 : 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		cOrig.removeParty( partyOrig );
+		try {
+			s.merge( cOrig );
+			assertFalse( isContractVersioned );
+		}
+		catch (StaleObjectStateException ex) {
+			assertTrue( isContractVersioned);
+		}
+		finally {
+			t.rollback();
+		}
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria(Contract.class).uniqueResult();
+		s.delete(c);
+		assertEquals( new Long( 0 ), s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria(Party.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 3 );
+	}
+
+	public void testOneToManyCollectionOptimisticLockingWithUpdate() {
+		clearCounts();
+
+		Contract cOrig = new Contract( null, "gail", "phone");
+		Party partyOrig = new Party( "party" );
+		cOrig.addParty( partyOrig );
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(cOrig);
+		t.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Contract c = ( Contract ) s.get( Contract.class, cOrig.getId() );
+		Party newParty = new Party( "new party" );
+		c.addParty( newParty );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( isContractVersioned ? 1 : 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		cOrig.removeParty( partyOrig );
+		s.update( cOrig );
+		try {
+			t.commit();
+			assertFalse( isContractVersioned );
+		}
+		catch (StaleObjectStateException ex) {
+			assertTrue( isContractVersioned);
+			t.rollback();
+		}
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Contract) s.createCriteria(Contract.class).uniqueResult();
+		s.createQuery( "delete from Party" ).executeUpdate();
+		s.delete( c );
+		assertEquals( new Long( 0 ), s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		assertEquals( new Long( 0 ), s.createCriteria(Party.class).setProjection( Projections.rowCount() ).uniqueResult() );
+		t.commit();
+		s.close();
+	}
+
+	protected void clearCounts() {
+		getSessions().getStatistics().clear();
+	}
+
+	protected void assertInsertCount(int expected) {
+		int inserts = ( int ) getSessions().getStatistics().getEntityInsertCount();
+		assertEquals( "unexpected insert count", expected, inserts );
+	}
+
+	protected void assertUpdateCount(int expected) {
+		int updates = ( int ) getSessions().getStatistics().getEntityUpdateCount();
+		assertEquals( "unexpected update counts", expected, updates );
+	}
+
+	protected void assertDeleteCount(int expected) {
+		int deletes = ( int ) getSessions().getStatistics().getEntityDeleteCount();
+		assertEquals( "unexpected delete counts", expected, deletes );
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/AbstractEntityWithOneToManyTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/Contract.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/Contract.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/Contract.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,158 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.immutable.entitywithmutablecollection;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class Contract implements Serializable {
+	
+	private long id;
+	private long version;
+	private String customerName;
+	private String type;
+	private List variations;
+	private Contract parent;
+	private Set subcontracts;
+	private Set plans = new HashSet();
+	private Set parties;
+	private Set infos;
+
+	public Contract() {
+		super();
+	}
+
+	public Contract(Plan plan, String customerName, String type) {
+		plans = new HashSet();
+		if ( plan != null ) {
+			plans.add( plan );
+			plan.getContracts().add( this );
+		}
+		this.customerName = customerName;
+		this.type = type;
+		variations = new ArrayList();
+		subcontracts = new HashSet();
+		parties = new HashSet();
+		infos = new HashSet();
+	}
+
+	public long getVersion() {
+		return version;
+	}
+
+	public void setVersion(long version) {
+		this.version = version;
+	}
+	
+	public Set getPlans() {
+		return plans;
+	}
+
+	public void setPlans(Set plans) {
+		this.plans = plans;
+	}
+
+	public String getCustomerName() {
+		return customerName;
+	}
+
+	public void setCustomerName(String customerName) {
+		this.customerName = customerName;
+	}
+
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	public List getVariations() {
+		return variations;
+	}
+
+	public void setVariations(List variations) {
+		this.variations = variations;
+	}
+
+	public Contract getParent() {
+		return parent;
+	}
+
+	public void setParent(Contract parent) {
+		this.parent = parent;
+	}
+
+	public Set getSubcontracts() {
+		return subcontracts;
+	}
+
+	public void setSubcontracts(Set subcontracts) {
+		this.subcontracts = subcontracts;
+	}
+
+	public void addSubcontract(Contract subcontract) {
+		subcontracts.add( subcontract );
+		subcontract.setParent( this );
+	}
+
+	public Set getParties() {
+		return parties;
+	}
+
+	public void setParties(Set parties) {
+		this.parties = parties;
+	}
+
+	public void addParty(Party party) {
+		parties.add( party );
+		party.setContract( this );
+	}
+
+	public void removeParty(Party party) {
+		parties.remove( party );
+		party.setContract( null );
+	}
+
+	public Set getInfos() {
+		return infos;
+	}
+
+	public void setInfos(Set infos) {
+		this.infos = infos;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/Contract.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/ContractVariation.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/ContractVariation.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/ContractVariation.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,79 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.immutable.entitywithmutablecollection;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+
+public class ContractVariation implements Serializable {
+	
+	private int id;
+	private Contract contract;
+	private String text;
+	private Set infos = new HashSet();
+
+	public Contract getContract() {
+		return contract;
+	}
+
+	public void setContract(Contract contract) {
+		this.contract = contract;
+	}
+
+	public String getText() {
+		return text;
+	}
+
+	public void setText(String text) {
+		this.text = text;
+	}
+
+	public int getId() {
+		return id;
+	}
+
+	public void setId(int id) {
+		this.id = id;
+	}
+
+	public ContractVariation() {
+		super();
+	}
+
+	public ContractVariation(int version, Contract contract) {
+		this.contract = contract;
+		this.id = id;
+		contract.getVariations().add(this);
+	}
+
+	public Set getInfos() {
+		return infos;
+	}
+
+	public void setInfos(Set infos) {
+		this.infos = infos;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/ContractVariation.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/Info.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/Info.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/Info.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,66 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.immutable.entitywithmutablecollection;
+
+import java.io.Serializable;
+
+public class Info implements Serializable {
+
+	private long id;
+	private String text;
+	private long version;
+
+	public Info() {
+		super();
+	}
+
+	public Info(String text) {
+		this.text = text;
+	}
+
+	public long getVersion() {
+		return version;
+	}
+
+	public void setVersion(long version) {
+		this.version = version;
+	}
+
+	public String getText() {
+		return text;
+	}
+
+	public void setText(String text) {
+		this.text = text;
+	}
+
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/Info.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/Owner.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/Owner.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/Owner.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,76 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.immutable.entitywithmutablecollection;
+
+import java.io.Serializable;
+
+public class Owner implements Serializable {
+
+	private long id;
+	private long version;
+	private Plan plan;
+	private String name;
+
+	public Owner() {
+		super();
+	}
+
+	public Owner(String name) {
+		this.name = name;
+	}
+
+	public long getVersion() {
+		return version;
+	}
+
+	public void setVersion(long version) {
+		this.version = version;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	public Plan getPlan() {
+		return plan;
+	}
+
+	public void setPlan(Plan plan) {
+		this.plan = plan;
+	}
+
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/Owner.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/Party.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/Party.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/Party.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,88 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.immutable.entitywithmutablecollection;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class Party implements Serializable {
+
+	private long id;
+	private long version;
+	private Contract contract;
+	private String name;
+	private Set infos = new HashSet();
+
+	public Party() {
+		super();
+	}
+
+	public Party(String name) {
+		this.name = name;
+	}
+
+	public long getVersion() {
+		return version;
+	}
+
+	public void setVersion(long version) {
+		this.version = version;
+	}
+	
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	public Contract getContract() {
+		return contract;
+	}
+
+	public void setContract(Contract contract) {
+		this.contract = contract;
+	}
+
+	public Set getInfos() {
+		return infos;
+	}
+
+	public void setInfos(Set infos) {
+		this.infos = infos;
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/Party.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/Plan.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/Plan.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/Plan.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,131 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.immutable.entitywithmutablecollection;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+public class Plan implements Serializable {
+
+	private long id;
+	private long version;
+	private String description;
+	private Set contracts;
+	private Set infos;
+	private Owner owner;
+
+	public Plan() {
+		this( null );
+	}
+
+	public Plan(String description) {
+		this.description = description;
+		contracts = new HashSet();
+		infos = new HashSet();
+	}
+
+	public long getVersion() {
+		return version;
+	}
+
+	public void setVersion(long version) {
+		this.version = version;
+	}
+
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	public String getDescription() {
+		return description;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
+	public Set getContracts() {
+		return contracts;
+	}
+
+	public void setContracts(Set contracts) {
+		this.contracts = contracts;
+	}
+
+	public void addContract(Contract contract) {
+		if ( ! contracts.add( contract ) ) {
+			return;
+		}
+		if ( contract.getParent() != null ) {
+			addContract( contract.getParent() );
+		}
+		contract.getPlans().add( this );
+		for ( Iterator it=contract.getSubcontracts().iterator(); it.hasNext(); ) {
+			Contract sub = ( Contract ) it.next();
+			addContract( sub );
+		}
+	}
+
+	public void removeContract(Contract contract) {
+		if ( contract.getParent() != null ) {
+			contract.getParent().getSubcontracts().remove( contract );
+			contract.setParent( null );			
+		}
+		removeSubcontracts( contract );
+		contract.getPlans().remove( this );
+		contracts.remove( contract );
+	}
+
+	public void removeSubcontracts(Contract contract) {
+		for ( Iterator it=contract.getSubcontracts().iterator(); it.hasNext(); ) {
+			Contract sub = ( Contract ) it.next();
+			removeSubcontracts( sub );
+			sub.getPlans().remove( this );
+			contracts.remove( sub );
+		}
+	}
+
+	public Set getInfos() {
+		return infos;
+	}
+
+	public void setInfos(Set infos) {
+		this.infos = infos;
+	}
+
+	public Owner getOwner() {
+		return owner;
+	}
+
+	public void setOwner(Owner owner) {
+		this.owner = owner;
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/Plan.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/ContractVariation.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/ContractVariation.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/ContractVariation.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,90 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+  Test for immutable classes/collections.
+     
+-->
+
+<hibernate-mapping package="org.hibernate.test.immutable.entitywithmutablecollection">
+    <class name="Info" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <property name="text"/>        
+    </class>
+
+    <class name="Plan" table="tbl_plan" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <property name="description" not-null="true"/>
+        <set name="contracts" table="plan_contract" inverse="true" mutable="true" cascade="all" fetch="join">
+            <key column="col_plan"/>
+            <many-to-many column="contract" class="Contract"/>
+        </set>
+        <set name="infos" inverse="true"  mutable="true" cascade="all-delete-orphan">
+            <key column="col_plan"/>
+            <one-to-many class="Info"/>
+        </set>
+    </class>
+
+    <class name="Party" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <many-to-one name="contract" not-null="false"/>
+        <property name="name" not-null="true"/>
+        <set name="infos" inverse="true"  mutable="true" cascade="all-delete-orphan">
+            <key column="party"/>
+            <one-to-many class="Info"/>
+        </set>
+    </class>
+
+	<class name="Contract" mutable="false">
+		<id name="id">
+			<generator class="increment"/>
+		</id>
+		<property name="customerName" not-null="true"/>
+		<property name="type" not-null="true"/>
+		<bag name="variations" inverse="true" order-by="id asc"
+				mutable="true" cascade="all-delete-orphan" fetch="join">
+			<key column="contract"/>
+			<one-to-many class="ContractVariation"/>
+		</bag>
+        <many-to-one name="parent" />
+        <set name="subcontracts" inverse="true"
+                mutable="true" cascade="all" fetch="join">
+            <key column="parent"/>
+            <one-to-many class="Contract"/>
+        </set>
+        <set name="plans" table="plan_contract" inverse="false" mutable="true" cascade="none">
+            <key column="contract"/>
+            <many-to-many column="col_plan" class="Plan"/>
+        </set>
+        <set name="parties" inverse="true"  mutable="true" cascade="all" fetch="join">
+            <key column="contract"/>
+            <one-to-many class="Party"/>
+        </set>
+        <set name="infos" inverse="true"  mutable="true" cascade="all-delete-orphan">
+            <key column="contract"/>
+            <one-to-many class="Info"/>
+        </set>
+	</class>
+
+	<class name="ContractVariation" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+		<property name="text" type="text"/>
+        <many-to-one name="contract" not-null="false"/>
+        <set name="infos" inverse="true"  mutable="true" cascade="all-delete-orphan">
+            <key column="contractvariation"/>
+            <one-to-many class="Info"/>
+        </set>
+	</class>
+	
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/ContractVariation.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/ContractVariationOneToManyJoin.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/ContractVariationOneToManyJoin.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/ContractVariationOneToManyJoin.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,97 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+  Test for immutable classes/collections.
+     
+-->
+
+<hibernate-mapping package="org.hibernate.test.immutable.entitywithmutablecollection">
+    <class name="Info" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <property name="text"/>        
+    </class>
+
+    <class name="Plan" table="tbl_plan" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <property name="description" not-null="true"/>
+        <set name="contracts" table="plan_contract" inverse="true" mutable="true" cascade="all" fetch="join">
+            <key column="col_plan"/>
+            <many-to-many column="contract" class="Contract"/>
+        </set>
+        <set name="infos" inverse="true"  mutable="true" cascade="all-delete-orphan">
+            <key column="col_plan"/>
+            <one-to-many class="Info"/>
+        </set>
+    </class>
+
+    <class name="Party" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <property name="name" not-null="true"/>
+        <set name="infos" inverse="true"  mutable="true" cascade="all-delete-orphan">
+            <key column="party"/>
+            <one-to-many class="Info"/>
+        </set>
+        <join table="contract_party"
+            inverse="false"
+            optional="true">
+            <key column="party"/>
+            <many-to-one name="contract"
+                column="contract"
+                not-null="true"/>
+        </join>
+    </class>
+
+	<class name="Contract" mutable="false">
+		<id name="id">
+			<generator class="increment"/>
+		</id>
+		<property name="customerName" not-null="true"/>
+		<property name="type" not-null="true"/>
+		<bag name="variations" inverse="true" order-by="id asc"
+				mutable="true" cascade="all-delete-orphan" fetch="join">
+			<key column="contract"/>
+			<one-to-many class="ContractVariation"/>
+		</bag>
+        <many-to-one name="parent" />
+        <set name="subcontracts" inverse="true"
+                mutable="true" cascade="all" fetch="join">
+            <key column="parent"/>
+            <one-to-many class="Contract"/>
+        </set>
+        <set name="plans" table="plan_contract" inverse="false" mutable="true" cascade="none">
+            <key column="contract"/>
+            <many-to-many column="col_plan" class="Plan"/>
+        </set>
+        <set name="parties" table="contract_party" inverse="true"  mutable="true" cascade="all">
+            <key column="contract"/>
+            <many-to-many column="party" unique="true" class="Party"/>
+        </set>
+        <set name="infos" inverse="true"  mutable="true" cascade="all-delete-orphan">
+            <key column="contract"/>
+            <one-to-many class="Info"/>
+        </set>
+	</class>
+
+	<class name="ContractVariation" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+		<property name="text" type="text"/>
+        <many-to-one name="contract" not-null="false"/>
+        <set name="infos" inverse="true"  mutable="true" cascade="all-delete-orphan">
+            <key column="contractvariation"/>
+            <one-to-many class="Info"/>
+        </set>
+	</class>
+	
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/ContractVariationOneToManyJoin.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/ContractVariationVersioned.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/ContractVariationVersioned.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/ContractVariationVersioned.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,94 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+  Test for readonly.entitywithmutablecollection classes/collections.
+     
+-->
+
+<hibernate-mapping package="org.hibernate.test.immutable.entitywithmutablecollection">
+    <class name="Info" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <version name="version" column="VERS" type="long" />
+        <property name="text"/>        
+    </class>
+
+    <class name="Plan" table="tbl_plan" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <version name="version" column="VERS" type="long" />
+        <property name="description" not-null="true"/>
+        <set name="contracts" table="plan_contract" inverse="true" mutable="true" cascade="all" fetch="join">
+            <key column="col_plan"/>
+            <many-to-many column="contract" class="Contract"/>
+        </set>
+        <set name="infos" inverse="true"  mutable="true" cascade="all-delete-orphan">
+            <key column="col_plan"/>
+            <one-to-many class="Info"/>
+        </set>
+    </class>
+
+    <class name="Party" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <version name="version" column="VERS" type="long" />
+        <many-to-one name="contract" not-null="false"/>
+        <property name="name" not-null="true"/>
+        <set name="infos" inverse="true"  mutable="true" cascade="all-delete-orphan">
+            <key column="party"/>
+            <one-to-many class="Info"/>
+        </set>
+    </class>
+
+	<class name="Contract" mutable="false">
+		<id name="id">
+			<generator class="increment"/>
+		</id>
+        <version name="version" column="VERS" type="long" />
+		<property name="customerName" not-null="true"/>
+		<property name="type" not-null="true"/>
+		<bag name="variations" inverse="true" order-by="id asc"
+				mutable="true" cascade="all-delete-orphan" fetch="join">
+			<key column="contract"/>
+			<one-to-many class="ContractVariation"/>
+		</bag>
+        <many-to-one name="parent" />
+        <set name="subcontracts" inverse="true"
+                mutable="true" cascade="all" fetch="join">
+            <key column="parent"/>
+            <one-to-many class="Contract"/>
+        </set>
+        <set name="plans" table="plan_contract" inverse="false" mutable="true" cascade="none">
+            <key column="contract"/>
+            <many-to-many column="col_plan" class="Plan"/>
+        </set>
+        <set name="parties" inverse="true"  mutable="true" cascade="all" fetch="join">
+            <key column="contract"/>
+            <one-to-many class="Party"/>
+        </set>
+        <set name="infos" inverse="true"  mutable="true" cascade="all-delete-orphan">
+            <key column="contract"/>
+            <one-to-many class="Info"/>
+        </set>
+	</class>
+
+	<class name="ContractVariation" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+		<property name="text" type="text"/>
+        <many-to-one name="contract" not-null="false"/>
+        <set name="infos" inverse="true"  mutable="true" cascade="all-delete-orphan">
+           <key column="contractvariation"/>
+           <one-to-many class="Info"/>
+        </set>
+	</class>
+	
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/ContractVariationVersioned.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/ContractVariationVersionedOneToManyJoin.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/ContractVariationVersionedOneToManyJoin.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/ContractVariationVersionedOneToManyJoin.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,101 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+  Test for readonly.entitywithmutablecollection classes/collections.
+     
+-->
+
+<hibernate-mapping package="org.hibernate.test.immutable.entitywithmutablecollection">
+    <class name="Info" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <version name="version" column="VERS" type="long" />
+        <property name="text"/>        
+    </class>
+
+    <class name="Plan" table="tbl_plan" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <version name="version" column="VERS" type="long" />
+        <property name="description" not-null="true"/>
+        <set name="contracts" table="plan_contract" inverse="true" mutable="true" cascade="all" fetch="join">
+            <key column="col_plan"/>
+            <many-to-many column="contract" class="Contract"/>
+        </set>
+        <set name="infos" inverse="true"  mutable="true" cascade="all-delete-orphan">
+            <key column="col_plan"/>
+            <one-to-many class="Info"/>
+        </set>
+    </class>
+
+    <class name="Party" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <version name="version" column="VERS" type="long" />
+        <property name="name" not-null="true"/>
+        <set name="infos" inverse="true"  mutable="true" cascade="all-delete-orphan">
+            <key column="party"/>
+            <one-to-many class="Info"/>
+        </set>
+        <join table="contract_party"
+            inverse="false"
+            optional="true">
+            <key column="party"/>
+            <many-to-one name="contract"
+                column="contract"
+                not-null="true"/>
+        </join>
+    </class>
+
+	<class name="Contract" mutable="false">
+		<id name="id">
+			<generator class="increment"/>
+		</id>
+        <version name="version" column="VERS" type="long" />
+		<property name="customerName" not-null="true"/>
+		<property name="type" not-null="true"/>
+		<bag name="variations" inverse="true" order-by="id asc"
+				mutable="true" cascade="all-delete-orphan" fetch="join">
+			<key column="contract"/>
+			<one-to-many class="ContractVariation"/>
+		</bag>
+        <many-to-one name="parent" />
+        <set name="subcontracts" inverse="true"
+                mutable="true" cascade="all" fetch="join">
+            <key column="parent"/>
+            <one-to-many class="Contract"/>
+        </set>
+        <set name="plans" table="plan_contract" inverse="false" mutable="true" cascade="none">
+            <key column="contract"/>
+            <many-to-many column="col_plan" class="Plan"/>
+        </set>
+        <set name="parties" table="contract_party" inverse="true"  mutable="true" cascade="all">
+            <key column="contract"/>
+            <many-to-many column="party" unique="true" class="Party"/>
+        </set>
+        <set name="infos" inverse="true"  mutable="true" cascade="all-delete-orphan">
+            <key column="contract"/>
+            <one-to-many class="Info"/>
+        </set>
+	</class>
+
+	<class name="ContractVariation" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+		<property name="text" type="text"/>
+        <many-to-one name="contract" not-null="false"/>
+       <set name="infos" inverse="true"  mutable="true" cascade="all-delete-orphan">
+            <key column="contractvariation"/>
+            <one-to-many class="Info"/>
+        </set>
+	</class>
+	
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/ContractVariationVersionedOneToManyJoin.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/EntityWithInverseManyToManyTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/EntityWithInverseManyToManyTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/EntityWithInverseManyToManyTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,49 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.immutable.entitywithmutablecollection.inverse;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.immutable.entitywithmutablecollection.AbstractEntityWithManyToManyTest;
+
+/**
+ * @author Gail Badner
+ */
+public class EntityWithInverseManyToManyTest extends AbstractEntityWithManyToManyTest {
+
+	public EntityWithInverseManyToManyTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "immutable/entitywithmutablecollection/inverse/ContractVariation.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( EntityWithInverseManyToManyTest.class );
+	}
+
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/EntityWithInverseManyToManyTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/EntityWithInverseOneToManyJoinTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/EntityWithInverseOneToManyJoinTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/EntityWithInverseOneToManyJoinTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,50 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.immutable.entitywithmutablecollection.inverse;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.immutable.entitywithmutablecollection.AbstractEntityWithOneToManyTest;
+
+
+/**
+ * @author Gail Badner
+ */
+public class EntityWithInverseOneToManyJoinTest extends AbstractEntityWithOneToManyTest {
+
+	public EntityWithInverseOneToManyJoinTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "immutable/entitywithmutablecollection/inverse/ContractVariationOneToManyJoin.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( EntityWithInverseOneToManyJoinTest.class );
+	}
+
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/EntityWithInverseOneToManyJoinTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/EntityWithInverseOneToManyTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/EntityWithInverseOneToManyTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/EntityWithInverseOneToManyTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,50 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.immutable.entitywithmutablecollection.inverse;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.immutable.entitywithmutablecollection.AbstractEntityWithOneToManyTest;
+
+
+/**
+ * @author Gail Badner
+ */
+public class EntityWithInverseOneToManyTest extends AbstractEntityWithOneToManyTest {
+
+	public EntityWithInverseOneToManyTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "immutable/entitywithmutablecollection/inverse/ContractVariation.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( EntityWithInverseOneToManyTest.class );
+	}
+	
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/EntityWithInverseOneToManyTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/VersionedEntityWithInverseManyToManyTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/VersionedEntityWithInverseManyToManyTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/VersionedEntityWithInverseManyToManyTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,49 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.immutable.entitywithmutablecollection.inverse;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.immutable.entitywithmutablecollection.AbstractEntityWithManyToManyTest;
+
+
+/**
+ * @author Gail Badner
+ */
+public class VersionedEntityWithInverseManyToManyTest extends AbstractEntityWithManyToManyTest {
+
+	public VersionedEntityWithInverseManyToManyTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "immutable/entitywithmutablecollection/inverse/ContractVariationVersioned.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( VersionedEntityWithInverseManyToManyTest.class );
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/VersionedEntityWithInverseManyToManyTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/VersionedEntityWithInverseOneToManyFailureExpectedTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/VersionedEntityWithInverseOneToManyFailureExpectedTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/VersionedEntityWithInverseOneToManyFailureExpectedTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,105 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.immutable.entitywithmutablecollection.inverse;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.immutable.entitywithmutablecollection.AbstractEntityWithOneToManyTest;
+
+/**
+ * @author Gail Badner
+ *
+ * These tests reproduce HHH-4992.
+ */
+public class VersionedEntityWithInverseOneToManyFailureExpectedTest extends AbstractEntityWithOneToManyTest {
+
+	public VersionedEntityWithInverseOneToManyFailureExpectedTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "immutable/entitywithmutablecollection/inverse/ContractVariationVersioned.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( VersionedEntityWithInverseOneToManyFailureExpectedTest.class );
+	}
+
+	public void testAddExistingOneToManyElementToPersistentEntity() {
+		reportSkip(
+				"known to fail with versioned entity with inverse collection",
+				"AddExistingOneToManyElementToPersistentEntity"
+		);
+	}
+
+	public void testAddExistingOneToManyElementToPersistentEntityFailureExpected() {
+		super.testAddExistingOneToManyElementToPersistentEntity();
+	}
+
+	public void testCreateWithEmptyOneToManyCollectionUpdateWithExistingElement() {
+		reportSkip(
+				"known to fail with versioned entity with inverse collection",
+				"CreateWithEmptyOneToManyCollectionUpdateWithExistingElement"
+		);
+	}
+
+	public void testCreateWithEmptyOneToManyCollectionUpdateWithExistingElementFailureExpected() {
+		super.testCreateWithEmptyOneToManyCollectionUpdateWithExistingElement();
+	}
+
+	public void testCreateWithEmptyOneToManyCollectionMergeWithExistingElement() {
+		reportSkip(
+				"known to fail with versioned entity with inverse collection",
+				"CreateWithEmptyOneToManyCollectionMergeWithExistingElement"
+		);
+	}
+
+	public void testCreateWithEmptyOneToManyCollectionMergeWithExistingElementFailureExpected() {
+		super.testCreateWithEmptyOneToManyCollectionMergeWithExistingElement();
+	}
+
+	public void testRemoveOneToManyElementUsingUpdate() {
+		reportSkip(
+				"known to fail with versioned entity with inverse collection",
+				"RemoveOneToManyElementUsingUpdate"
+		);
+	}
+
+	public void testRemoveOneToManyElementUsingUpdateFailureExpected() {
+		super.testRemoveOneToManyElementUsingUpdate();
+	}
+
+	public void testRemoveOneToManyElementUsingMerge() {
+		reportSkip(
+				"known to fail with versioned entity with inverse collection",
+				"RemoveOneToManyElementUsingMerge" 
+		);
+	}
+
+	public void testRemoveOneToManyElementUsingMergeFailureExpected() {
+		super.testRemoveOneToManyElementUsingMerge();
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/VersionedEntityWithInverseOneToManyFailureExpectedTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/VersionedEntityWithInverseOneToManyJoinFailureExpectedTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/VersionedEntityWithInverseOneToManyJoinFailureExpectedTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/VersionedEntityWithInverseOneToManyJoinFailureExpectedTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,104 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.immutable.entitywithmutablecollection.inverse;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.immutable.entitywithmutablecollection.AbstractEntityWithOneToManyTest;
+
+
+/**
+ * @author Gail Badner
+ */
+public class VersionedEntityWithInverseOneToManyJoinFailureExpectedTest extends AbstractEntityWithOneToManyTest {
+
+	public VersionedEntityWithInverseOneToManyJoinFailureExpectedTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "immutable/entitywithmutablecollection/inverse/ContractVariationVersionedOneToManyJoin.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( VersionedEntityWithInverseOneToManyJoinFailureExpectedTest.class );
+	}
+
+	public void testAddExistingOneToManyElementToPersistentEntity() {
+		reportSkip(
+				"known to fail with inverse collection",
+				"AddExistingOneToManyElementToPersistentEntity"
+		);
+	}
+
+	public void testAddExistingOneToManyElementToPersistentEntityFailureExpected() {
+		super.testAddExistingOneToManyElementToPersistentEntity();
+	}
+
+	public void testCreateWithEmptyOneToManyCollectionUpdateWithExistingElement() {
+		reportSkip(
+				"known to fail with inverse collection",
+				"CreateWithEmptyOneToManyCollectionUpdateWithExistingElement"
+		);
+	}
+
+	public void testCreateWithEmptyOneToManyCollectionUpdateWithExistingElementFailureExpected() {
+		super.testCreateWithEmptyOneToManyCollectionUpdateWithExistingElement();
+	}
+
+	public void testCreateWithEmptyOneToManyCollectionMergeWithExistingElement() {
+		reportSkip(
+				"known to fail with versioned entity with inverse one-to-many collection",
+				"CreateWithEmptyOneToManyCollectionMergeWithExistingElement"
+		);
+	}
+
+	public void testCreateWithEmptyOneToManyCollectionMergeWithExistingElementFailureExpected() {
+		super.testCreateWithEmptyOneToManyCollectionMergeWithExistingElement();
+	}
+
+	public void testRemoveOneToManyElementUsingUpdate() {
+		reportSkip(
+				"known to fail with versioned entity with inverse collection",
+				"RemoveOneToManyElementUsingUpdate"
+		);
+	}
+
+	public void testRemoveOneToManyElementUsingUpdateFailureExpected() {
+		super.testRemoveOneToManyElementUsingUpdate();
+	}
+
+	public void testRemoveOneToManyElementUsingMerge() {
+		reportSkip(
+				"known to fail with versioned entity with inverse collection",
+				"RemoveOneToManyElementUsingMerge"
+		);
+	}
+
+	public void testRemoveOneToManyElementUsingMergeFailureExpected() {
+		super.testRemoveOneToManyElementUsingMerge();
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/VersionedEntityWithInverseOneToManyJoinFailureExpectedTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/VersionedEntityWithInverseOneToManyJoinTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/VersionedEntityWithInverseOneToManyJoinTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/VersionedEntityWithInverseOneToManyJoinTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,59 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.immutable.entitywithmutablecollection.inverse;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.immutable.entitywithmutablecollection.AbstractEntityWithOneToManyTest;
+
+
+/**
+ * @author Gail Badner
+ *
+ * These tests reproduce HHH-4992.
+ */
+public class VersionedEntityWithInverseOneToManyJoinTest extends AbstractEntityWithOneToManyTest {
+
+	public VersionedEntityWithInverseOneToManyJoinTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "immutable/entitywithmutablecollection/inverse/ContractVariationVersionedOneToManyJoin.hbm.xml" };
+	}
+
+	protected boolean checkUpdateCountsAfterAddingExistingElement() {
+		return false;
+	}
+
+	protected boolean checkUpdateCountsAfterRemovingElementWithoutDelete() {
+		return false;
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( VersionedEntityWithInverseOneToManyJoinTest.class );
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/VersionedEntityWithInverseOneToManyJoinTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/VersionedEntityWithInverseOneToManyTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/VersionedEntityWithInverseOneToManyTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/VersionedEntityWithInverseOneToManyTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,55 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.immutable.entitywithmutablecollection.inverse;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.immutable.entitywithmutablecollection.AbstractEntityWithOneToManyTest;
+
+/**
+ * @author Gail Badner
+ */
+public class VersionedEntityWithInverseOneToManyTest extends AbstractEntityWithOneToManyTest {
+
+	public VersionedEntityWithInverseOneToManyTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "immutable/entitywithmutablecollection/inverse/ContractVariationVersioned.hbm.xml" };
+	}
+
+	protected boolean checkUpdateCountsAfterAddingExistingElement() {
+		return false;
+	}
+
+	protected boolean checkUpdateCountsAfterRemovingElementWithoutDelete() {
+		return false;
+	}
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( VersionedEntityWithInverseOneToManyTest.class );
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/inverse/VersionedEntityWithInverseOneToManyTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/ContractVariation.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/ContractVariation.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/ContractVariation.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,90 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+  Test for immutable classes/collections.
+     
+-->
+
+<hibernate-mapping package="org.hibernate.test.immutable.entitywithmutablecollection">
+    <class name="Info" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <property name="text"/>        
+    </class>
+
+    <class name="Plan" table="tbl_plan" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <property name="description" not-null="true"/>
+        <set name="contracts" table="plan_contract" inverse="false" mutable="true" cascade="all" fetch="join">
+            <key column="col_plan"/>
+            <many-to-many column="contract" class="Contract"/>
+        </set>
+        <set name="infos" inverse="false"  mutable="true" cascade="all-delete-orphan">
+            <key column="col_plan"/>
+            <one-to-many class="Info"/>
+        </set>
+    </class>
+
+    <class name="Party" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <many-to-one name="contract" update="false" insert="false" not-null="false"/>
+        <property name="name" not-null="true"/>
+        <set name="infos" inverse="false"  mutable="true" cascade="all-delete-orphan">
+            <key column="party"/>
+            <one-to-many class="Info"/>
+        </set>
+    </class>
+
+	<class name="Contract" mutable="false">
+		<id name="id">
+			<generator class="increment"/>
+		</id>
+		<property name="customerName" not-null="true"/>
+		<property name="type" not-null="true"/>
+		<bag name="variations" inverse="false" order-by="id asc"
+				mutable="true" cascade="all-delete-orphan" fetch="join">
+			<key column="contract"/>
+			<one-to-many class="ContractVariation"/>
+		</bag>
+        <many-to-one name="parent" update="false" insert="false"/>
+        <set name="subcontracts" inverse="false"
+                mutable="true" cascade="all" fetch="join">
+            <key column="parent"/>
+            <one-to-many class="Contract"/>
+        </set>
+        <set name="plans" table="plan_contract" inverse="true" mutable="true" cascade="none">
+            <key column="contract"/>
+            <many-to-many column="col_plan" class="Plan"/>
+        </set>
+        <set name="parties" inverse="false"  mutable="true" cascade="all" fetch="join">
+            <key column="contract"/>
+            <one-to-many class="Party"/>
+        </set>
+        <set name="infos" inverse="false"  mutable="true" cascade="all-delete-orphan">
+            <key column="contract"/>
+            <one-to-many class="Info"/>
+        </set>
+	</class>
+
+	<class name="ContractVariation" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+		<property name="text" type="text"/>
+        <many-to-one name="contract" insert="false" update="false" not-null="false"/>
+        <set name="infos" inverse="false"  mutable="true" cascade="all-delete-orphan">
+            <key column="contractvariation"/>
+            <one-to-many class="Info"/>
+        </set>
+	</class>
+	
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/ContractVariation.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/ContractVariationOneToManyJoin.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/ContractVariationOneToManyJoin.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/ContractVariationOneToManyJoin.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,97 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+  Test for immutable classes/collections.
+     
+-->
+
+<hibernate-mapping package="org.hibernate.test.immutable.entitywithmutablecollection">
+    <class name="Info" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <property name="text"/>        
+    </class>
+
+    <class name="Plan" table="tbl_plan" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <property name="description" not-null="true"/>
+        <set name="contracts" table="plan_contract" inverse="false" mutable="true" cascade="all" fetch="join">
+            <key column="col_plan"/>
+            <many-to-many column="contract" class="Contract"/>
+        </set>
+        <set name="infos" inverse="false"  mutable="true" cascade="all-delete-orphan">
+            <key column="col_plan"/>
+            <one-to-many class="Info"/>
+        </set>
+    </class>
+
+    <class name="Party" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <property name="name" not-null="true"/>
+        <set name="infos" inverse="false"  mutable="true" cascade="all-delete-orphan">
+            <key column="party"/>
+            <one-to-many class="Info"/>
+        </set>
+        <join table="contract_party"
+            inverse="true"
+            optional="true">
+            <key column="party"/>
+            <many-to-one name="contract"
+                column="contract"
+                not-null="true"/>
+        </join>
+    </class>
+
+	<class name="Contract" mutable="false">
+		<id name="id">
+			<generator class="increment"/>
+		</id>
+		<property name="customerName" not-null="true"/>
+		<property name="type" not-null="true"/>
+		<bag name="variations" inverse="false" order-by="id asc"
+				mutable="true" cascade="all-delete-orphan" fetch="join">
+			<key column="contract"/>
+			<one-to-many class="ContractVariation"/>
+		</bag>
+        <many-to-one name="parent" update="false" insert="false"/>
+        <set name="subcontracts" inverse="false"
+                mutable="true" cascade="all" fetch="join">
+            <key column="parent"/>
+            <one-to-many class="Contract"/>
+        </set>
+        <set name="plans" table="plan_contract" inverse="true" mutable="true" cascade="none">
+            <key column="contract"/>
+            <many-to-many column="col_plan" class="Plan"/>
+        </set>
+        <set name="parties" table="contract_party" inverse="false"  mutable="true" cascade="all">
+            <key column="contract"/>
+            <many-to-many column="party" unique="true" class="Party"/>
+        </set>
+        <set name="infos" inverse="false"  mutable="true" cascade="all-delete-orphan">
+            <key column="contract"/>
+            <one-to-many class="Info"/>
+        </set>
+	</class>
+
+	<class name="ContractVariation" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+		<property name="text" type="text"/>
+        <many-to-one name="contract" insert="false" update="false" not-null="false"/>
+        <set name="infos" inverse="false"  mutable="true" cascade="all-delete-orphan">
+            <key column="contractvariation"/>
+            <one-to-many class="Info"/>
+        </set>
+	</class>
+	
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/ContractVariationOneToManyJoin.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/ContractVariationUnidir.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/ContractVariationUnidir.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/ContractVariationUnidir.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,85 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+  Test for immutable classes/collections.
+     
+-->
+
+<hibernate-mapping package="org.hibernate.test.immutable.entitywithmutablecollection">
+    <class name="Info" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <property name="text"/>        
+    </class>
+
+    <class name="Plan" table="tbl_plan" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <property name="description" not-null="true"/>
+        <set name="contracts" table="plan_contract" inverse="false" mutable="true" cascade="all" fetch="join">
+            <key column="col_plan"/>
+            <many-to-many column="contract" class="Contract"/>
+        </set>
+        <set name="infos" inverse="false"  mutable="true" cascade="all-delete-orphan">
+            <key column="col_plan"/>
+            <one-to-many class="Info"/>
+        </set>
+    </class>
+
+    <class name="Party" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <property name="name" not-null="true"/>
+        <set name="infos" inverse="false"  mutable="true" cascade="all-delete-orphan">
+            <key column="party"/>
+            <one-to-many class="Info"/>
+        </set>
+    </class>
+
+	<class name="Contract" mutable="false">
+		<id name="id">
+			<generator class="increment"/>
+		</id>
+		<property name="customerName" not-null="true"/>
+		<property name="type" not-null="true"/>
+		<bag name="variations" inverse="false" order-by="id asc"
+				mutable="true" cascade="all-delete-orphan" fetch="join">
+			<key column="contract"/>
+			<one-to-many class="ContractVariation"/>
+		</bag>
+        <many-to-one name="parent" update="false" insert="false"/>
+        <set name="subcontracts" inverse="false"
+                mutable="true" cascade="all" fetch="join">
+            <key column="parent"/>
+            <one-to-many class="Contract"/>
+        </set>
+        <set name="parties" inverse="false"  mutable="true" cascade="all" fetch="join">
+            <key column="contract"/>
+            <one-to-many class="Party"/>
+        </set>
+        <set name="infos" inverse="false"  mutable="true" cascade="all-delete-orphan">
+            <key column="contract"/>
+            <one-to-many class="Info"/>
+        </set>
+	</class>
+
+	<class name="ContractVariation" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+		<property name="text" type="text"/>
+        <many-to-one name="contract" insert="false" update="false" not-null="false"/>
+       <set name="infos" inverse="false"  mutable="true" cascade="all-delete-orphan">
+            <key column="contractvariation"/>
+            <one-to-many class="Info"/>
+        </set>
+	</class>
+	
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/ContractVariationUnidir.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/ContractVariationVersioned.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/ContractVariationVersioned.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/ContractVariationVersioned.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,94 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+  Test for immutable classes/collections.
+     
+-->
+
+<hibernate-mapping package="org.hibernate.test.immutable.entitywithmutablecollection">
+    <class name="Info" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <version name="version" column="VERS" type="long" />
+        <property name="text"/>
+    </class>
+
+    <class name="Plan" table="tbl_plan" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <version name="version" column="VERS" type="long" />
+        <property name="description" not-null="true"/>
+        <set name="contracts" table="plan_contract" inverse="false" mutable="true" cascade="all" fetch="join">
+            <key column="col_plan"/>
+            <many-to-many column="contract" class="Contract"/>
+        </set>
+        <set name="infos" inverse="false"  mutable="true" cascade="all-delete-orphan">
+            <key column="col_plan"/>
+            <one-to-many class="Info"/>
+        </set>
+    </class>
+
+    <class name="Party" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <version name="version" column="VERS" type="long" />
+        <many-to-one name="contract" update="false" insert="false" not-null="false"/>
+        <property name="name" not-null="true"/>
+        <set name="infos" inverse="false"  mutable="true" cascade="all-delete-orphan">
+            <key column="party"/>
+            <one-to-many class="Info"/>
+        </set>
+    </class>
+
+	<class name="Contract" mutable="false">
+		<id name="id">
+			<generator class="increment"/>
+		</id>
+        <version name="version" column="VERS" type="long" />
+		<property name="customerName" not-null="true"/>
+		<property name="type" not-null="true"/>
+		<bag name="variations" inverse="false" order-by="id asc"
+				mutable="true" cascade="all-delete-orphan" fetch="join">
+			<key column="contract"/>
+			<one-to-many class="ContractVariation"/>
+		</bag>
+        <many-to-one name="parent" update="false" insert="false"/>
+        <set name="subcontracts" inverse="false"
+                mutable="true" cascade="all" fetch="join">
+            <key column="parent"/>
+            <one-to-many class="Contract"/>
+        </set>
+        <set name="plans" table="plan_contract" inverse="true" mutable="true" cascade="none">
+            <key column="contract"/>
+            <many-to-many column="col_plan" class="Plan"/>
+        </set>
+        <set name="parties" inverse="false"  mutable="true" cascade="all" fetch="join">
+            <key column="contract"/>
+            <one-to-many class="Party"/>
+        </set>
+        <set name="infos" inverse="false"  mutable="true" cascade="all-delete-orphan">
+            <key column="contract"/>
+            <one-to-many class="Info"/>
+        </set>
+	</class>
+
+	<class name="ContractVariation" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+		<property name="text" type="text"/>
+        <many-to-one name="contract" insert="false" update="false" not-null="false"/>
+        <set name="infos" inverse="false"  mutable="true" cascade="all-delete-orphan">
+            <key column="contractvariation"/>
+            <one-to-many class="Info"/>
+        </set>
+	</class>
+	
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/ContractVariationVersioned.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/ContractVariationVersionedOneToManyJoin.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/ContractVariationVersionedOneToManyJoin.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/ContractVariationVersionedOneToManyJoin.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,101 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+  Test for immutable classes/collections.
+     
+-->
+
+<hibernate-mapping package="org.hibernate.test.immutable.entitywithmutablecollection">
+    <class name="Info" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <version name="version" column="VERS" type="long" />
+        <property name="text"/>
+    </class>
+
+    <class name="Plan" table="tbl_plan" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <version name="version" column="VERS" type="long" />
+        <property name="description" not-null="true"/>
+        <set name="contracts" table="plan_contract" inverse="false" mutable="true" cascade="all" fetch="join">
+            <key column="col_plan"/>
+            <many-to-many column="contract" class="Contract"/>
+        </set>
+        <set name="infos" inverse="false"  mutable="true" cascade="all-delete-orphan">
+            <key column="col_plan"/>
+            <one-to-many class="Info"/>
+        </set>
+    </class>
+
+    <class name="Party" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <version name="version" column="VERS" type="long" />
+        <property name="name" not-null="true"/>
+        <set name="infos" inverse="false"  mutable="true" cascade="all-delete-orphan">
+            <key column="party"/>
+            <one-to-many class="Info"/>
+        </set>
+        <join table="contract_party"
+            inverse="true"
+            optional="true">
+            <key column="party"/>
+            <many-to-one name="contract"
+                column="contract"
+                not-null="true"/>
+        </join>
+    </class>
+
+	<class name="Contract" mutable="false">
+		<id name="id">
+			<generator class="increment"/>
+		</id>
+        <version name="version" column="VERS" type="long" />
+		<property name="customerName" not-null="true"/>
+		<property name="type" not-null="true"/>
+		<bag name="variations" inverse="false" order-by="id asc"
+				mutable="true" cascade="all-delete-orphan" fetch="join">
+			<key column="contract"/>
+			<one-to-many class="ContractVariation"/>
+		</bag>
+        <many-to-one name="parent" update="false" insert="false"/>
+        <set name="subcontracts" inverse="false"
+                mutable="true" cascade="all" fetch="join">
+            <key column="parent"/>
+            <one-to-many class="Contract"/>
+        </set>
+        <set name="plans" table="plan_contract" inverse="true" mutable="true" cascade="none">
+            <key column="contract"/>
+            <many-to-many column="col_plan" class="Plan"/>
+        </set>
+        <set name="parties" table="contract_party" inverse="false"  mutable="true" cascade="all">
+            <key column="contract"/>
+            <many-to-many column="party" unique="true" class="Party"/>
+        </set>
+        <set name="infos" inverse="false"  mutable="true" cascade="all-delete-orphan">
+            <key column="contract"/>
+            <one-to-many class="Info"/>
+        </set>
+	</class>
+
+	<class name="ContractVariation" mutable="false">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+		<property name="text" type="text"/>
+        <many-to-one name="contract" insert="false" update="false" not-null="false"/>
+        <set name="infos" inverse="false"  mutable="true" cascade="all-delete-orphan">
+            <key column="contractvariation"/>
+            <one-to-many class="Info"/>
+        </set>
+	</class>
+	
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/ContractVariationVersionedOneToManyJoin.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/EntityWithNonInverseManyToManyTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/EntityWithNonInverseManyToManyTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/EntityWithNonInverseManyToManyTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,50 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.immutable.entitywithmutablecollection.noninverse;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.immutable.entitywithmutablecollection.AbstractEntityWithManyToManyTest;
+
+
+/**
+ * @author Gail Badner
+ */
+public class EntityWithNonInverseManyToManyTest extends AbstractEntityWithManyToManyTest {
+
+	public EntityWithNonInverseManyToManyTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "immutable/entitywithmutablecollection/noninverse/ContractVariation.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( EntityWithNonInverseManyToManyTest.class );
+	}
+
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/EntityWithNonInverseManyToManyTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/EntityWithNonInverseManyToManyUnidirTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/EntityWithNonInverseManyToManyUnidirTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/EntityWithNonInverseManyToManyUnidirTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,50 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.immutable.entitywithmutablecollection.noninverse;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.immutable.entitywithmutablecollection.AbstractEntityWithManyToManyTest;
+
+
+/**
+ * @author Gail Badner
+ */
+public class EntityWithNonInverseManyToManyUnidirTest extends AbstractEntityWithManyToManyTest {
+
+	public EntityWithNonInverseManyToManyUnidirTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "immutable/entitywithmutablecollection/noninverse/ContractVariationUnidir.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( EntityWithNonInverseManyToManyUnidirTest.class );
+	}
+
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/EntityWithNonInverseManyToManyUnidirTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/EntityWithNonInverseOneToManyJoinTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/EntityWithNonInverseOneToManyJoinTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/EntityWithNonInverseOneToManyJoinTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,50 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.immutable.entitywithmutablecollection.noninverse;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.immutable.entitywithmutablecollection.AbstractEntityWithOneToManyTest;
+
+
+/**
+ * @author Gail Badner
+ */
+public class EntityWithNonInverseOneToManyJoinTest extends AbstractEntityWithOneToManyTest {
+
+	public EntityWithNonInverseOneToManyJoinTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "immutable/entitywithmutablecollection/noninverse/ContractVariationOneToManyJoin.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( EntityWithNonInverseOneToManyJoinTest.class );
+	}
+
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/EntityWithNonInverseOneToManyJoinTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/EntityWithNonInverseOneToManyTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/EntityWithNonInverseOneToManyTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/EntityWithNonInverseOneToManyTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,50 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.immutable.entitywithmutablecollection.noninverse;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.immutable.entitywithmutablecollection.AbstractEntityWithOneToManyTest;
+
+
+/**
+ * @author Gail Badner
+ */
+public class EntityWithNonInverseOneToManyTest extends AbstractEntityWithOneToManyTest {
+
+	public EntityWithNonInverseOneToManyTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "immutable/entitywithmutablecollection/noninverse/ContractVariation.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( EntityWithNonInverseOneToManyTest.class );
+	}
+
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/EntityWithNonInverseOneToManyTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/EntityWithNonInverseOneToManyUnidirTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/EntityWithNonInverseOneToManyUnidirTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/EntityWithNonInverseOneToManyUnidirTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,50 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.immutable.entitywithmutablecollection.noninverse;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.immutable.entitywithmutablecollection.AbstractEntityWithOneToManyTest;
+
+
+/**
+ * @author Gail Badner
+ */
+public class EntityWithNonInverseOneToManyUnidirTest extends AbstractEntityWithOneToManyTest {
+
+	public EntityWithNonInverseOneToManyUnidirTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "immutable/entitywithmutablecollection/noninverse/ContractVariationUnidir.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( EntityWithNonInverseOneToManyUnidirTest.class );
+	}
+
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/EntityWithNonInverseOneToManyUnidirTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/VersionedEntityWithNonInverseManyToManyTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/VersionedEntityWithNonInverseManyToManyTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/VersionedEntityWithNonInverseManyToManyTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,50 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.immutable.entitywithmutablecollection.noninverse;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.immutable.entitywithmutablecollection.AbstractEntityWithManyToManyTest;
+
+
+/**
+ * @author Gail Badner
+ */
+public class VersionedEntityWithNonInverseManyToManyTest extends AbstractEntityWithManyToManyTest {
+
+	public VersionedEntityWithNonInverseManyToManyTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "immutable/entitywithmutablecollection/noninverse/ContractVariationVersioned.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( VersionedEntityWithNonInverseManyToManyTest.class );
+	}
+
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/VersionedEntityWithNonInverseManyToManyTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/VersionedEntityWithNonInverseOneToManyJoinTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/VersionedEntityWithNonInverseOneToManyJoinTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/VersionedEntityWithNonInverseOneToManyJoinTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,50 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.immutable.entitywithmutablecollection.noninverse;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.immutable.entitywithmutablecollection.AbstractEntityWithOneToManyTest;
+
+
+/**
+ * @author Gail Badner
+ */
+public class VersionedEntityWithNonInverseOneToManyJoinTest extends AbstractEntityWithOneToManyTest {
+
+	public VersionedEntityWithNonInverseOneToManyJoinTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "immutable/entitywithmutablecollection/noninverse/ContractVariationVersionedOneToManyJoin.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( VersionedEntityWithNonInverseOneToManyJoinTest.class );
+	}
+
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/VersionedEntityWithNonInverseOneToManyJoinTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/VersionedEntityWithNonInverseOneToManyTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/VersionedEntityWithNonInverseOneToManyTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/VersionedEntityWithNonInverseOneToManyTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,50 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.immutable.entitywithmutablecollection.noninverse;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.immutable.entitywithmutablecollection.AbstractEntityWithOneToManyTest;
+
+
+/**
+ * @author Gail Badner
+ */
+public class VersionedEntityWithNonInverseOneToManyTest extends AbstractEntityWithOneToManyTest {
+
+	public VersionedEntityWithNonInverseOneToManyTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "immutable/entitywithmutablecollection/noninverse/ContractVariationVersioned.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( VersionedEntityWithNonInverseOneToManyTest.class );
+	}
+
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/immutable/entitywithmutablecollection/noninverse/VersionedEntityWithNonInverseOneToManyTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/insertordering/Group.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/insertordering/Group.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/insertordering/Group.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,29 @@
+package org.hibernate.test.insertordering;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class Group {
+	private Long id;
+	private String name;
+
+	/**
+	 * for persistence
+	 */
+	Group() {
+	}
+
+	public Group(String name) {
+		this.name = name;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public String getName() {
+		return name;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/insertordering/Group.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/insertordering/InsertOrderingTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/insertordering/InsertOrderingTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/insertordering/InsertOrderingTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,127 @@
+package org.hibernate.test.insertordering;
+
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.sql.SQLException;
+import java.sql.PreparedStatement;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.Session;
+import org.hibernate.Interceptor;
+import org.hibernate.HibernateException;
+import org.hibernate.jdbc.BatchingBatcher;
+import org.hibernate.jdbc.ConnectionManager;
+import org.hibernate.jdbc.Expectation;
+import org.hibernate.jdbc.BatcherFactory;
+import org.hibernate.jdbc.Batcher;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class InsertOrderingTest extends FunctionalTestCase {
+	public InsertOrderingTest(String string) {
+		super( string );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( InsertOrderingTest.class );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "insertordering/Mapping.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		super.configure( cfg );
+		cfg.setProperty( Environment.ORDER_INSERTS, "true" );
+		cfg.setProperty( Environment.STATEMENT_BATCH_SIZE, "10" );
+		cfg.setProperty( Environment.BATCH_STRATEGY, StatsBatcherFactory.class.getName() );
+	}
+
+	public void testBatchOrdering() {
+		Session s = openSession();
+		s.beginTransaction();
+		int iterations = 12;
+		for ( int i = 0; i < iterations; i++ ) {
+			User user = new User( "user-" + i );
+			Group group = new Group( "group-" + i );
+			s.save( user );
+			s.save( group );
+			user.addMembership( group );
+		}
+		StatsBatcher.reset();
+		s.getTransaction().commit();
+		s.close();
+
+		assertEquals( 6, StatsBatcher.batchSizes.size() );  // 2 batches of each insert statement
+
+		s = openSession();
+		s.beginTransaction();
+		Iterator users = s.createQuery( "from User u left join fetch u.memberships m left join fetch m.group" ).list().iterator();
+		while ( users.hasNext() ) {
+			s.delete( users.next() );
+		}
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public static class Counter {
+		public int count = 0;
+	}
+
+	public static class StatsBatcher extends BatchingBatcher {
+		private static String batchSQL;
+		private static List batchSizes = new ArrayList();
+		private static int currentBatch = -1;
+
+		public StatsBatcher(ConnectionManager connectionManager, Interceptor interceptor) {
+			super( connectionManager, interceptor );
+		}
+
+		static void reset() {
+			batchSizes = new ArrayList();
+			currentBatch = -1;
+			batchSQL = null;
+		}
+
+		public PreparedStatement prepareBatchStatement(String sql) throws SQLException {
+			PreparedStatement rtn = super.prepareBatchStatement( sql );
+			if ( batchSQL == null || !batchSQL.equals( sql ) ) {
+				currentBatch++;
+				batchSQL = sql;
+				batchSizes.add( currentBatch, new Counter() );
+				System.out.println( "--------------------------------------------------------" );
+				System.out.println( "Preparing statement [" + sql + "]" );
+			}
+			return rtn;
+		}
+
+		public void addToBatch(Expectation expectation) throws SQLException, HibernateException {
+			Counter counter = ( Counter ) batchSizes.get( currentBatch );
+			counter.count++;
+			System.out.println( "Adding to batch [" + batchSQL + "]" );
+			super.addToBatch( expectation );
+		}
+
+		protected void doExecuteBatch(PreparedStatement ps) throws SQLException, HibernateException {
+			System.out.println( "executing batch [" + batchSQL + "]" );
+			System.out.println( "--------------------------------------------------------" );
+			batchSQL = null;
+			super.doExecuteBatch( ps );
+		}
+	}
+
+	public static class StatsBatcherFactory implements BatcherFactory {
+		public Batcher createBatcher(ConnectionManager connectionManager, Interceptor interceptor) {
+			return new StatsBatcher( connectionManager, interceptor );
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/insertordering/InsertOrderingTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/insertordering/Mapping.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/insertordering/Mapping.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/insertordering/Mapping.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.insertordering" default-access="field">
+
+	<class name="User" table="INS_ORD_USR">
+		<id name="id">
+			<generator class="increment"/>
+		</id>
+        <property name="username" column="USR_NM" />
+        <set name="memberships" fetch="select" lazy="true" inverse="true" cascade="all">
+            <key column="USR_ID"/>
+            <one-to-many class="Membership"/>
+        </set>
+    </class>
+	
+	<class name="Group" table="INS_ORD_GRP">
+		<id name="id">
+			<generator class="increment"/>
+		</id>
+		<property name="name"/>
+	</class>
+
+    <class name="Membership" table="INS_ORD_MEM">
+        <id name="id">
+            <generator class="increment" />
+        </id>
+        <many-to-one name="user" class="User" column="USR_ID" cascade="all"/>
+        <many-to-one name="group" class="Group" column="GRP_ID" cascade="all"/>
+        <property name="activationDate" type="timestamp" column="JN_DT"/>
+    </class>
+</hibernate-mapping>
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/insertordering/Mapping.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/insertordering/Membership.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/insertordering/Membership.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/insertordering/Membership.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,47 @@
+package org.hibernate.test.insertordering;
+
+import java.util.Date;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class Membership {
+	private Long id;
+	private User user;
+	private Group group;
+	private Date activationDate;
+
+	/**
+	 * For persistence
+	 */
+	Membership() {
+	}
+
+	public Membership(User user, Group group) {
+		this( user, group, new Date() );
+	}
+
+	public Membership(User user, Group group, Date activationDate) {
+		this.user = user;
+		this.group = group;
+		this.activationDate = activationDate;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public User getUser() {
+		return user;
+	}
+
+	public Group getGroup() {
+		return group;
+	}
+
+	public Date getActivationDate() {
+		return activationDate;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/insertordering/Membership.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/insertordering/User.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/insertordering/User.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/insertordering/User.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,44 @@
+package org.hibernate.test.insertordering;
+
+import java.util.Set;
+import java.util.HashSet;
+import java.util.Iterator;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class User {
+	private Long id;
+	private String username;
+	private Set memberships = new HashSet();
+
+	/**
+	 * for persistence
+	 */
+	User() {
+	}
+
+	public User(String username) {
+		this.username = username;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public String getUsername() {
+		return username;
+	}
+
+	public Iterator getMemberships() {
+		return memberships.iterator();
+	}
+
+	public Membership addMembership(Group group) {
+		Membership membership = new Membership( this, group );
+		memberships.add( membership );
+		return membership;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/insertordering/User.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/buildtime/InstrumentTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/buildtime/InstrumentTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/buildtime/InstrumentTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,98 @@
+//$Id: InstrumentTest.java 10976 2006-12-12 23:22:26Z steve.ebersole at jboss.com $
+package org.hibernate.test.instrument.buildtime;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.hibernate.intercept.FieldInterceptionHelper;
+import org.hibernate.testing.junit.UnitTestCase;
+import org.hibernate.test.instrument.cases.Executable;
+import org.hibernate.test.instrument.cases.TestCustomColumnReadAndWrite;
+import org.hibernate.test.instrument.cases.TestDirtyCheckExecutable;
+import org.hibernate.test.instrument.cases.TestFetchAllExecutable;
+import org.hibernate.test.instrument.cases.TestInjectFieldInterceptorExecutable;
+import org.hibernate.test.instrument.cases.TestIsPropertyInitializedExecutable;
+import org.hibernate.test.instrument.cases.TestLazyExecutable;
+import org.hibernate.test.instrument.cases.TestLazyManyToOneExecutable;
+import org.hibernate.test.instrument.cases.TestLazyPropertyCustomTypeExecutable;
+import org.hibernate.test.instrument.cases.TestManyToOneProxyExecutable;
+import org.hibernate.test.instrument.cases.TestSharedPKOneToOneExecutable;
+import org.hibernate.test.instrument.domain.Document;
+
+/**
+ * @author Gavin King
+ */
+public class InstrumentTest extends UnitTestCase {
+
+	public InstrumentTest(String str) {
+		super(str);
+	}
+
+	public static Test suite() {
+		return new TestSuite( InstrumentTest.class );
+	}
+
+	public void testDirtyCheck() throws Exception {
+		execute( new TestDirtyCheckExecutable() );
+	}
+
+	public void testFetchAll() throws Exception {
+		execute( new TestFetchAllExecutable() );
+	}
+
+	public void testLazy() throws Exception {
+		execute( new TestLazyExecutable() );
+	}
+
+	public void testLazyManyToOne() throws Exception {
+		execute( new TestLazyManyToOneExecutable() );
+	}
+
+	public void testSetFieldInterceptor() throws Exception {
+		execute( new TestInjectFieldInterceptorExecutable() );
+	}
+
+	public void testPropertyInitialized() throws Exception {
+		execute( new TestIsPropertyInitializedExecutable() );
+	}
+
+	public void testManyToOneProxy() throws Exception {
+		execute( new TestManyToOneProxyExecutable() );
+	}
+
+	public void testLazyPropertyCustomTypeExecutable() throws Exception {
+		execute( new TestLazyPropertyCustomTypeExecutable() );
+	}
+
+	public void testSharedPKOneToOne() throws Exception {
+		execute( new TestSharedPKOneToOneExecutable() );
+	}
+
+	public void testCustomColumnReadAndWrite() throws Exception {
+		execute( new TestCustomColumnReadAndWrite() );
+	}	
+	
+	private void execute(Executable executable) throws Exception {
+		executable.prepare();
+		try {
+			executable.execute();
+		}
+		finally {
+			executable.complete();
+		}
+	}
+
+	protected void runTest() throws Throwable {
+		if ( isRunnable() ) {
+			super.runTest();
+		}
+		else {
+			reportSkip( "domain classes not instrumented", "build-time instrumentation" );
+		}
+	}
+
+	public static boolean isRunnable() {
+		return FieldInterceptionHelper.isInstrumented( new Document() );
+	}
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/buildtime/InstrumentTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/AbstractExecutable.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/AbstractExecutable.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/AbstractExecutable.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,42 @@
+package org.hibernate.test.instrument.cases;
+
+import org.hibernate.SessionFactory;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+
+/**
+ * @author Steve Ebersole
+ */
+public abstract class AbstractExecutable implements Executable {
+
+	private SessionFactory factory;
+
+	public final void prepare() {
+		Configuration cfg = new Configuration().setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
+		String[] resources = getResources();
+		for ( int i = 0; i < resources.length; i++ ) {
+			cfg.addResource( resources[i] );
+		}
+		factory = cfg.buildSessionFactory();
+	}
+
+	public final void complete() {
+		try {
+			cleanup();
+		}
+		finally {
+			factory.close();
+		}
+	}
+
+	protected SessionFactory getFactory() {
+		return factory;
+	}
+
+	protected void cleanup() {
+	}
+
+	protected String[] getResources() {
+		return new String[] { "org/hibernate/test/instrument/domain/Documents.hbm.xml" };
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/AbstractExecutable.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/Executable.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/Executable.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/Executable.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,10 @@
+package org.hibernate.test.instrument.cases;
+
+/**
+ * @author Steve Ebersole
+ */
+public interface Executable {
+	public void prepare();
+	public void execute() throws Exception;
+	public void complete();
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/Executable.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestCustomColumnReadAndWrite.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestCustomColumnReadAndWrite.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestCustomColumnReadAndWrite.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,66 @@
+package org.hibernate.test.instrument.cases;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Transaction;
+import org.hibernate.classic.Session;
+import org.hibernate.test.instrument.domain.Document;
+import org.hibernate.test.instrument.domain.Folder;
+import org.hibernate.test.instrument.domain.Owner;
+
+/**
+ * @author Rob.Hasselbaum
+ */
+public class TestCustomColumnReadAndWrite extends AbstractExecutable {
+	public void execute() {
+		Session s = getFactory().openSession();
+		Transaction t = s.beginTransaction();
+		final double SIZE_IN_KB = 20480;
+		final double SIZE_IN_MB = SIZE_IN_KB / 1024d;
+		Owner o = new Owner();
+		Document doc = new Document();
+		Folder fol = new Folder();
+		o.setName("gavin");
+		doc.setName("Hibernate in Action");
+		doc.setSummary("blah");
+		doc.updateText("blah blah");	
+		fol.setName("books");
+		doc.setOwner(o);
+		doc.setFolder(fol);
+		doc.setSizeKb(SIZE_IN_KB);
+		fol.getDocuments().add(doc);
+		s.persist(o);
+		s.persist(fol);
+		t.commit();
+		s.close();
+
+		s = getFactory().openSession();
+		t = s.beginTransaction();
+		
+		// Check value conversion on insert
+		Double sizeViaSql = (Double)s.createSQLQuery("select size_mb from documents").uniqueResult();
+		assertEquals( SIZE_IN_MB, sizeViaSql, 0.01d );
+
+		// Test explicit fetch of all properties
+		doc = (Document) s.createQuery("from Document fetch all properties").uniqueResult();
+		assertTrue( Hibernate.isPropertyInitialized( doc, "sizeKb" ) );
+		assertEquals( SIZE_IN_KB, doc.getSizeKb() );
+		t.commit();
+		s.close();		
+
+		// Test lazy fetch with custom read
+		s = getFactory().openSession();
+		t = s.beginTransaction();
+		doc = (Document) s.get( Document.class, doc.getId() );
+		assertFalse( Hibernate.isPropertyInitialized( doc, "sizeKb" ) );
+		assertEquals( SIZE_IN_KB, doc.getSizeKb() );
+		s.delete(doc);
+		s.delete( doc.getOwner() );
+		s.delete( doc.getFolder() );
+		t.commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestCustomColumnReadAndWrite.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestDirtyCheckExecutable.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestDirtyCheckExecutable.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestDirtyCheckExecutable.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,49 @@
+package org.hibernate.test.instrument.cases;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.instrument.domain.Folder;
+
+import java.util.List;
+import java.util.Iterator;
+
+import junit.framework.Assert;
+
+/**
+ * @author Steve Ebersole
+ */
+public class TestDirtyCheckExecutable extends AbstractExecutable {
+	public void execute() {
+		Session s = getFactory().openSession();
+		Transaction t = s.beginTransaction();
+		Folder pics = new Folder();
+		pics.setName("pics");
+		Folder docs = new Folder();
+		docs.setName("docs");
+		s.persist(docs);
+		s.persist(pics);
+		t.commit();
+		s.close();
+
+		s = getFactory().openSession();
+		t = s.beginTransaction();
+		List list = s.createCriteria(Folder.class).list();
+		for ( Iterator iter = list.iterator(); iter.hasNext(); ) {
+			Folder f = (Folder) iter.next();
+			Assert.assertFalse( f.nameWasread );
+		}
+		t.commit();
+		s.close();
+
+		for ( Iterator iter = list.iterator(); iter.hasNext(); ) {
+			Folder f = (Folder) iter.next();
+			Assert.assertFalse( f.nameWasread );
+		}
+
+		s = getFactory().openSession();
+		t = s.beginTransaction();
+		s.createQuery("delete from Folder").executeUpdate();
+		t.commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestDirtyCheckExecutable.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestFetchAllExecutable.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestFetchAllExecutable.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestFetchAllExecutable.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,47 @@
+package org.hibernate.test.instrument.cases;
+
+import org.hibernate.Session;
+import org.hibernate.Hibernate;
+import org.hibernate.Transaction;
+import org.hibernate.test.instrument.domain.Owner;
+import org.hibernate.test.instrument.domain.Document;
+import org.hibernate.test.instrument.domain.Folder;
+import junit.framework.Assert;
+
+/**
+ * @author Steve Ebersole
+ */
+public class TestFetchAllExecutable extends AbstractExecutable {
+	public void execute() {
+		Session s = getFactory().openSession();
+		Transaction t = s.beginTransaction();
+		Owner o = new Owner();
+		Document doc = new Document();
+		Folder fol = new Folder();
+		o.setName("gavin");
+		doc.setName("Hibernate in Action");
+		doc.setSummary("blah");
+		doc.updateText("blah blah");
+		fol.setName("books");
+		doc.setOwner(o);
+		doc.setFolder(fol);
+		fol.getDocuments().add(doc);
+		s.persist(o);
+		s.persist(fol);
+		t.commit();
+		s.close();
+
+		s = getFactory().openSession();
+		t = s.beginTransaction();
+		doc = (Document) s.createQuery("from Document fetch all properties").uniqueResult();
+		Assert.assertTrue( Hibernate.isPropertyInitialized( doc, "summary" ) );
+		Assert.assertTrue( Hibernate.isPropertyInitialized( doc, "upperCaseName" ) );
+		Assert.assertTrue( Hibernate.isPropertyInitialized( doc, "owner" ) );
+		Assert.assertEquals( doc.getSummary(), "blah" );
+		s.delete(doc);
+		s.delete( doc.getOwner() );
+		s.delete( doc.getFolder() );
+		t.commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestFetchAllExecutable.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestInjectFieldInterceptorExecutable.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestInjectFieldInterceptorExecutable.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestInjectFieldInterceptorExecutable.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,17 @@
+package org.hibernate.test.instrument.cases;
+
+import org.hibernate.test.instrument.domain.Document;
+import org.hibernate.intercept.FieldInterceptionHelper;
+
+import java.util.HashSet;
+
+/**
+ * @author Steve Ebersole
+ */
+public class TestInjectFieldInterceptorExecutable extends AbstractExecutable {
+	public void execute() {
+		Document doc = new Document();
+		FieldInterceptionHelper.injectFieldInterceptor( doc, "Document", new HashSet(), null );
+		doc.getId();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestInjectFieldInterceptorExecutable.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestIsPropertyInitializedExecutable.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestIsPropertyInitializedExecutable.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestIsPropertyInitializedExecutable.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,48 @@
+//$Id: $
+package org.hibernate.test.instrument.cases;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.Hibernate;
+import org.hibernate.test.instrument.domain.Owner;
+import org.hibernate.test.instrument.domain.Document;
+import org.hibernate.test.instrument.domain.Folder;
+import junit.framework.Assert;
+
+/**
+ * @author Steve Ebersole
+ */
+public class TestIsPropertyInitializedExecutable extends AbstractExecutable {
+	public void execute() {
+		Session s = getFactory().openSession();
+		Transaction t = s.beginTransaction();
+		Owner o = new Owner();
+		Document doc = new Document();
+		Folder fol = new Folder();
+		o.setName("gavin");
+		doc.setName("Hibernate in Action");
+		doc.setSummary("blah");
+		doc.updateText("blah blah");
+		fol.setName("books");
+		doc.setOwner(o);
+		doc.setFolder(fol);
+		fol.getDocuments().add(doc);
+		Assert.assertTrue( Hibernate.isPropertyInitialized( doc, "summary" ) );
+		s.persist(o);
+		s.persist(fol);
+		t.commit();
+		s.close();
+
+		s = getFactory().openSession();
+		t = s.beginTransaction();
+		doc = (Document) s.get( Document.class, doc.getId() );
+		Assert.assertFalse( Hibernate.isPropertyInitialized( doc, "summary" ) );
+		Assert.assertFalse( Hibernate.isPropertyInitialized( doc, "upperCaseName" ) );
+		Assert.assertFalse( Hibernate.isPropertyInitialized( doc, "owner" ) );
+		s.delete(doc);
+		s.delete( doc.getOwner() );
+		s.delete( doc.getFolder() );
+		t.commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestIsPropertyInitializedExecutable.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestLazyExecutable.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestLazyExecutable.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestLazyExecutable.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,208 @@
+package org.hibernate.test.instrument.cases;
+
+import junit.framework.TestCase;
+
+import org.hibernate.CacheMode;
+import org.hibernate.Hibernate;
+import org.hibernate.LockMode;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.hibernate.test.instrument.domain.Document;
+import org.hibernate.test.instrument.domain.Folder;
+import org.hibernate.test.instrument.domain.Owner;
+
+/**
+ * @author Steve Ebersole
+ */
+public class TestLazyExecutable extends AbstractExecutable {
+	public void execute() {
+		// The following block is repeated 100 times to reproduce HHH-2627.
+		// Without the fix, Oracle will run out of cursors using 10g with
+		// a default installation (ORA-01000: maximum open cursors exceeded).
+		// The number of loops may need to be adjusted depending on the how
+		// Oracle is configured.
+		// Note: The block is not indented to avoid a lot of irrelevant differences.
+		for ( int i=0; i<100; i++ ) {
+
+		SessionFactory factory = getFactory();
+		Session s = factory.openSession();
+		Transaction t = s.beginTransaction();
+		Owner o = new Owner();
+		Document doc = new Document();
+		Folder fol = new Folder();
+		o.setName("gavin");
+		doc.setName("Hibernate in Action");
+		doc.setSummary("blah");
+		doc.updateText("blah blah");
+		fol.setName("books");
+		doc.setOwner(o);
+		doc.setFolder(fol);
+		fol.getDocuments().add(doc);
+		s.save(o);
+		s.save(fol);
+		t.commit();
+		s.close();
+
+		s = factory.openSession();
+		s.setCacheMode( CacheMode.IGNORE );
+		t = s.beginTransaction();
+		doc = ( Document ) s.get( Document.class, doc.getId() );
+		TestCase.assertTrue( Hibernate.isPropertyInitialized(doc, "weirdProperty"));
+		TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "name"));
+		TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "text"));
+		TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "upperCaseName"));
+		TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "folder"));
+		TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "owner"));
+		doc.getUpperCaseName();  // should force initialization
+		TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "text"));
+		TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "weirdProperty"));
+		TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "upperCaseName"));
+		TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "folder"));
+		TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "owner"));
+		t.commit();
+		s.close();
+
+		s = factory.openSession();
+		s.setCacheMode( CacheMode.IGNORE );
+		t = s.beginTransaction();
+		doc = (Document) s.createQuery("from Document").uniqueResult();
+		doc.getName();
+		TestCase.assertEquals( doc.getText(), "blah blah" );
+		t.commit();
+		s.close();
+
+		s = factory.openSession();
+		s.setCacheMode( CacheMode.IGNORE );
+		t = s.beginTransaction();
+		doc = (Document) s.createQuery("from Document").uniqueResult();
+		doc.getName();
+		TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "text"));
+		TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "summary"));
+		TestCase.assertEquals( doc.getText(), "blah blah" );
+		TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "text"));
+		TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "summary"));
+		t.commit();
+		s.close();
+
+		s = factory.openSession();
+		s.setCacheMode( CacheMode.IGNORE );
+		t = s.beginTransaction();
+		doc = (Document) s.createQuery("from Document").uniqueResult();
+		doc.setName("HiA");
+		t.commit();
+		s.close();
+
+		s = factory.openSession();
+		s.setCacheMode( CacheMode.IGNORE );
+		t = s.beginTransaction();
+		doc = (Document) s.createQuery("from Document").uniqueResult();
+		TestCase.assertEquals( doc.getName(), "HiA" );
+		TestCase.assertEquals( doc.getText(), "blah blah" );
+		t.commit();
+		s.close();
+
+		s = factory.openSession();
+		s.setCacheMode( CacheMode.IGNORE );
+		t = s.beginTransaction();
+		doc = (Document) s.createQuery("from Document").uniqueResult();
+		doc.getText();
+		doc.setName("HiA second edition");
+		t.commit();
+		s.close();
+
+		s = factory.openSession();
+		s.setCacheMode( CacheMode.IGNORE );
+		t = s.beginTransaction();
+		doc = (Document) s.createQuery("from Document").uniqueResult();
+		TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "weirdProperty"));
+		TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "name"));
+		TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "text"));
+		TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "upperCaseName"));
+		TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "owner"));
+		TestCase.assertEquals( doc.getName(), "HiA second edition" );
+		TestCase.assertEquals( doc.getText(), "blah blah" );
+		TestCase.assertEquals( doc.getUpperCaseName(), "HIA SECOND EDITION" );
+		TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "text"));
+		TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "weirdProperty"));
+		TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "upperCaseName"));
+		t.commit();
+		s.close();
+
+		s = factory.openSession();
+		s.setCacheMode( CacheMode.IGNORE );
+		t = s.beginTransaction();
+		doc = (Document) s.createQuery("from Document").uniqueResult();
+		t.commit();
+		s.close();
+
+		TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "text"));
+
+		s = factory.openSession();
+		s.setCacheMode( CacheMode.IGNORE );
+		t = s.beginTransaction();
+		s.lock(doc, LockMode.NONE);
+		TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "text"));
+		TestCase.assertEquals( doc.getText(), "blah blah" );
+		TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "text"));
+		t.commit();
+		s.close();
+
+		s = factory.openSession();
+		s.setCacheMode( CacheMode.IGNORE );
+		t = s.beginTransaction();
+		doc = (Document) s.createQuery("from Document").uniqueResult();
+		t.commit();
+		s.close();
+
+		doc.setName("HiA2");
+
+		TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "text"));
+
+		s = factory.openSession();
+		s.setCacheMode( CacheMode.IGNORE );
+		t = s.beginTransaction();
+		s.saveOrUpdate(doc);
+		s.flush();
+		TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "text"));
+		TestCase.assertEquals( doc.getText(), "blah blah" );
+		TestCase.assertTrue(Hibernate.isPropertyInitialized(doc, "text"));
+		doc.updateText("blah blah blah blah");
+		t.commit();
+		s.close();
+
+		s = factory.openSession();
+		s.setCacheMode( CacheMode.IGNORE );
+		t = s.beginTransaction();
+		doc = ( Document ) s.createQuery("from Document").uniqueResult();
+		TestCase.assertEquals( doc.getName(), "HiA2" );
+		TestCase.assertEquals( doc.getText(), "blah blah blah blah" );
+		t.commit();
+		s.close();
+
+		s = factory.openSession();
+		s.setCacheMode( CacheMode.IGNORE );
+		t = s.beginTransaction();
+		doc = (Document) s.load( Document.class, doc.getId() );
+		doc.getName();
+		TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "text"));
+		TestCase.assertFalse(Hibernate.isPropertyInitialized(doc, "summary"));
+		t.commit();
+		s.close();
+
+		s = factory.openSession();
+		s.setCacheMode( CacheMode.IGNORE );
+		t = s.beginTransaction();
+		doc = (Document) s.createQuery("from Document").uniqueResult();
+		//s.delete(doc);
+		s.delete( doc.getFolder() );
+		s.delete( doc.getOwner() );
+		s.flush();
+		t.commit();
+		s.close();
+
+		}
+
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestLazyExecutable.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestLazyManyToOneExecutable.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestLazyManyToOneExecutable.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestLazyManyToOneExecutable.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,74 @@
+package org.hibernate.test.instrument.cases;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.Hibernate;
+import org.hibernate.test.instrument.domain.Owner;
+import org.hibernate.test.instrument.domain.Document;
+import org.hibernate.test.instrument.domain.Folder;
+import org.hibernate.test.instrument.cases.AbstractExecutable;
+import junit.framework.Assert;
+
+/**
+ * @author Steve Ebersole
+ */
+public class TestLazyManyToOneExecutable extends AbstractExecutable {
+	public void execute() {
+		Session s = getFactory().openSession();
+		Transaction t = s.beginTransaction();
+		Owner gavin = new Owner();
+		Document hia = new Document();
+		Folder fol = new Folder();
+		gavin.setName("gavin");
+		hia.setName("Hibernate in Action");
+		hia.setSummary("blah");
+		hia.updateText("blah blah");
+		fol.setName("books");
+		hia.setOwner(gavin);
+		hia.setFolder(fol);
+		fol.getDocuments().add(hia);
+		s.persist(gavin);
+		s.persist(fol);
+		t.commit();
+		s.close();
+
+		s = getFactory().openSession();
+		t = s.beginTransaction();
+		hia = (Document) s.createCriteria(Document.class).uniqueResult();
+		Assert.assertEquals( hia.getFolder().getClass(), Folder.class);
+		fol = hia.getFolder();
+		Assert.assertTrue( Hibernate.isInitialized(fol) );
+		t.commit();
+		s.close();
+
+		s = getFactory().openSession();
+		t = s.beginTransaction();
+		hia = (Document) s.createCriteria(Document.class).uniqueResult();
+		Assert.assertSame( hia.getFolder(), s.load(Folder.class, fol.getId()) );
+		Assert.assertTrue( Hibernate.isInitialized( hia.getFolder() ) );
+		t.commit();
+		s.close();
+
+		s = getFactory().openSession();
+		t = s.beginTransaction();
+		fol = (Folder) s.get(Folder.class, fol.getId());
+		hia = (Document) s.createCriteria(Document.class).uniqueResult();
+		Assert.assertSame( fol, hia.getFolder() );
+		fol = hia.getFolder();
+		Assert.assertTrue( Hibernate.isInitialized(fol) );
+		t.commit();
+		s.close();
+
+		s = getFactory().openSession();
+		t = s.beginTransaction();
+		fol = (Folder) s.load(Folder.class, fol.getId());
+		hia = (Document) s.createCriteria(Document.class).uniqueResult();
+		Assert.assertNotSame( fol, hia.getFolder() );
+		fol = hia.getFolder();
+		Assert.assertTrue( Hibernate.isInitialized(fol) );
+		s.delete(hia.getFolder());
+		s.delete(hia.getOwner());
+		t.commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestLazyManyToOneExecutable.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestLazyPropertyCustomTypeExecutable.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestLazyPropertyCustomTypeExecutable.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestLazyPropertyCustomTypeExecutable.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,92 @@
+package org.hibernate.test.instrument.cases;
+
+import java.util.Iterator;
+
+import junit.framework.Assert;
+
+import org.hibernate.Session;
+import org.hibernate.intercept.FieldInterceptionHelper;
+import org.hibernate.test.instrument.domain.Problematic;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class TestLazyPropertyCustomTypeExecutable extends AbstractExecutable {
+
+	protected String[] getResources() {
+		return new String[] { "org/hibernate/test/instrument/domain/Problematic.hbm.xml" };
+	}
+
+	public void execute() throws Exception {
+		Session s = getFactory().openSession();
+		Problematic p = new Problematic();
+		try {
+			s.beginTransaction();
+			p.setName( "whatever" );
+			p.setBytes( new byte[] { 1, 0, 1, 1, 0 } );
+			s.save( p );
+			s.getTransaction().commit();
+		} catch (Exception e) {
+			s.getTransaction().rollback();
+			throw e;
+		} finally {
+			s.close();
+		}
+
+		// this access should be ok because p1 is not a lazy proxy 
+		s = getFactory().openSession();
+		try {
+			s.beginTransaction();
+			Problematic p1 = (Problematic) s.get( Problematic.class, p.getId() );
+			Assert.assertTrue( FieldInterceptionHelper.isInstrumented( p1 ) );
+			p1.getRepresentation();
+			s.getTransaction().commit();
+		} catch (Exception e) {
+			s.getTransaction().rollback();
+			throw e;
+		} finally {
+			s.close();
+		}
+		
+		s = getFactory().openSession();
+		try {
+			s.beginTransaction();
+			Problematic p1 = (Problematic) s.createQuery( "from Problematic" ).setReadOnly(true ).list().get( 0 );
+			p1.getRepresentation();
+			s.getTransaction().commit();
+		} catch (Exception e) {
+			s.getTransaction().rollback();
+			throw e;
+		} finally {
+			s.close();
+		}
+		
+		s = getFactory().openSession();
+		try {
+			s.beginTransaction();
+			Problematic p1 = (Problematic) s.load( Problematic.class, p.getId() );
+			Assert.assertFalse( FieldInterceptionHelper.isInstrumented( p1 ) );
+			p1.setRepresentation( p.getRepresentation() );
+			s.getTransaction().commit();
+		} catch (Exception e) {
+			s.getTransaction().rollback();
+			throw e;
+		} finally {
+			s.close();
+		}
+	}
+
+	protected void cleanup() {
+		Session s = getFactory().openSession();
+		s.beginTransaction();
+		Iterator itr = s.createQuery( "from Problematic" ).list().iterator();
+		while ( itr.hasNext() ) {
+			Problematic p = (Problematic) itr.next();
+			s.delete( p );
+		}
+		s.getTransaction().commit();
+		s.close();
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestLazyPropertyCustomTypeExecutable.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestManyToOneProxyExecutable.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestManyToOneProxyExecutable.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestManyToOneProxyExecutable.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,67 @@
+package org.hibernate.test.instrument.cases;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.Hibernate;
+import org.hibernate.test.instrument.domain.Entity;
+import junit.framework.Assert;
+
+/**
+ *
+ * @author Steve Ebersole
+ */
+public class TestManyToOneProxyExecutable extends AbstractExecutable {
+	public void execute() {
+		Session s = getFactory().openSession();
+		Transaction t = s.beginTransaction();
+		Entity root = new Entity( "root" );
+		Entity child1 = new Entity( "child1" );
+		Entity child2 = new Entity( "child2" );
+		root.setChild( child1 );
+		child1.setSibling( child2 );
+		Entity gChild1 = new Entity( "grandchild 1" );
+		Entity gChild2 = new Entity( "grandchild 2" );
+		child1.setChild( gChild1 );
+		gChild1.setSibling( gChild2 );
+		s.save( root );
+		t.commit();
+		s.close();
+
+		// NOTE : child is mapped with lazy="proxy"; sibling with lazy="no-proxy"...
+
+		s = getFactory().openSession();
+		t = s.beginTransaction();
+		// load root
+		root = ( Entity ) s.get( Entity.class, root.getId() );
+		Assert.assertFalse( Hibernate.isPropertyInitialized( root, "name" ) );
+		Assert.assertFalse( Hibernate.isPropertyInitialized( root, "sibling" ) );
+		Assert.assertTrue( Hibernate.isPropertyInitialized( root, "child" ) );
+
+		// get a handle to the child1 proxy reference (and make certain that
+		// this does not force the lazy properties of the root entity
+		// to get initialized.
+		child1 = root.getChild();
+		Assert.assertFalse( Hibernate.isInitialized( child1 ) );
+		Assert.assertFalse( Hibernate.isPropertyInitialized( root, "name" ) );
+		Assert.assertFalse( Hibernate.isPropertyInitialized( root, "sibling" ) );
+		Assert.assertFalse( Hibernate.isPropertyInitialized( child1, "name" ) );
+		Assert.assertFalse( Hibernate.isPropertyInitialized( child1, "sibling" ) );
+		Assert.assertFalse( Hibernate.isPropertyInitialized( child1, "child" ) );
+
+		child1.getName();
+		Assert.assertFalse( Hibernate.isPropertyInitialized( root, "name" ) );
+		Assert.assertFalse( Hibernate.isPropertyInitialized( root, "sibling" ) );
+		Assert.assertTrue( Hibernate.isPropertyInitialized( child1, "name" ) );
+		Assert.assertTrue( Hibernate.isPropertyInitialized( child1, "sibling" ) );
+		Assert.assertTrue( Hibernate.isPropertyInitialized( child1, "child" ) );
+
+		gChild1 = child1.getChild();
+		Assert.assertFalse( Hibernate.isInitialized( gChild1 ) );
+		Assert.assertFalse( Hibernate.isPropertyInitialized( root, "name" ) );
+		Assert.assertFalse( Hibernate.isPropertyInitialized( root, "sibling" ) );
+
+		s.delete( root );
+		t.commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestManyToOneProxyExecutable.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestSharedPKOneToOneExecutable.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestSharedPKOneToOneExecutable.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestSharedPKOneToOneExecutable.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,69 @@
+package org.hibernate.test.instrument.cases;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.Hibernate;
+import org.hibernate.test.instrument.domain.EntityWithOneToOnes;
+import org.hibernate.test.instrument.domain.OneToOneProxy;
+import org.hibernate.test.instrument.domain.OneToOneNoProxy;
+import junit.framework.Assert;
+
+/**
+ *
+ * @author Gail Badner
+ */
+public class TestSharedPKOneToOneExecutable extends AbstractExecutable {
+
+	protected String[] getResources() {
+		return new String[] {"org/hibernate/test/instrument/domain/SharedPKOneToOne.hbm.xml"};
+	}
+
+	public void execute() {
+		Session s = getFactory().openSession();
+		Transaction t = s.beginTransaction();
+		EntityWithOneToOnes root = new EntityWithOneToOnes( "root" );
+		OneToOneProxy oneToOneProxy = new OneToOneProxy( "oneToOneProxy" );
+		root.setOneToOneProxy( oneToOneProxy );
+		oneToOneProxy.setEntity( root );
+		OneToOneNoProxy oneToOneNoProxy = new OneToOneNoProxy( "oneToOneNoProxy" );
+		root.setOneToOneNoProxy( oneToOneNoProxy );
+		oneToOneNoProxy.setEntity( root );
+
+		s.save( root );
+		t.commit();
+		s.close();
+
+		// NOTE : oneToOneProxy is mapped with lazy="proxy"; oneToOneNoProxy with lazy="no-proxy"...
+
+		s = getFactory().openSession();
+		t = s.beginTransaction();
+		// load root
+		root = ( EntityWithOneToOnes ) s.load( EntityWithOneToOnes.class, root.getId() );
+		Assert.assertFalse( Hibernate.isInitialized( root ) );
+		Assert.assertFalse( Hibernate.isPropertyInitialized( root, "name" ) );
+		Assert.assertFalse( Hibernate.isPropertyInitialized( root, "oneToOneProxy" ) );
+		Assert.assertFalse( Hibernate.isPropertyInitialized( root, "oneToOneNoProxy" ) );
+
+		root.getName();
+		Assert.assertTrue( Hibernate.isInitialized( root ) );
+		Assert.assertTrue( Hibernate.isPropertyInitialized( root, "name" ) );
+		Assert.assertTrue( Hibernate.isPropertyInitialized( root, "oneToOneProxy" ) );
+		Assert.assertFalse( Hibernate.isPropertyInitialized( root, "oneToOneNoProxy" ) );
+
+		// get a handle to the oneToOneProxy proxy reference (and make certain that
+		// this does not force the lazy properties of the root entity
+		// to get initialized.
+		root.getOneToOneProxy();
+		Assert.assertTrue( Hibernate.isInitialized( oneToOneProxy ) );
+		Assert.assertTrue( Hibernate.isPropertyInitialized( root.getOneToOneProxy(), "name" ) );
+		Assert.assertFalse( Hibernate.isPropertyInitialized( root, "oneToOneNoProxy" ) );
+
+		root.getOneToOneNoProxy();
+		Assert.assertTrue( Hibernate.isPropertyInitialized( root, "oneToOneNoProxy" ) );
+		Assert.assertTrue( Hibernate.isPropertyInitialized( root.getOneToOneNoProxy(), "name") );
+
+		s.delete( root );
+		t.commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/cases/TestSharedPKOneToOneExecutable.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/CustomBlobType.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/CustomBlobType.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/CustomBlobType.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,109 @@
+package org.hibernate.test.instrument.domain;
+
+import java.io.Serializable;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.Arrays;
+
+import org.hibernate.HibernateException;
+import org.hibernate.Hibernate;
+import org.hibernate.usertype.UserType;
+
+/**
+ * A simple byte[]-based custom type.
+ */
+public class CustomBlobType implements UserType {
+	/**
+	 * {@inheritDoc}
+	 */
+	public Object nullSafeGet(ResultSet rs, String names[], Object owner) throws SQLException {
+		// cast just to make sure...
+		return ( byte[] ) Hibernate.BINARY.nullSafeGet( rs, names[0] );
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void nullSafeSet(PreparedStatement ps, Object value, int index) throws SQLException, HibernateException {
+		// cast just to make sure...
+		Hibernate.BINARY.nullSafeSet( ps, ( byte[] ) value, index );
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public Object deepCopy(Object value) {
+		byte result[] = null;
+
+		if ( value != null ) {
+			byte bytes[] = ( byte[] ) value;
+
+			result = new byte[bytes.length];
+			System.arraycopy( bytes, 0, result, 0, bytes.length );
+		}
+
+		return result;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean isMutable() {
+		return true;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public int[] sqlTypes() {
+		return new int[] { Types.VARBINARY };
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public Class returnedClass() {
+		return byte[].class;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean equals(Object x, Object y) {
+		return Arrays.equals( ( byte[] ) x, ( byte[] ) y );
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public Object assemble(Serializable arg0, Object arg1)
+			throws HibernateException {
+		return null;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public Serializable disassemble(Object arg0)
+			throws HibernateException {
+		return null;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public int hashCode(Object arg0)
+			throws HibernateException {
+		return 0;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public Object replace(Object arg0, Object arg1, Object arg2)
+			throws HibernateException {
+		return null;
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/CustomBlobType.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/Document.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/Document.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/Document.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,123 @@
+//$Id: Document.java 9538 2006-03-04 00:17:57Z steve.ebersole at jboss.com $
+package org.hibernate.test.instrument.domain;
+
+import java.util.Date;
+
+/**
+ * @author Gavin King
+ */
+public class Document {
+	private Long id;
+	private String name;
+	private String upperCaseName;
+	private String summary;
+	private String text;
+	private Owner owner;
+	private Folder folder;
+	private double sizeKb;
+	private Date lastTextModification = new Date();
+	/**
+	 * @return Returns the folder.
+	 */
+	public Folder getFolder() {
+		return folder;
+	}
+	/**
+	 * @param folder The folder to set.
+	 */
+	public void setFolder(Folder folder) {
+		this.folder = folder;
+	}
+	/**
+	 * @return Returns the owner.
+	 */
+	public Owner getOwner() {
+		return owner;
+	}
+	/**
+	 * @param owner The owner to set.
+	 */
+	public void setOwner(Owner owner) {
+		this.owner = owner;
+	}
+	/**
+	 * @return Returns the id.
+	 */
+	public Long getId() {
+		return id;
+	}
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(Long id) {
+		this.id = id;
+	}
+	/**
+	 * @return Returns the name.
+	 */
+	public String getName() {
+		return name;
+	}
+	/**
+	 * @param name The name to set.
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+	/**
+	 * @return Returns the summary.
+	 */
+	public String getSummary() {
+		return summary;
+	}
+	/**
+	 * @param summary The summary to set.
+	 */
+	public void setSummary(String summary) {
+		this.summary = summary;
+	}
+	/**
+	 * @return Returns the text.
+	 */
+	public String getText() {
+		return text;
+	}
+	/**
+	 * @param text The text to set.
+	 */
+	private void setText(String text) {
+		this.text = text;
+	}
+	/**
+	 * @return Returns the upperCaseName.
+	 */
+	public String getUpperCaseName() {
+		return upperCaseName;
+	}
+	/**
+	 * @param upperCaseName The upperCaseName to set.
+	 */
+	public void setUpperCaseName(String upperCaseName) {
+		this.upperCaseName = upperCaseName;
+	}
+	/**
+	 * @param sizeKb The size in KBs.
+	 */
+	public void setSizeKb(double sizeKb) {
+		this.sizeKb = sizeKb;
+	}
+	/**
+	 * @return The size in KBs.
+	 */
+	public double getSizeKb() {
+		return sizeKb;
+	}	
+	
+	public void updateText(String newText) {
+		if ( !newText.equals(text) ) {
+			this.text = newText;
+			lastTextModification = new Date();
+		}
+	}
+	
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/Document.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/Documents.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/Documents.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/Documents.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,72 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+  This mapping demonstrates
+
+     (1) use of lazy properties - this feature requires buildtime
+         bytecode instrumentation; we don't think this is a very
+         necessary feature, but provide it for completeleness; if
+         Hibernate encounters uninstrumented classes, lazy property
+         fetching will be silently disabled, to enable testing
+
+     (2) use of a formula to define a "derived property"
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.instrument.domain" default-access="field">
+
+    <class name="Folder" table="folders">
+    	<id name="id">
+    		<generator class="increment"/>
+    	</id>
+    	<property name="name" not-null="true" length="50"/>
+    	<many-to-one name="parent"/>
+    	<bag name="subfolders" inverse="true" cascade="save-update">
+    		<key column="parent"/>
+    		<one-to-many class="Folder"/>
+    	</bag>
+    	<bag name="documents" inverse="true" cascade="all-delete-orphan">
+    		<key column="folder"/>
+    		<one-to-many class="Document"/>
+    	</bag>
+	</class>
+
+	<class name="Owner" table="owners" lazy="false">
+   		<id name="id">
+    		<generator class="increment"/>
+    	</id>
+    	<property name="name" not-null="true" length="50"/>
+    </class>
+
+	<class name="Document" table="documents">
+   		<id name="id">
+    		<generator class="increment"/>
+    	</id>
+    	<property name="name" not-null="true" length="50"/>
+    	<property name="upperCaseName" formula="upper(name)" lazy="true"/>
+    	<property name="summary" not-null="true" length="200" lazy="true"/>
+    	<many-to-one name="folder" not-null="true" lazy="no-proxy"/>
+    	<many-to-one name="owner" not-null="true" lazy="no-proxy" fetch="select"/>
+    	<property name="text" not-null="true" length="2000" lazy="true"/>
+    	<property name="lastTextModification" not-null="true" lazy="true" access="field"/>
+    	<property name="sizeKb" lazy="true">
+    		<column name="size_mb"
+    			read="size_mb * 1024.0"
+    			write="? / cast( 1024.0 as float )"/>
+    	</property>
+    </class>
+
+    <class name="Entity" table="entity">
+        <id name="id" column="ID" type="long">
+            <generator class="increment"/>
+        </id>
+        <property name="name" column="NAME" type="string" lazy="true"/>
+        <many-to-one name="child" column="PRNT_ID" class="Entity" lazy="proxy" cascade="all" />
+        <many-to-one name="sibling" column="RIGHT_ID" class="Entity" lazy="no-proxy" cascade="all" />
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/Documents.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/Entity.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/Entity.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/Entity.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,52 @@
+package org.hibernate.test.instrument.domain;
+
+/**
+ * todo: describe Entity
+ *
+ * @author Steve Ebersole
+ */
+public class Entity {
+	private Long id;
+	private String name;
+	private Entity child;
+	private Entity sibling;
+
+	public Entity() {
+	}
+
+	public Entity(String name) {
+		this.name = name;
+	}
+
+	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 Entity getChild() {
+		return child;
+	}
+
+	public void setChild(Entity child) {
+		this.child = child;
+	}
+
+	public Entity getSibling() {
+		return sibling;
+	}
+
+	public void setSibling(Entity sibling) {
+		this.sibling = sibling;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/Entity.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/EntityWithOneToOnes.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/EntityWithOneToOnes.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/EntityWithOneToOnes.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,50 @@
+package org.hibernate.test.instrument.domain;
+
+/**
+ * @author Gail Badner
+ */
+public class EntityWithOneToOnes {
+	private Long id;
+	private String name;
+	private OneToOneNoProxy oneToOneNoProxy;
+	private OneToOneProxy oneToOneProxy;
+
+	public EntityWithOneToOnes() {
+	}
+
+	public EntityWithOneToOnes(String name) {
+		this.name = name;
+	}
+
+	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 OneToOneNoProxy getOneToOneNoProxy() {
+		return oneToOneNoProxy;
+	}
+
+	public void setOneToOneNoProxy(OneToOneNoProxy oneToOneNoProxy) {
+		this.oneToOneNoProxy = oneToOneNoProxy;
+	}
+
+	public OneToOneProxy getOneToOneProxy() {
+		return oneToOneProxy;
+	}
+
+	public void setOneToOneProxy(OneToOneProxy oneToOneProxy) {
+		this.oneToOneProxy = oneToOneProxy;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/EntityWithOneToOnes.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/Folder.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/Folder.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/Folder.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,80 @@
+//$Id: Folder.java 9538 2006-03-04 00:17:57Z steve.ebersole at jboss.com $
+package org.hibernate.test.instrument.domain;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+/**
+ * @author Gavin King
+ */
+public class Folder {
+	private Long id;
+	private String name;
+	private Folder parent;
+	private Collection subfolders = new ArrayList();
+	private Collection documents = new ArrayList();
+
+	public boolean nameWasread;
+	
+	/**
+	 * @return Returns the id.
+	 */
+	public Long getId() {
+		return id;
+	}
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(Long id) {
+		this.id = id;
+	}
+	/**
+	 * @return Returns the name.
+	 */
+	public String getName() {
+		nameWasread = true;
+		return name;
+	}
+	/**
+	 * @param name The name to set.
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+	/**
+	 * @return Returns the documents.
+	 */
+	public Collection getDocuments() {
+		return documents;
+	}
+	/**
+	 * @param documents The documents to set.
+	 */
+	public void setDocuments(Collection documents) {
+		this.documents = documents;
+	}
+	/**
+	 * @return Returns the parent.
+	 */
+	public Folder getParent() {
+		return parent;
+	}
+	/**
+	 * @param parent The parent to set.
+	 */
+	public void setParent(Folder parent) {
+		this.parent = parent;
+	}
+	/**
+	 * @return Returns the subfolders.
+	 */
+	public Collection getSubfolders() {
+		return subfolders;
+	}
+	/**
+	 * @param subfolders The subfolders to set.
+	 */
+	public void setSubfolders(Collection subfolders) {
+		this.subfolders = subfolders;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/Folder.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/OneToOneNoProxy.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/OneToOneNoProxy.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/OneToOneNoProxy.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,45 @@
+package org.hibernate.test.instrument.domain;
+
+/**
+ * @author Gail Badner
+ */
+public class OneToOneNoProxy {
+	private Long entityId;
+	private String name;
+	private EntityWithOneToOnes entity;
+
+	public OneToOneNoProxy() {}
+	public OneToOneNoProxy(String name) {
+		this.name = name;
+	}
+	/**
+	 * @return Returns the id.
+	 */
+	public Long getEntityId() {
+		return entityId;
+	}
+	/**
+	 * @param entityId The id to set.
+	 */
+	public void setEntityId(Long entityId) {
+		this.entityId = entityId;
+	}
+	/**
+	 * @return Returns the name.
+	 */
+	public String getName() {
+		return name;
+	}
+	/**
+	 * @param name The name to set.
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+	public EntityWithOneToOnes getEntity() {
+		return entity;
+	}
+	public void setEntity(EntityWithOneToOnes entity) {
+		this.entity = entity;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/OneToOneNoProxy.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/OneToOneProxy.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/OneToOneProxy.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/OneToOneProxy.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,45 @@
+package org.hibernate.test.instrument.domain;
+
+/**
+ * @author Gail Badner
+ */
+public class OneToOneProxy {
+	private Long entityId;
+	private String name;
+	private EntityWithOneToOnes entity;
+
+	public OneToOneProxy() {}
+	public OneToOneProxy(String name) {
+		this.name = name;
+	}
+	/**
+	 * @return Returns the id.
+	 */
+	public Long getEntityId() {
+		return entityId;
+	}
+	/**
+	 * @param entityId The id to set.
+	 */
+	public void setEntityId(Long entityId) {
+		this.entityId = entityId;
+	}
+	/**
+	 * @return Returns the name.
+	 */
+	public String getName() {
+		return name;
+	}
+	/**
+	 * @param name The name to set.
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+	public EntityWithOneToOnes getEntity() {
+		return entity;
+	}
+	public void setEntity(EntityWithOneToOnes entity) {
+		this.entity = entity;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/OneToOneProxy.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/Owner.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/Owner.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/Owner.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,34 @@
+//$Id: Owner.java 9538 2006-03-04 00:17:57Z steve.ebersole at jboss.com $
+package org.hibernate.test.instrument.domain;
+
+/**
+ * @author Gavin King
+ */
+public class Owner {
+	private Long id;
+	private String name;
+	/**
+	 * @return Returns the id.
+	 */
+	public Long getId() {
+		return id;
+	}
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(Long id) {
+		this.id = id;
+	}
+	/**
+	 * @return Returns the name.
+	 */
+	public String getName() {
+		return name;
+	}
+	/**
+	 * @param name The name to set.
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/Owner.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/Problematic.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/Problematic.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/Problematic.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.instrument.domain">
+    <class name="Problematic">
+        <id name="id" type="long" column="ID">
+            <generator class="increment" />
+        </id>
+        <property name="name" type="string" column="NAME" />
+        <property name="bytes" type="org.hibernate.test.instrument.domain.CustomBlobType" column="DATA" lazy="true" />
+    </class>
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/Problematic.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/Problematic.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/Problematic.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/Problematic.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,69 @@
+package org.hibernate.test.instrument.domain;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class Problematic {
+	private Long id;
+	private String name;
+	private byte[] bytes;
+
+	private Representation representation;
+
+	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 byte[] getBytes() {
+		return bytes;
+	}
+
+	public void setBytes(byte[] bytes) {
+		this.bytes = bytes;
+	}
+
+	public Representation getRepresentation() {
+		if ( representation == null ) {
+			representation =  ( ( bytes == null ) ? null : new Representation( bytes ) );
+		}
+		return representation;
+	}
+
+	public void setRepresentation(Representation rep) {
+		bytes = rep.getBytes();
+	}
+
+	public static class Representation {
+		private byte[] bytes;
+
+		public Representation(byte[] bytes) {
+			this.bytes = bytes;
+		}
+
+		public byte[] getBytes() {
+			return bytes;
+		}
+
+		public String toString() {
+			String result = "";
+			for ( int i = 0; i < bytes.length; i++ ) {
+				result += bytes[i];
+			}
+			return result;
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/Problematic.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/SharedPKOneToOne.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/SharedPKOneToOne.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/SharedPKOneToOne.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,51 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+  This mapping demonstrates shared PK one-to-one associations using
+  lazy="proxy" and lazy="no-proxy".
+
+  Implementation note: This test does not include any other
+  lazy properties, and allows testing special case code in
+  AbstractEntityPersister.initializeLazyPropertiesFromDatastore()
+  (lazy select string will be null) and OneToOne.nullSafeGet()
+  (ResultSet arg is ignored and the owner's ID is returned).
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.instrument.domain" default-access="field">
+
+    <class name="EntityWithOneToOnes">
+        <id name="id" column="ID" type="long">
+            <generator class="increment"/>
+        </id>
+        <one-to-one name="oneToOneNoProxy" class="OneToOneNoProxy" lazy="no-proxy" cascade="all" />
+        <one-to-one name="oneToOneProxy" class="OneToOneProxy" lazy="proxy" cascade="all" />
+        <property name="name"/>
+    </class>
+
+    <class name="OneToOneNoProxy">
+        <id name="entityId">
+            <generator class="foreign">
+                <param name="property">entity</param>
+            </generator>
+        </id>
+        <one-to-one name="entity" class="EntityWithOneToOnes" constrained="true"/>
+        <property name="name"/>
+    </class>
+
+    <class name="OneToOneProxy">
+        <id name="entityId">
+            <generator class="foreign">
+                <param name="property">entity</param>
+            </generator>
+        </id>
+        <one-to-one name="entity" class="EntityWithOneToOnes" constrained="true"/>
+        <property name="name"/>
+    </class>
+
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/domain/SharedPKOneToOne.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/runtime/AbstractTransformingClassLoaderInstrumentTestCase.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/runtime/AbstractTransformingClassLoaderInstrumentTestCase.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/runtime/AbstractTransformingClassLoaderInstrumentTestCase.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,125 @@
+package org.hibernate.test.instrument.runtime;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.hibernate.HibernateException;
+import org.hibernate.bytecode.BytecodeProvider;
+import org.hibernate.bytecode.InstrumentedClassLoader;
+import org.hibernate.bytecode.util.BasicClassFilter;
+import org.hibernate.bytecode.util.FieldFilter;
+import org.hibernate.testing.junit.AbstractClassLoaderIsolatedTestCase;
+
+/**
+ * @author Steve Ebersole
+ */
+public abstract class AbstractTransformingClassLoaderInstrumentTestCase extends AbstractClassLoaderIsolatedTestCase {
+
+	public AbstractTransformingClassLoaderInstrumentTestCase(String string) {
+		super( string );
+	}
+
+	protected ClassLoader buildIsolatedClassLoader(ClassLoader parent) {
+		BytecodeProvider provider = buildBytecodeProvider();
+		return new InstrumentedClassLoader(
+				parent,
+				provider.getTransformer(
+						new BasicClassFilter( new String[] { "org.hibernate.test.instrument" }, null ),
+						new FieldFilter() {
+							public boolean shouldInstrumentField(String className, String fieldName) {
+								return className.startsWith( "org.hibernate.test.instrument.domain" );
+							}
+							public boolean shouldTransformFieldAccess(String transformingClassName, String fieldOwnerClassName, String fieldName) {
+								return fieldOwnerClassName.startsWith( "org.hibernate.test.instrument.domain" )
+										&& transformingClassName.equals( fieldOwnerClassName );
+							}
+						}
+				)
+		);
+
+	}
+
+	protected void releaseIsolatedClassLoader(ClassLoader isolatedLoader) {
+	}
+
+	protected abstract BytecodeProvider buildBytecodeProvider();
+
+
+	// the tests ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+	public void testSetFieldInterceptor() {
+		executeExecutable( "org.hibernate.test.instrument.cases.TestInjectFieldInterceptorExecutable" );
+	}
+
+	public void testDirtyCheck() {
+		executeExecutable( "org.hibernate.test.instrument.cases.TestDirtyCheckExecutable" );
+	}
+
+	public void testFetchAll() throws Exception {
+		executeExecutable( "org.hibernate.test.instrument.cases.TestFetchAllExecutable" );
+	}
+
+	public void testLazy() {
+		executeExecutable( "org.hibernate.test.instrument.cases.TestLazyExecutable" );
+	}
+
+	public void testLazyManyToOne() {
+		executeExecutable( "org.hibernate.test.instrument.cases.TestLazyManyToOneExecutable" );
+	}
+
+	public void testPropertyInitialized() {
+		executeExecutable( "org.hibernate.test.instrument.cases.TestIsPropertyInitializedExecutable" );
+	}
+
+	public void testManyToOneProxy() {
+		executeExecutable( "org.hibernate.test.instrument.cases.TestManyToOneProxyExecutable" );
+	}
+
+	public void testLazyPropertyCustomType() {
+		executeExecutable( "org.hibernate.test.instrument.cases.TestLazyPropertyCustomTypeExecutable" );
+	}
+
+	public void testSharedPKOneToOne() {
+		executeExecutable( "org.hibernate.test.instrument.cases.TestSharedPKOneToOneExecutable" );
+	}
+
+	public void testCustomColumnReadAndWrite() {
+		executeExecutable( "org.hibernate.test.instrument.cases.TestCustomColumnReadAndWrite" );
+	}	
+
+	// reflection code to ensure isolation into the created classloader ~~~~~~~
+
+	private static final Class[] SIG = new Class[] {};
+	private static final Object[] ARGS = new Object[] {};
+
+	public void executeExecutable(String name) {
+		Class execClass = null;
+		Object executable = null;
+		try {
+			execClass = Thread.currentThread().getContextClassLoader().loadClass( name );
+			executable = execClass.newInstance();
+		}
+		catch( Throwable t ) {
+			throw new HibernateException( "could not load executable", t );
+		}
+		try {
+			execClass.getMethod( "prepare", SIG ).invoke( executable, ARGS );
+			execClass.getMethod( "execute", SIG ).invoke( executable, ARGS );
+		}
+		catch ( NoSuchMethodException e ) {
+			throw new HibernateException( "could not exeucte executable", e );
+		}
+		catch ( IllegalAccessException e ) {
+			throw new HibernateException( "could not exeucte executable", e );
+		}
+		catch ( InvocationTargetException e ) {
+			throw new HibernateException( "could not exeucte executable", e.getTargetException() );
+		}
+		finally {
+			try {
+				execClass.getMethod( "complete", SIG ).invoke( executable, ARGS );
+			}
+			catch ( Throwable ignore ) {
+			}
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/runtime/AbstractTransformingClassLoaderInstrumentTestCase.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/runtime/CGLIBInstrumentationTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/runtime/CGLIBInstrumentationTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/runtime/CGLIBInstrumentationTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,61 @@
+package org.hibernate.test.instrument.runtime;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.hibernate.bytecode.BytecodeProvider;
+import org.hibernate.bytecode.cglib.BytecodeProviderImpl;
+
+/**
+ * @author Steve Ebersole
+ */
+public class CGLIBInstrumentationTest extends AbstractTransformingClassLoaderInstrumentTestCase {
+	public CGLIBInstrumentationTest(String string) {
+		super( string );
+	}
+
+	protected BytecodeProvider buildBytecodeProvider() {
+		return new BytecodeProviderImpl();
+	}
+
+	public static Test suite() {
+		return new TestSuite( CGLIBInstrumentationTest.class );
+	}
+
+	public void testSetFieldInterceptor() {
+		super.testSetFieldInterceptor();    //To change body of overridden methods use File | Settings | File Templates.
+	}
+
+	public void testDirtyCheck() {
+		super.testDirtyCheck();    //To change body of overridden methods use File | Settings | File Templates.
+	}
+
+	public void testFetchAll() throws Exception {
+		super.testFetchAll();    //To change body of overridden methods use File | Settings | File Templates.
+	}
+
+	public void testLazy() {
+		super.testLazy();    //To change body of overridden methods use File | Settings | File Templates.
+	}
+
+	public void testLazyManyToOne() {
+		super.testLazyManyToOne();    //To change body of overridden methods use File | Settings | File Templates.
+	}
+
+	public void testPropertyInitialized() {
+		super.testPropertyInitialized();    //To change body of overridden methods use File | Settings | File Templates.
+	}
+
+	public void testManyToOneProxy() {
+		super.testManyToOneProxy();    //To change body of overridden methods use File | Settings | File Templates.
+	}
+
+	public void testSharedPKOneToOne() {
+		super.testSharedPKOneToOne();
+	}
+	
+	public void testCustomColumnReadAndWrite() {
+		super.testCustomColumnReadAndWrite();
+	}	
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/runtime/CGLIBInstrumentationTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/runtime/JavassistInstrumentationTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/runtime/JavassistInstrumentationTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/runtime/JavassistInstrumentationTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,62 @@
+//$Id: $
+package org.hibernate.test.instrument.runtime;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.hibernate.bytecode.BytecodeProvider;
+import org.hibernate.bytecode.javassist.BytecodeProviderImpl;
+
+/**
+ * @author Steve Ebersole
+ */
+public class JavassistInstrumentationTest extends AbstractTransformingClassLoaderInstrumentTestCase {
+	public JavassistInstrumentationTest(String string) {
+		super( string );
+	}
+
+	protected BytecodeProvider buildBytecodeProvider() {
+		return new BytecodeProviderImpl();
+	}
+
+	public static Test suite() {
+		return new TestSuite( JavassistInstrumentationTest.class );
+	}
+
+	public void testSetFieldInterceptor() {
+		super.testSetFieldInterceptor();
+	}
+
+	public void testDirtyCheck() {
+		super.testDirtyCheck();
+	}
+
+	public void testFetchAll() throws Exception {
+		super.testFetchAll();
+	}
+
+	public void testLazy() {
+		super.testLazy();
+	}
+
+	public void testLazyManyToOne() {
+		super.testLazyManyToOne();
+	}
+
+	public void testPropertyInitialized() {
+		super.testPropertyInitialized();
+	}
+
+	public void testManyToOneProxy() {
+		super.testManyToOneProxy();
+	}
+
+	public void testSharedPKOneToOne() {
+		super.testSharedPKOneToOne();
+	}
+
+	public void testCustomColumnReadAndWrite() {
+		super.testCustomColumnReadAndWrite();
+	}	
+	
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/instrument/runtime/JavassistInstrumentationTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/CollectionInterceptor.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/CollectionInterceptor.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/CollectionInterceptor.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,21 @@
+//$Id: CollectionInterceptor.java 7700 2005-07-30 05:02:47Z oneovthafew $
+package org.hibernate.test.interceptor;
+
+import java.io.Serializable;
+
+import org.hibernate.EmptyInterceptor;
+import org.hibernate.type.Type;
+
+public class CollectionInterceptor extends EmptyInterceptor {
+
+	public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) {
+		( (User) entity ).getActions().add("updated");
+		return false;
+	}
+
+	public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
+		( (User) entity ).getActions().add("created");
+		return false;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/CollectionInterceptor.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/Image.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/Image.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/Image.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<hibernate-mapping package="org.hibernate.test.interceptor">
+
+    <class name="Image" table="image" abstract="false" select-before-update="true" >
+        <id name="id" type="java.lang.Long" column="id">
+            <generator class="native"/>
+        </id>
+        <component name="details" class="Image$Details">
+            <property name="perm1" not-null="true" type="long" column="permissions"/>
+            <property name="comment" type="string" column="comment_txt"/>
+        </component>
+        <property name="name" type="java.lang.String" column="name" not-null="true"/>
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/Image.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/Image.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/Image.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/Image.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,63 @@
+package org.hibernate.test.interceptor;
+
+public class Image {
+
+	private Long id;
+	private String name;
+	private Details details;
+
+	public Details getDetails() {
+		return details;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setDetails(Details details) {
+		this.details = details;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String toString() {
+		return "Image/" + ( details == null ? "no details" : details.toString() );
+	}
+
+	public static class Details {
+		private long perm1 = -1; // all bits turned on.
+		private String comment;
+
+		protected long getPerm1() {
+			return this.perm1;
+		}
+
+		protected void setPerm1(long value) {
+			this.perm1 = value;
+		}
+
+		public String getComment() {
+			return comment;
+		}
+
+		public void setComment(String comment) {
+			this.comment = comment;
+		}
+
+		public String toString() {
+			return "Details=" + perm1;
+		}
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/Image.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/InstantiateInterceptor.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/InstantiateInterceptor.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/InstantiateInterceptor.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,54 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+
+/**
+ * @author Gail Badner
+ */
+package org.hibernate.test.interceptor;
+
+import java.io.Serializable;
+
+import org.hibernate.CallbackException;
+import org.hibernate.EmptyInterceptor;
+import org.hibernate.EntityMode;
+
+public class InstantiateInterceptor extends EmptyInterceptor {
+	private String injectedString;
+
+	public InstantiateInterceptor(String injectedString) {
+		this.injectedString = injectedString;		
+	}
+
+	public Object instantiate(String entityName, EntityMode entityMode, Serializable id) throws CallbackException {
+		if ( ! "org.hibernate.test.interceptor.User".equals( entityName ) ) {
+			return null;
+		}
+		// Simply inject a sample string into new instances
+		User instance = new User();
+		instance.setName( ( String ) id );
+		instance.setInjectedString( injectedString );
+		return instance;
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/InstantiateInterceptor.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/InterceptorTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/InterceptorTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/InterceptorTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,211 @@
+//$Id: InterceptorTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.interceptor;
+
+import java.io.Serializable;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.EmptyInterceptor;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.type.Type;
+
+/**
+ * @author Gavin King
+ */
+public class InterceptorTest extends FunctionalTestCase {
+
+	public InterceptorTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "interceptor/User.hbm.xml", "interceptor/Image.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( InterceptorTest.class );
+	}
+
+	public void testCollectionIntercept() {
+		Session s = openSession( new CollectionInterceptor() );
+		Transaction t = s.beginTransaction();
+		User u = new User("Gavin", "nivag");
+		s.persist(u);
+		u.setPassword("vagni");
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		u = (User) s.get(User.class, "Gavin");
+		assertEquals( 2, u.getActions().size() );
+		s.delete(u);
+		t.commit();
+		s.close();
+	}
+
+	public void testPropertyIntercept() {
+		Session s = openSession( new PropertyInterceptor() );
+		Transaction t = s.beginTransaction();
+		User u = new User("Gavin", "nivag");
+		s.persist(u);
+		u.setPassword("vagni");
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		u = (User) s.get(User.class, "Gavin");
+		assertNotNull( u.getCreated() );
+		assertNotNull( u.getLastUpdated() );
+		s.delete(u);
+		t.commit();
+		s.close();
+	}
+
+	/**
+	 * Test case from HHH-1921.  Here the interceptor resets the
+	 * current-state to the same thing as the current db state; this
+	 * causes EntityPersister.findDirty() to return no dirty properties.
+	 */
+	public void testPropertyIntercept2() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		User u = new User("Josh", "test");
+		s.persist( u );
+		t.commit();
+		s.close();
+
+		s = openSession(
+				new EmptyInterceptor() {
+					public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) {
+						currentState[0] = "test";
+						return true;
+					}
+				}
+		);
+		t = s.beginTransaction();
+		u = ( User ) s.get( User.class, u.getName() );
+		u.setPassword( "nottest" );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		u = (User) s.get(User.class, "Josh");
+		assertEquals("test", u.getPassword());
+		s.delete(u);
+		t.commit();
+		s.close();
+
+	}
+
+	public void testComponentInterceptor() {
+		final int checkPerm = 500;
+		final String checkComment = "generated from interceptor";
+
+		Session s = openSession(
+				new EmptyInterceptor() {
+					public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
+						if ( state[0] == null ) {
+							Image.Details detail = new Image.Details();
+							detail.setPerm1( checkPerm );
+							detail.setComment( checkComment );
+							state[0] = detail;
+						}
+						return true;
+					}
+				}
+		);
+		s.beginTransaction();
+		Image i = new Image();
+		i.setName( "compincomp" );
+		i = ( Image ) s.merge( i );
+		assertNotNull( i.getDetails() );
+		assertEquals( checkPerm, i.getDetails().getPerm1() );
+		assertEquals( checkComment, i.getDetails().getComment() );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		i = ( Image ) s.get( Image.class, i.getId() );
+		assertNotNull( i.getDetails() );
+		assertEquals( checkPerm, i.getDetails().getPerm1() );
+		assertEquals( checkComment, i.getDetails().getComment() );
+		s.delete( i );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testStatefulIntercept() {
+		final StatefulInterceptor statefulInterceptor = new StatefulInterceptor();
+		Session s = openSession( statefulInterceptor );
+		statefulInterceptor.setSession(s);
+
+		Transaction t = s.beginTransaction();
+		User u = new User("Gavin", "nivag");
+		s.persist(u);
+		u.setPassword("vagni");
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		List logs = s.createCriteria(Log.class).list();
+		assertEquals( 2, logs.size() );
+		s.delete(u);
+		s.createQuery( "delete from Log" ).executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	public void testInitiateIntercept() {
+		final String injectedString = "******";
+		final InstantiateInterceptor initiateInterceptor = new InstantiateInterceptor( injectedString );
+		Session s = openSession( initiateInterceptor );
+
+		Transaction t = s.beginTransaction();
+		User u = new User( "Gavin", "nivag" );
+		s.persist( u );
+		t.commit();
+		s.close();
+
+		assertNull( u.getInjectedString() );
+		u.setPassword( "blah" );
+
+		s = openSession( initiateInterceptor );
+		t = s.beginTransaction();
+
+		User merged = ( User ) s.merge( u );
+		assertEquals( injectedString, merged.getInjectedString() );
+		assertEquals( u.getName(), merged.getName() );
+		assertEquals( u.getPassword(), merged.getPassword() );
+
+		merged.setInjectedString( null );
+
+		User loaded = ( User ) s.load(User.class, merged.getName());
+		// the session-bound instance was not instantiated by the interceptor, load simply returns it
+		assertSame( merged, loaded );
+		assertNull( merged.getInjectedString() );
+
+		// flush the session and evict the merged instance from session to force an actual load
+		s.flush();
+		s.evict( merged );
+
+		User reloaded = ( User ) s.load( User.class, merged.getName() );
+		// Interceptor IS called for instantiating the persistent instance associated to the session when using load
+		assertEquals( injectedString, reloaded.getInjectedString() );
+		assertEquals( u.getName(), reloaded.getName() );
+		assertEquals( u.getPassword(), reloaded.getPassword() );
+
+		s.delete( reloaded );
+		t.commit();
+		s.close();
+	}
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/InterceptorTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/Log.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/Log.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/Log.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,53 @@
+//$Id: Log.java 7700 2005-07-30 05:02:47Z oneovthafew $
+package org.hibernate.test.interceptor;
+
+import java.util.Calendar;
+
+public class Log {
+	private Long id;
+	private String entityName;
+	private String entityId;
+	private String action;
+	private Calendar time;
+	
+	public Log(String action, String id, String name) {
+		super();
+		this.action = action;
+		entityId = id;
+		entityName = name;
+		time = Calendar.getInstance();
+	}
+	public Log() {
+		super();
+	}
+	public String getAction() {
+		return action;
+	}
+	public void setAction(String action) {
+		this.action = action;
+	}
+	public String getEntityId() {
+		return entityId;
+	}
+	public void setEntityId(String entityId) {
+		this.entityId = entityId;
+	}
+	public String getEntityName() {
+		return entityName;
+	}
+	public void setEntityName(String entityName) {
+		this.entityName = entityName;
+	}
+	public Long getId() {
+		return id;
+	}
+	public void setId(Long id) {
+		this.id = id;
+	}
+	public Calendar getTime() {
+		return time;
+	}
+	public void setTime(Calendar time) {
+		this.time = time;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/Log.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/PropertyInterceptor.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/PropertyInterceptor.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/PropertyInterceptor.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,22 @@
+//$Id: PropertyInterceptor.java 7700 2005-07-30 05:02:47Z oneovthafew $
+package org.hibernate.test.interceptor;
+
+import java.io.Serializable;
+import java.util.Calendar;
+
+import org.hibernate.EmptyInterceptor;
+import org.hibernate.type.Type;
+
+public class PropertyInterceptor extends EmptyInterceptor {
+
+	public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) {
+		currentState[1] = Calendar.getInstance();
+		return true;
+	}
+
+	public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
+		state[2] = Calendar.getInstance();
+		return true;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/PropertyInterceptor.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/StatefulInterceptor.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/StatefulInterceptor.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/StatefulInterceptor.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,47 @@
+//$Id: StatefulInterceptor.java 7701 2005-07-30 05:07:01Z oneovthafew $
+package org.hibernate.test.interceptor;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.hibernate.EmptyInterceptor;
+import org.hibernate.Session;
+import org.hibernate.type.Type;
+
+public class StatefulInterceptor extends EmptyInterceptor {
+	
+	private Session session;
+
+	private List list = new ArrayList();
+	
+	public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
+		if ( !(entity instanceof Log) ) {
+			list.add( new Log( "insert", (String) id, entity.getClass().getName() ) );
+		}
+		return false;
+	}
+
+	public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) {
+		if ( !(entity instanceof Log) ) {
+			list.add( new Log( "update", (String) id, entity.getClass().getName() ) );
+		}
+		return false;
+	}
+
+	public void postFlush(Iterator entities) {
+		if ( list.size()>0 ) {
+			for ( Iterator iter = list.iterator(); iter.hasNext(); ) {
+				session.persist( iter.next() );	
+			}
+			list.clear();
+			session.flush();
+		}
+	}
+	
+	public void setSession(Session s) {
+		session = s;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/StatefulInterceptor.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/User.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/User.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/User.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+     
+-->
+
+<hibernate-mapping 
+	package="org.hibernate.test.interceptor">
+	
+	<class name="User" table="users">
+		<id name="name"/>
+		<property name="password" column="`password`"/>
+		<property name="lastUpdated"/>
+		<property name="created"/>
+		<set name="actions" lazy="false" fetch="join">
+			<key column="user_name"/>
+			<element column="action" type="string"/>
+		</set>
+	</class>
+	
+	<class name="Log" table="log_entries">
+		<id name="id">
+			<generator class="increment"/>
+		</id>
+		<property name="entityName" column="entity_name"/>
+		<property name="entityId" column="entity_id"/>
+		<property name="action"/>
+		<property name="time" column="action_time"/>
+	</class>
+	
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/User.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/User.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/User.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/User.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,60 @@
+//$Id: User.java 7700 2005-07-30 05:02:47Z oneovthafew $
+package org.hibernate.test.interceptor;
+
+import java.util.Calendar;
+import java.util.HashSet;
+import java.util.Set;
+
+public class User {
+	private String name;
+	private String password;
+	private Set actions = new HashSet();
+	private Calendar lastUpdated;
+	private Calendar created;
+	private String injectedString;
+	
+	public User(String name, String password) {
+		super();
+		this.name = name;
+		this.password = password;
+	}
+	public User() {
+		super();
+	}
+	public Calendar getLastUpdated() {
+		return lastUpdated;
+	}
+	public void setLastUpdated(Calendar lastUpdated) {
+		this.lastUpdated = lastUpdated;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public String getPassword() {
+		return password;
+	}
+	public void setPassword(String password) {
+		this.password = password;
+	}
+	public Set getActions() {
+		return actions;
+	}
+	public void setActions(Set actions) {
+		this.actions = actions;
+	}
+	public Calendar getCreated() {
+		return created;
+	}
+	public void setCreated(Calendar created) {
+		this.created = created;
+	}
+	public String getInjectedString() {
+		return injectedString;
+	}
+	public void setInjectedString(String injectedString) {
+		this.injectedString = injectedString;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interceptor/User.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/Document.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/Document.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/Document.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,24 @@
+//$Id: Document.java 4407 2004-08-22 01:20:08Z oneovthafew $
+package org.hibernate.test.interfaceproxy;
+
+import java.sql.Blob;
+import java.util.Calendar;
+
+/**
+ * @author Gavin King
+ */
+public interface Document extends Item {
+	/**
+	 * @return Returns the content.
+	 */
+	public Blob getContent();
+
+	/**
+	 * @param content The content to set.
+	 */
+	public void setContent(Blob content);
+	
+	public Calendar getCreated();
+	
+	public Calendar getModified();
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/Document.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/DocumentImpl.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/DocumentImpl.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/DocumentImpl.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,50 @@
+//$Id: DocumentImpl.java 4407 2004-08-22 01:20:08Z oneovthafew $
+package org.hibernate.test.interfaceproxy;
+
+import java.sql.Blob;
+import java.util.Calendar;
+
+/**
+ * @author Gavin King
+ */
+public class DocumentImpl extends ItemImpl implements Document {
+	private Blob content;
+	private Calendar modified;
+	private Calendar created;
+	/**
+	 * @return Returns the created.
+	 */
+	public Calendar getCreated() {
+		return created;
+	}
+	/**
+	 * @param created The created to set.
+	 */
+	public void setCreated(Calendar created) {
+		this.created = created;
+	}
+	/**
+	 * @return Returns the modified.
+	 */
+	public Calendar getModified() {
+		return modified;
+	}
+	/**
+	 * @param modified The modified to set.
+	 */
+	public void setModified(Calendar modified) {
+		this.modified = modified;
+	}
+	/**
+	 * @return Returns the content.
+	 */
+	public Blob getContent() {
+		return content;
+	}
+	/**
+	 * @param content The content to set.
+	 */
+	public void setContent(Blob content) {
+		this.content = content;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/DocumentImpl.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/DocumentInterceptor.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/DocumentInterceptor.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/DocumentInterceptor.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,95 @@
+//$Id: DocumentInterceptor.java 7860 2005-08-11 21:58:23Z oneovthafew $
+package org.hibernate.test.interfaceproxy;
+
+import java.io.Serializable;
+import java.util.Calendar;
+import java.util.Iterator;
+
+import org.hibernate.CallbackException;
+import org.hibernate.Interceptor;
+import org.hibernate.Transaction;
+import org.hibernate.EntityMode;
+import org.hibernate.type.Type;
+
+/**
+ * @author Gavin King
+ */
+public class DocumentInterceptor implements Interceptor {
+
+
+	public boolean onLoad(Object entity, Serializable id, Object[] state,
+			String[] propertyNames, Type[] types) throws CallbackException {
+		return false;
+	}
+
+	public boolean onFlushDirty(Object entity, Serializable id,
+			Object[] currentState, Object[] previousState,
+			String[] propertyNames, Type[] types) throws CallbackException {
+		if ( entity instanceof Document ) {
+			currentState[2] = Calendar.getInstance();
+			return true;
+		}
+		else {
+			return false;
+		}
+	}
+
+	public boolean onSave(Object entity, Serializable id, Object[] state,
+			String[] propertyNames, Type[] types) throws CallbackException {
+		if ( entity instanceof Document ) {
+			state[3] = state[2] = Calendar.getInstance();
+			return true;
+		}
+		else {
+			return false;
+		}
+	}
+
+	public void onDelete(Object entity, Serializable id, Object[] state,
+			String[] propertyNames, Type[] types) throws CallbackException {
+
+	}
+
+	public void preFlush(Iterator entities) throws CallbackException {
+
+	}
+
+	public void postFlush(Iterator entities) throws CallbackException {
+
+	}
+
+	public Boolean isTransient(Object entity) {
+		return null;
+	}
+
+	public int[] findDirty(Object entity, Serializable id,
+			Object[] currentState, Object[] previousState,
+			String[] propertyNames, Type[] types) {
+		return null;
+	}
+
+	public Object instantiate(String entityName, EntityMode entityMode, Serializable id) throws CallbackException {
+		return null;
+	}
+
+	public String getEntityName(Object object) throws CallbackException {
+		return null;
+	}
+
+	public Object getEntity(String entityName, Serializable id)
+			throws CallbackException {
+		return null;
+	}
+
+	public void afterTransactionBegin(Transaction tx) {}
+	public void afterTransactionCompletion(Transaction tx) {}
+	public void beforeTransactionCompletion(Transaction tx) {}
+
+	public String onPrepareStatement(String sql) {
+		return sql;
+	}
+
+	public void onCollectionRecreate(Object collection, Serializable key) throws CallbackException {}
+	public void onCollectionRemove(Object collection, Serializable key) throws CallbackException {}
+	public void onCollectionUpdate(Object collection, Serializable key) throws CallbackException {}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/DocumentInterceptor.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/Folder.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/Folder.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/Folder.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,17 @@
+//$Id: Folder.java 4407 2004-08-22 01:20:08Z oneovthafew $
+package org.hibernate.test.interfaceproxy;
+
+/**
+ * @author Gavin King
+ */
+public interface Folder extends Item {
+	/**
+	 * @return Returns the parent.
+	 */
+	public Folder getParent();
+
+	/**
+	 * @param parent The parent to set.
+	 */
+	public void setParent(Folder parent);
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/Folder.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/FolderImpl.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/FolderImpl.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/FolderImpl.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,21 @@
+//$Id: FolderImpl.java 4407 2004-08-22 01:20:08Z oneovthafew $
+package org.hibernate.test.interfaceproxy;
+
+/**
+ * @author Gavin King
+ */
+public class FolderImpl extends ItemImpl implements Folder {
+	private Folder parent;
+	/**
+	 * @return Returns the parent.
+	 */
+	public Folder getParent() {
+		return parent;
+	}
+	/**
+	 * @param parent The parent to set.
+	 */
+	public void setParent(Folder parent) {
+		this.parent = parent;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/FolderImpl.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/InterfaceProxyTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/InterfaceProxyTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/InterfaceProxyTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,101 @@
+//$Id: InterfaceProxyTest.java 15736 2008-12-27 00:49:42Z gbadner $
+package org.hibernate.test.interfaceproxy;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class InterfaceProxyTest extends FunctionalTestCase {
+	
+	public InterfaceProxyTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "interfaceproxy/Item.hbm.xml" };
+	}
+
+	public String getCacheConcurrencyStrategy() {
+		return null;
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( InterfaceProxyTest.class );
+	}
+	
+	public void testInterfaceProxies() {
+		
+		if ( ! getDialect().supportsExpectedLobUsagePattern() ) {
+			reportSkip( "database/driver does not support expected LOB usage pattern", "LOB support" );
+			return;
+		}
+		
+		Session s = openSession( new DocumentInterceptor() );
+		Transaction t = s.beginTransaction();
+		Document d = new DocumentImpl();
+		d.setName("Hibernate in Action");
+		d.setContent( s.getLobHelper().createBlob( "blah blah blah".getBytes() ) );
+		Long did = (Long) s.save(d);
+		SecureDocument d2 = new SecureDocumentImpl();
+		d2.setName("Secret");
+		d2.setContent( s.getLobHelper().createBlob( "wxyz wxyz".getBytes() ) );
+		// SybaseASE15Dialect only allows 7-bits in a byte to be inserted into a tinyint 
+		// column (0 <= val < 128)		
+		d2.setPermissionBits( (byte) 127 );
+		d2.setOwner("gavin");
+		Long d2id = (Long) s.save(d2);
+		t.commit();
+		s.close();
+
+		s = openSession( new DocumentInterceptor() );
+		t = s.beginTransaction();
+		d = (Document) s.load(ItemImpl.class, did);
+		assertEquals( did, d.getId() );
+		assertEquals( "Hibernate in Action", d.getName() );
+		assertNotNull( d.getContent() );
+		
+		d2 = (SecureDocument) s.load(ItemImpl.class, d2id);
+		assertEquals( d2id, d2.getId() );
+		assertEquals( "Secret", d2.getName() );
+		assertNotNull( d2.getContent() );
+		
+		s.clear();
+		
+		d = (Document) s.load(DocumentImpl.class, did);
+		assertEquals( did, d.getId() );
+		assertEquals( "Hibernate in Action", d.getName() );
+		assertNotNull( d.getContent() );
+		
+		d2 = (SecureDocument) s.load(SecureDocumentImpl.class, d2id);
+		assertEquals( d2id, d2.getId() );
+		assertEquals( "Secret", d2.getName() );
+		assertNotNull( d2.getContent() );
+		assertEquals( "gavin", d2.getOwner() );
+		
+		//s.clear();
+		
+		d2 = (SecureDocument) s.load(SecureDocumentImpl.class, did);
+		assertEquals( did, d2.getId() );
+		assertEquals( "Hibernate in Action", d2.getName() );
+		assertNotNull( d2.getContent() );
+		
+		try {
+			d2.getOwner(); //CCE
+			assertFalse(true);
+		}
+		catch (ClassCastException cce) {
+			//correct
+		}
+
+		s.createQuery( "delete ItemImpl" ).executeUpdate();
+		t.commit();
+		s.close();
+	}
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/InterfaceProxyTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/Item.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/Item.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/Item.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,70 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+  This mapping demonstrates the use of interface proxies,
+  and fields which are initialized by an interceptor.
+  
+-->
+
+<hibernate-mapping 
+	package="org.hibernate.test.interfaceproxy">
+	
+	<class name="ItemImpl" 
+		table="Items"
+		proxy="Item">
+	
+		<id name="id">
+			<generator class="native"/>
+		</id>
+		
+		<property name="name"
+			not-null="true"/>
+		
+		<joined-subclass name="DocumentImpl" 
+			table="Documents"
+			proxy="Document">
+			
+			<key column="id"/>
+			
+			<property name="content"
+				not-null="true"/>
+			
+			<!-- managed by DocumentInterceptor -->
+			<property name="modified"
+				not-null="true"/>
+			<property name="created"
+				not-null="true"/>
+			
+			<joined-subclass name="SecureDocumentImpl"
+				table="SecureDocuments"
+				proxy="SecureDocument">
+				
+				<key column="documentId"/>
+				
+				<property name="permissionBits" 
+					not-null="true"/>
+				<property name="owner"
+					not-null="true"/>
+				
+			</joined-subclass>
+			
+		</joined-subclass>
+		
+		<joined-subclass name="FolderImpl"
+			table="Folders"
+			proxy="Folder">
+			
+			<key column="id"/>
+			
+			<many-to-one name="parent"
+				class="FolderImpl"/>
+				
+		</joined-subclass>
+		
+	</class>
+	
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/Item.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/Item.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/Item.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/Item.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,22 @@
+//$Id: Item.java 4407 2004-08-22 01:20:08Z oneovthafew $
+package org.hibernate.test.interfaceproxy;
+
+/**
+ * @author Gavin King
+ */
+public interface Item {
+	/**
+	 * @return Returns the id.
+	 */
+	public Long getId();
+
+	/**
+	 * @return Returns the name.
+	 */
+	public String getName();
+
+	/**
+	 * @param name The name to set.
+	 */
+	public void setName(String name);
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/Item.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/ItemImpl.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/ItemImpl.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/ItemImpl.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,34 @@
+//$Id: ItemImpl.java 4407 2004-08-22 01:20:08Z oneovthafew $
+package org.hibernate.test.interfaceproxy;
+
+/**
+ * @author Gavin King
+ */
+public abstract class ItemImpl implements Item {
+	private Long id;
+	private String name;
+	/**
+	 * @return Returns the id.
+	 */
+	public Long getId() {
+		return id;
+	}
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(Long id) {
+		this.id = id;
+	}
+	/**
+	 * @return Returns the name.
+	 */
+	public String getName() {
+		return name;
+	}
+	/**
+	 * @param name The name to set.
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/ItemImpl.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/SecureDocument.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/SecureDocument.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/SecureDocument.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,27 @@
+//$Id: SecureDocument.java 4407 2004-08-22 01:20:08Z oneovthafew $
+package org.hibernate.test.interfaceproxy;
+
+/**
+ * @author Gavin King
+ */
+public interface SecureDocument extends Document {
+	/**
+	 * @return Returns the owner.
+	 */
+	public String getOwner();
+
+	/**
+	 * @param owner The owner to set.
+	 */
+	public void setOwner(String owner);
+
+	/**
+	 * @return Returns the permissionBits.
+	 */
+	public byte getPermissionBits();
+
+	/**
+	 * @param permissionBits The permissionBits to set.
+	 */
+	public void setPermissionBits(byte permissionBits);
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/SecureDocument.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/SecureDocumentImpl.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/SecureDocumentImpl.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/SecureDocumentImpl.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,34 @@
+//$Id: SecureDocumentImpl.java 4407 2004-08-22 01:20:08Z oneovthafew $
+package org.hibernate.test.interfaceproxy;
+
+/**
+ * @author Gavin King
+ */
+public class SecureDocumentImpl extends DocumentImpl implements SecureDocument {
+	private byte permissionBits;
+	private String owner;
+	/**
+	 * @return Returns the owner.
+	 */
+	public String getOwner() {
+		return owner;
+	}
+	/**
+	 * @param owner The owner to set.
+	 */
+	public void setOwner(String owner) {
+		this.owner = owner;
+	}
+	/**
+	 * @return Returns the permissionBits.
+	 */
+	public byte getPermissionBits() {
+		return permissionBits;
+	}
+	/**
+	 * @param permissionBits The permissionBits to set.
+	 */
+	public void setPermissionBits(byte permissionBits) {
+		this.permissionBits = permissionBits;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/interfaceproxy/SecureDocumentImpl.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/iterate/Item.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/iterate/Item.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/iterate/Item.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping 
+	package="org.hibernate.test.iterate">
+
+	<class name="Item" table="NamedItem" entity-name="Item">
+		<id name="name"/>
+		<query name="nameDesc">from Item order by name desc</query>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/iterate/Item.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/iterate/Item.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/iterate/Item.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/iterate/Item.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,20 @@
+//$Id: Item.java 6593 2005-04-28 15:52:26Z oneovthafew $
+package org.hibernate.test.iterate;
+
+/**
+ * @author Gavin King
+ */
+public class Item {
+	private String name;
+	Item() {}
+	public Item(String n) {
+		name = n;
+	}
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/iterate/Item.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/iterate/IterateTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/iterate/IterateTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/iterate/IterateTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,105 @@
+//$Id: IterateTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.iterate;
+
+import java.util.Iterator;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.ScrollableResults;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class IterateTest extends FunctionalTestCase {
+	
+	public IterateTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "iterate/Item.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		super.configure( cfg );
+		cfg.setProperty( Environment.USE_QUERY_CACHE, "true" );
+		cfg.setProperty( Environment.CACHE_REGION_PREFIX, "foo" );
+		cfg.setProperty( Environment.USE_SECOND_LEVEL_CACHE, "true" );
+		cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( IterateTest.class );
+	}
+	
+	public void testIterate() throws Exception {
+		getSessions().getStatistics().clear();
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Item i1 = new Item("foo");
+		Item i2 = new Item("bar");
+		s.persist("Item", i1);
+		s.persist("Item", i2);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Iterator iter = s.getNamedQuery("Item.nameDesc").iterate();
+		i1 = (Item) iter.next();
+		i2 = (Item) iter.next();
+		assertFalse( Hibernate.isInitialized(i1) );
+		assertFalse( Hibernate.isInitialized(i2) );
+		i1.getName();
+		i2.getName();
+		assertFalse( Hibernate.isInitialized(i1) );
+		assertFalse( Hibernate.isInitialized(i2) );
+		assertEquals( i1.getName(), "foo" );
+		assertEquals( i2.getName(), "bar" );
+		Hibernate.initialize(i1);
+		assertFalse( iter.hasNext() );
+		s.delete(i1);
+		s.delete(i2);
+		t.commit();
+		s.close();
+		assertEquals( getSessions().getStatistics().getEntityFetchCount(), 2 );
+	}
+	
+	public void testScroll() throws Exception {
+		getSessions().getStatistics().clear();
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Item i1 = new Item("foo");
+		Item i2 = new Item("bar");
+		s.persist("Item", i1);
+		s.persist("Item", i2);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		ScrollableResults sr = s.getNamedQuery("Item.nameDesc").scroll();
+		assertTrue( sr.next() );
+		i1 = (Item) sr.get(0);
+		assertTrue( sr.next() );
+		i2 = (Item) sr.get(0);
+		assertTrue( Hibernate.isInitialized(i1) );
+		assertTrue( Hibernate.isInitialized(i2) );
+		assertEquals( i1.getName(), "foo" );
+		assertEquals( i2.getName(), "bar" );
+		assertFalse( sr.next() );
+		s.delete(i1);
+		s.delete(i2);
+		t.commit();
+		s.close();
+		assertEquals( getSessions().getStatistics().getEntityFetchCount(), 0 );
+	}
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/iterate/IterateTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jdbc/Boat.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jdbc/Boat.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jdbc/Boat.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2007, Red Hat Middleware, LLC. All rights reserved.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, v. 2.1. This program is distributed in the
+ * hope that it will be useful, but WITHOUT A WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details. You should have received a
+ * copy of the GNU Lesser General Public License, v.2.1 along with this
+ * distribution; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Red Hat Author(s): Steve Ebersole
+ */
+package org.hibernate.test.jdbc;
+
+/**
+ * Boat implementation
+ *
+ * @author Steve Ebersole
+ */
+public class Boat {
+	private Long id;
+	private String tag;
+	private Person driver;
+	private Person boarder;
+
+	public Boat() {
+	}
+
+	public Boat(String tag, Person driver, Person boarder) {
+		this.tag = tag;
+		this.driver = driver;
+		this.boarder = boarder;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getTag() {
+		return tag;
+	}
+
+	public void setTag(String tag) {
+		this.tag = tag;
+	}
+
+	public Person getDriver() {
+		return driver;
+	}
+
+	public void setDriver(Person driver) {
+		this.driver = driver;
+	}
+
+	public Person getBoarder() {
+		return boarder;
+	}
+
+	public void setBoarder(Person boarder) {
+		this.boarder = boarder;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jdbc/Boat.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jdbc/GeneralWorkTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jdbc/GeneralWorkTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jdbc/GeneralWorkTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,137 @@
+/*
+ * Copyright (c) 2007, Red Hat Middleware, LLC. All rights reserved.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, v. 2.1. This program is distributed in the
+ * hope that it will be useful, but WITHOUT A WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details. You should have received a
+ * copy of the GNU Lesser General Public License, v.2.1 along with this
+ * distribution; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Red Hat Author(s): Steve Ebersole
+ */
+package org.hibernate.test.jdbc;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+import junit.framework.Test;
+
+import org.hibernate.JDBCException;
+import org.hibernate.Session;
+import org.hibernate.jdbc.Work;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * GeneralWorkTest implementation
+ *
+ * @author Steve Ebersole
+ */
+public class GeneralWorkTest extends FunctionalTestCase {
+	public GeneralWorkTest(String string) {
+		super( string );
+	}
+
+	public String getBaseForMappings() {
+		return "org/hibernate/";
+	}
+
+	public String[] getMappings() {
+		return new String[] { "jdbc/Mappings.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( GeneralWorkTest.class );
+	}
+
+	public void testGeneralUsage() throws Throwable {
+		Session session = openSession();
+		session.beginTransaction();
+		session.doWork(
+				new Work() {
+					public void execute(Connection connection) throws SQLException {
+						// in this current form, users must handle try/catches themselves for proper resource release
+						Statement statement = null;
+						try {
+							statement = connection.createStatement();
+							ResultSet resultSet = null;
+							try {
+								resultSet = statement.executeQuery( "select * from T_JDBC_PERSON" );
+							}
+							finally {
+								releaseQuietly( resultSet );
+							}
+							try {
+								resultSet = statement.executeQuery( "select * from T_JDBC_BOAT" );
+							}
+							finally {
+								releaseQuietly( resultSet );
+							}
+						}
+						finally {
+							releaseQuietly( statement );
+						}
+					}
+				}
+		);
+		session.getTransaction().commit();
+		session.close();
+	}
+
+	public void testSQLExceptionThrowing() {
+		Session session = openSession();
+		session.beginTransaction();
+		try {
+			session.doWork(
+					new Work() {
+						public void execute(Connection connection) throws SQLException {
+							Statement statement = null;
+							try {
+								statement = connection.createStatement();
+								statement.executeQuery( "select * from non_existent" );
+							}
+							finally {
+								releaseQuietly( statement );
+							}
+						}
+					}
+			);
+			fail( "expecting exception" );
+		}
+		catch ( JDBCException expected ) {
+			// expected outcome
+		}
+		session.getTransaction().commit();
+		session.close();
+	}
+
+	private void releaseQuietly(Statement statement) {
+		if ( statement == null ) {
+			return;
+		}
+		try {
+			statement.close();
+		}
+		catch ( SQLException e ) {
+			// ignore
+		}
+	}
+
+	private void releaseQuietly(ResultSet resultSet) {
+		if ( resultSet == null ) {
+			return;
+		}
+		try {
+			resultSet.close();
+		}
+		catch ( SQLException e ) {
+			// ignore
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jdbc/GeneralWorkTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jdbc/Mappings.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jdbc/Mappings.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jdbc/Mappings.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,41 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+  ~ Copyright (c) 2007, Red Hat Middleware, LLC. All rights reserved.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, v. 2.1. This program is distributed in the
+  ~ hope that it will be useful, but WITHOUT A WARRANTY; without even the implied
+  ~ warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  ~ Lesser General Public License for more details. You should have received a
+  ~ copy of the GNU Lesser General Public License, v.2.1 along with this
+  ~ distribution; if not, write to the Free Software Foundation, Inc.,
+  ~ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+  ~
+  ~ Red Hat Author(s): Steve Ebersole
+  -->
+
+<hibernate-mapping package="org.hibernate.jdbc">
+
+    <class name="Person" table="T_JDBC_PERSON">
+        <id name="id" column="ID">
+            <generator class="increment" />
+        </id>
+        <property name="firstName" />
+        <property name="lastName" />
+    </class>
+
+    <class name="Boat" table="T_JDBC_BOAT">
+        <id name="id" column="ID">
+            <generator class="increment" />
+        </id>
+        <property name="tag" />
+        <many-to-one name="driver"/>
+        <many-to-one name="boarder"/>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jdbc/Mappings.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jdbc/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jdbc/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jdbc/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2007, Red Hat Middleware, LLC. All rights reserved.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, v. 2.1. This program is distributed in the
+ * hope that it will be useful, but WITHOUT A WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details. You should have received a
+ * copy of the GNU Lesser General Public License, v.2.1 along with this
+ * distribution; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Red Hat Author(s): Steve Ebersole
+ */
+package org.hibernate.test.jdbc;
+
+/**
+ * Person implementation
+ *
+ * @author Steve Ebersole
+ */
+public class Person {
+	private Long id;
+	private String firstName;
+	private String lastName;
+
+	public Person() {
+	}
+
+	public Person(String firstName, String lastName) {
+		this.firstName = firstName;
+		this.lastName = lastName;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getFirstName() {
+		return firstName;
+	}
+
+	public void setFirstName(String firstName) {
+		this.firstName = firstName;
+	}
+
+	public String getLastName() {
+		return lastName;
+	}
+
+	public void setLastName(String lastName) {
+		this.lastName = lastName;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jdbc/Person.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/Customer.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/Customer.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/Customer.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,35 @@
+//$Id: Customer.java 4364 2004-08-17 12:10:32Z oneovthafew $
+package org.hibernate.test.join;
+
+/**
+ * @author Gavin King
+ */
+public class Customer extends Person {
+	private Employee salesperson;
+	private String comments;
+
+	/**
+	 * @return Returns the salesperson.
+	 */
+	public Employee getSalesperson() {
+		return salesperson;
+	}
+	/**
+	 * @param salesperson The salesperson to set.
+	 */
+	public void setSalesperson(Employee salesperson) {
+		this.salesperson = salesperson;
+	}
+	/**
+	 * @return Returns the comments.
+	 */
+	public String getComments() {
+		return comments;
+	}
+	/**
+	 * @param comments The comments to set.
+	 */
+	public void setComments(String comments) {
+		this.comments = comments;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/Customer.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/Employee.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/Employee.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/Employee.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,49 @@
+//$Id: Employee.java 4364 2004-08-17 12:10:32Z oneovthafew $
+package org.hibernate.test.join;
+
+import java.math.BigDecimal;
+
+/**
+ * @author Gavin King
+ */
+public class Employee extends Person {
+	private String title;
+	private BigDecimal salary;
+	private Employee manager;
+	/**
+	 * @return Returns the title.
+	 */
+	public String getTitle() {
+		return title;
+	}
+	/**
+	 * @param title The title to set.
+	 */
+	public void setTitle(String title) {
+		this.title = title;
+	}
+	/**
+	 * @return Returns the manager.
+	 */
+	public Employee getManager() {
+		return manager;
+	}
+	/**
+	 * @param manager The manager to set.
+	 */
+	public void setManager(Employee manager) {
+		this.manager = manager;
+	}
+	/**
+	 * @return Returns the salary.
+	 */
+	public BigDecimal getSalary() {
+		return salary;
+	}
+	/**
+	 * @param salary The salary to set.
+	 */
+	public void setSalary(BigDecimal salary) {
+		this.salary = salary;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/Employee.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/JoinTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/JoinTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/JoinTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,212 @@
+//$Id: JoinTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.join;
+
+import java.util.Iterator;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class JoinTest extends FunctionalTestCase {
+	
+	public JoinTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "join/Person.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( JoinTest.class );
+	}
+	
+	public void testSequentialSelects() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		
+		Employee mark = new Employee();
+		mark.setName("Mark");
+		mark.setTitle("internal sales");
+		mark.setSex('M');
+		mark.setAddress("buckhead");
+		mark.setZip("30305");
+		mark.setCountry("USA");
+		
+		Customer joe = new Customer();
+		joe.setName("Joe");
+		joe.setAddress("San Francisco");
+		joe.setZip("XXXXX");
+		joe.setCountry("USA");
+		joe.setComments("Very demanding");
+		joe.setSex('M');
+		joe.setSalesperson(mark);
+		
+		Person yomomma = new Person();
+		yomomma.setName("mum");
+		yomomma.setSex('F');
+		
+		s.save(yomomma);
+		s.save(mark);
+		s.save(joe);		
+		
+		assertEquals( s.createQuery("from java.io.Serializable").list().size(), 0 );
+		
+		assertEquals( s.createQuery("from Person").list().size(), 3 );
+		assertEquals( s.createQuery("from Person p where p.class is null").list().size(), 1 );
+		assertEquals( s.createQuery("from Person p where p.class = Customer").list().size(), 1 );
+		assertTrue(s.createQuery("from Customer c").list().size()==1);
+		s.clear();
+
+		List customers = s.createQuery("from Customer c left join fetch c.salesperson").list();
+		for ( Iterator iter = customers.iterator(); iter.hasNext(); ) {
+			Customer c = (Customer) iter.next();
+			assertTrue( Hibernate.isInitialized( c.getSalesperson() ) );
+			assertEquals( c.getSalesperson().getName(), "Mark" );
+		}
+		assertEquals( customers.size(), 1 );
+		s.clear();
+		
+		customers = s.createQuery("from Customer").list();
+		for ( Iterator iter = customers.iterator(); iter.hasNext(); ) {
+			Customer c = (Customer) iter.next();
+			assertFalse( Hibernate.isInitialized( c.getSalesperson() ) );
+			assertEquals( c.getSalesperson().getName(), "Mark" );
+		}
+		assertEquals( customers.size(), 1 );
+		s.clear();
+		
+
+		mark = (Employee) s.get( Employee.class, new Long( mark.getId() ) );
+		joe = (Customer) s.get( Customer.class, new Long( joe.getId() ) );
+		
+ 		mark.setZip("30306");
+		assertEquals( s.createQuery("from Person p where p.zip = '30306'").list().size(), 1 );
+		s.delete(mark);
+		s.delete(joe);
+		s.delete(yomomma);
+		assertTrue( s.createQuery("from Person").list().isEmpty() );
+		t.commit();
+		s.close();
+	}
+
+	public void testSequentialSelectsOptionalData() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		User jesus = new User();
+		jesus.setName("Jesus Olvera y Martinez");
+		jesus.setSex('M');
+
+		s.save(jesus);
+
+		assertEquals( s.createQuery("from java.io.Serializable").list().size(), 0 );
+		
+		assertEquals( s.createQuery("from Person").list().size(), 1 );
+		assertEquals( s.createQuery("from Person p where p.class is null").list().size(), 0 );
+		assertEquals( s.createQuery("from Person p where p.class = User").list().size(), 1 );
+		assertTrue(s.createQuery("from User u").list().size()==1);
+		s.clear();
+
+		// Remove the optional row from the join table and requery the User obj
+		s.connection().prepareStatement("delete from t_user").execute();
+		s.clear();
+
+		jesus = (User) s.get( Person.class, new Long( jesus.getId() ) );
+		s.clear();
+
+		// Cleanup the test data
+		s.delete(jesus);
+
+		assertTrue( s.createQuery("from Person").list().isEmpty() );
+		t.commit();
+		s.close();
+	}
+	
+	public void testCustomColumnReadAndWrite() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		final double HEIGHT_INCHES = 73;
+		final double HEIGHT_CENTIMETERS = HEIGHT_INCHES * 2.54d;
+		Person p = new Person();
+		p.setName("Emmanuel");
+		p.setSex('M');
+		p.setHeightInches(HEIGHT_INCHES);
+		s.persist(p);
+		final double PASSWORD_EXPIRY_WEEKS = 4;
+		final double PASSWORD_EXPIRY_DAYS = PASSWORD_EXPIRY_WEEKS * 7d;
+		User u = new User();
+		u.setName("Steve");
+		u.setSex('M');
+		u.setPasswordExpiryDays(PASSWORD_EXPIRY_DAYS);
+		s.persist(u);
+		s.flush();
+		
+		// Test value conversion during insert
+		Double heightViaSql = (Double)s.createSQLQuery("select height_centimeters from person where name='Emmanuel'").uniqueResult();
+		assertEquals(HEIGHT_CENTIMETERS, heightViaSql, 0.01d);
+		Double expiryViaSql = (Double)s.createSQLQuery("select pwd_expiry_weeks from t_user where person_id=?")
+			.setLong(0, u.getId())
+			.uniqueResult();
+		assertEquals(PASSWORD_EXPIRY_WEEKS, expiryViaSql, 0.01d);
+		
+		// Test projection
+		Double heightViaHql = (Double)s.createQuery("select p.heightInches from Person p where p.name = 'Emmanuel'").uniqueResult();
+		assertEquals(HEIGHT_INCHES, heightViaHql, 0.01d);
+		Double expiryViaHql = (Double)s.createQuery("select u.passwordExpiryDays from User u where u.name = 'Steve'").uniqueResult();
+		assertEquals(PASSWORD_EXPIRY_DAYS, expiryViaHql, 0.01d);
+		
+		// Test restriction and entity load via criteria
+		p = (Person)s.createCriteria(Person.class)
+			.add(Restrictions.between("heightInches", HEIGHT_INCHES - 0.01d, HEIGHT_INCHES + 0.01d))
+			.uniqueResult();
+		assertEquals(HEIGHT_INCHES, p.getHeightInches(), 0.01d);
+		u = (User)s.createCriteria(User.class)
+			.add(Restrictions.between("passwordExpiryDays", PASSWORD_EXPIRY_DAYS - 0.01d, PASSWORD_EXPIRY_DAYS + 0.01d))
+			.uniqueResult();
+		assertEquals(PASSWORD_EXPIRY_DAYS, u.getPasswordExpiryDays(), 0.01d);
+		
+		// Test predicate and entity load via HQL
+		p = (Person)s.createQuery("from Person p where p.heightInches between ? and ?")
+			.setDouble(0, HEIGHT_INCHES - 0.01d)
+			.setDouble(1, HEIGHT_INCHES + 0.01d)
+			.uniqueResult();
+		assertEquals(HEIGHT_INCHES, p.getHeightInches(), 0.01d);
+		u = (User)s.createQuery("from User u where u.passwordExpiryDays between ? and ?")
+			.setDouble(0, PASSWORD_EXPIRY_DAYS - 0.01d)
+			.setDouble(1, PASSWORD_EXPIRY_DAYS + 0.01d)
+			.uniqueResult();
+		assertEquals(PASSWORD_EXPIRY_DAYS, u.getPasswordExpiryDays(), 0.01d);
+		
+		// Test update
+		p.setHeightInches(1);
+		u.setPasswordExpiryDays(7d);
+		s.flush();
+		heightViaSql = (Double)s.createSQLQuery("select height_centimeters from person where name='Emmanuel'").uniqueResult();
+		assertEquals(2.54d, heightViaSql, 0.01d);
+		expiryViaSql = (Double)s.createSQLQuery("select pwd_expiry_weeks from t_user where person_id=?")
+			.setLong(0, u.getId())
+			.uniqueResult();
+		assertEquals(1d, expiryViaSql, 0.01d);
+		
+		s.delete(p);
+		s.delete(u);
+		assertTrue( s.createQuery("from Person").list().isEmpty() );		
+		
+		t.commit();
+		s.close();
+		
+	}
+	
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/JoinTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/OptionalJoinTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/OptionalJoinTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/OptionalJoinTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,369 @@
+//$Id: $
+package org.hibernate.test.join;
+
+/**
+ * @author Chris Jones and Gail Badner
+ */
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+
+import junit.framework.Test;
+
+import java.util.List;
+
+public class OptionalJoinTest extends FunctionalTestCase {
+
+	public OptionalJoinTest(String name) {
+		super(name);
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( OptionalJoinTest.class );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "join/Thing.hbm.xml" };
+	}
+
+	public void testUpdateNonNullOptionalJoinToDiffNonNull() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		// create a new thing with a non-null name
+		Thing thing = new Thing();
+		thing.setName("one");
+		s.save(thing);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		List things = s.createQuery("from Thing").list();
+		assertEquals(1, things.size());
+		thing = (Thing)things.get(0);
+		assertEquals("one", thing.getName());
+		// give it a new non-null name and save it
+		thing.setName("one_changed");
+		s.update(thing);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		things = s.createQuery("from Thing").list();
+		assertEquals(1, things.size());
+		thing = (Thing)things.get(0);
+		assertEquals("one_changed", thing.getName());
+		s.delete(thing);
+		t.commit();
+		s.close();
+	}
+
+	public void testUpdateNonNullOptionalJoinToDiffNonNullDetached() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		// create a new thing with a non-null name
+		Thing thing = new Thing();
+		thing.setName("one");
+		s.save(thing);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		List things = s.createQuery("from Thing").list();
+		assertEquals(1, things.size());
+		thing = (Thing)things.get(0);
+		assertEquals("one", thing.getName());
+		t.commit();
+		s.close();
+				
+		// change detached thing name to a new non-null name and save it
+		thing.setName("one_changed");
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.update(thing);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		things = s.createQuery("from Thing").list();
+		assertEquals(1, things.size());
+		thing = (Thing)things.get(0);
+		assertEquals("one_changed", thing.getName());
+		s.delete(thing);
+		t.commit();
+		s.close();
+	}
+
+	public void testMergeNonNullOptionalJoinToDiffNonNullDetached() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		// create a new thing with a non-null name
+		Thing thing = new Thing();
+		thing.setName("one");
+		s.save(thing);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		List things = s.createQuery("from Thing").list();
+		assertEquals(1, things.size());
+		thing = (Thing)things.get(0);
+		assertEquals("one", thing.getName());
+		t.commit();
+		s.close();
+
+		// change detached thing name to a new non-null name and save it
+		thing.setName("one_changed");
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.merge(thing);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		things = s.createQuery("from Thing").list();
+		assertEquals(1, things.size());
+		thing = (Thing)things.get(0);
+		assertEquals("one_changed", thing.getName());
+		s.delete(thing);
+		t.commit();
+		s.close();
+	}
+
+
+	public void testUpdateNonNullOptionalJoinToNull() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		// create a new thing with a non-null name
+		Thing thing = new Thing();
+		thing.setName("one");
+		s.save(thing);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		List things = s.createQuery("from Thing").list();
+		assertEquals(1, things.size());
+		thing = (Thing)things.get(0);
+		assertEquals("one", thing.getName());
+		// give it a null name and save it
+		thing.setName(null);
+		s.update(thing);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		things = s.createQuery("from Thing").list();
+		assertEquals(1, things.size());
+		thing = (Thing)things.get(0);
+		assertNull(thing.getName());
+		s.delete(thing);
+		t.commit();
+		s.close();
+	}
+
+	public void testUpdateNonNullOptionalJoinToNullDetached() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		// create a new thing with a non-null name
+		Thing thing = new Thing();
+		thing.setName("one");
+		s.save(thing);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		List things = s.createQuery("from Thing").list();
+		assertEquals(1, things.size());
+		thing = (Thing)things.get(0);
+		assertEquals("one", thing.getName());
+		t.commit();
+		s.close();
+
+		// give detached thing a null name and save it
+		thing.setName(null);
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.update(thing);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		things = s.createQuery("from Thing").list();
+		assertEquals(1, things.size());
+		thing = (Thing)things.get(0);
+		assertNull(thing.getName());
+		s.delete(thing);
+		t.commit();
+		s.close();
+	}
+
+	public void testMergeNonNullOptionalJoinToNullDetached() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		// create a new thing with a non-null name
+		Thing thing = new Thing();
+		thing.setName("one");
+		s.save(thing);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		List things = s.createQuery("from Thing").list();
+		assertEquals(1, things.size());
+		thing = (Thing)things.get(0);
+		assertEquals("one", thing.getName());
+		t.commit();
+		s.close();
+
+		// give detached thing a null name and save it
+		thing.setName(null);
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.merge(thing);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		things = s.createQuery("from Thing").list();
+		assertEquals(1, things.size());
+		thing = (Thing)things.get(0);
+		assertNull(thing.getName());
+		s.delete(thing);
+		t.commit();
+		s.close();
+	}
+
+	public void testUpdateNullOptionalJoinToNonNull() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		// create a new thing with a null name
+		Thing thing = new Thing();
+		thing.setName(null);
+		s.save(thing);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		List things = s.createQuery("from Thing").list();
+		assertEquals(1, things.size());
+		thing = (Thing)things.get(0);
+		assertNull(thing.getName());
+		// change name to a non-null value
+		thing.setName("two");
+		s.update(thing);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		things = s.createQuery("from Thing").list();
+		assertEquals(1, things.size());
+		thing = ((Thing) things.get(0));
+		assertEquals("two", thing.getName());
+		s.delete(thing);
+		t.commit();
+		s.close();
+	}
+
+	public void testUpdateNullOptionalJoinToNonNullDetached() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		// create a new thing with a null name
+		Thing thing = new Thing();
+		thing.setName(null);
+		s.save(thing);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		List things = s.createQuery("from Thing").list();
+		assertEquals(1, things.size());
+		thing = (Thing)things.get(0);
+		assertNull(thing.getName());
+		t.commit();
+		s.close();
+
+		// change detached thing name to a non-null value
+		thing.setName("two");
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.update(thing);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		things = s.createQuery("from Thing").list();
+		assertEquals(1, things.size());
+		thing = ((Thing) things.get(0));
+		assertEquals("two", thing.getName());
+		s.delete(thing);
+		t.commit();
+		s.close();
+	}
+
+	public void testMergeNullOptionalJoinToNonNullDetached() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		// create a new thing with a null name
+		Thing thing = new Thing();
+		thing.setName(null);
+		s.save(thing);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		List things = s.createQuery("from Thing").list();
+		assertEquals(1, things.size());
+		thing = (Thing)things.get(0);
+		assertNull(thing.getName());
+		t.commit();
+		s.close();
+
+		// change detached thing name to a non-null value
+		thing.setName("two");
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.merge(thing);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		things = s.createQuery("from Thing").list();
+		assertEquals(1, things.size());
+		thing = ((Thing) things.get(0));
+		assertEquals("two", thing.getName());
+		s.delete(thing);
+		t.commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/OptionalJoinTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/Person.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/Person.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/Person.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,89 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+  This mapping demonstrates 
+
+     (1) a table-per-subclass mapping strategy where subclass data is
+         retrieved by sequential select instead of a join (we do NOT
+         recommend you do this, since it is very vulnerable to N+1
+         problems; users porting applications from TopLink might find
+         this useful for reproducing old behavior)
+         
+     (2) spreading data from a single class across multiple tables
+         (again, we do not recommend you do this; use finer grained
+         classes instead)
+     
+     (3) use of null as a discriminator value
+     
+     (4) recursive associations withing an inheritance tree
+     
+-->
+
+<hibernate-mapping package="org.hibernate.test.join" default-access="field">
+
+    <class name="Person" table="person" lazy="true" discriminator-value="null">
+
+        <id name="id" column="person_id" unsaved-value="0">
+            <generator class="native"/>
+        </id>
+
+        <!-- force is unnecessary, in case we had other unknown discriminator values -->
+        <discriminator column="person_type" type="string" length="1" not-null="false" force="true"/>
+
+        <property name="name" not-null="true" length="80"/>
+        <property name="sex" not-null="true" update="false"/>
+		<property name="heightInches">
+			<column name="height_centimeters" 
+				not-null="true" 
+				read="height_centimeters / 2.54" 
+				write="? * 2.54"/>
+		</property>        
+
+        <join table="address">
+            <key column="address_id"/>
+            <property name="address"/>
+            <property name="zip"/>
+            <property name="country"/>
+        </join>
+
+        <subclass name="Employee" lazy="true" discriminator-value="E">
+            <join table="employee" fetch="select">
+                <key column="person_id"/>
+                <property name="title" column="`title`" not-null="true" length="20"/>
+                <property name="salary" length="0"/>
+                <many-to-one name="manager"/>
+            </join>
+        </subclass>
+
+        <subclass name="Customer" lazy="true" discriminator-value="C">
+            <join table="customer" fetch="select">
+                <key column="person_id"/>
+                <property name="comments"/>
+                <many-to-one name="salesperson"/>
+            </join>
+        </subclass>
+
+        <subclass name="User" lazy="true" discriminator-value="U">
+            <join table="t_user" fetch="select" optional="true">
+                <key column="person_id"/>
+                <property name="login" column="u_login"/>
+				<property name="passwordExpiryDays">
+					<column name="pwd_expiry_weeks" 
+						read="pwd_expiry_weeks * 7.0" 
+						write="? / 7.0"/>
+				</property>                
+            </join>
+            <join table="t_silly" fetch="select" optional="true">
+                <key column="person_id"/>
+                <property name="silly"/>
+            </join>
+        </subclass>
+
+    </class>
+
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/Person.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,103 @@
+//$Id: Person.java 7203 2005-06-19 02:01:05Z oneovthafew $
+package org.hibernate.test.join;
+
+
+/**
+ * @author Gavin King
+ */
+public class Person {
+	private long id;
+	private String name;
+	private String address;
+	private String zip;
+	private String country;
+	private double heightInches;
+	private char sex;
+	
+	/**
+	 * @return Returns the sex.
+	 */
+	public char getSex() {
+		return sex;
+	}
+	/**
+	 * @param sex The sex to set.
+	 */
+	public void setSex(char sex) {
+		this.sex = sex;
+	}
+	/**
+	 * @return Returns the id.
+	 */
+	public long getId() {
+		return id;
+	}
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(long id) {
+		this.id = id;
+	}
+	/**
+	 * @return Returns the identity.
+	 */
+	public String getName() {
+		return name;
+	}
+	/**
+	 * @param identity The identity to set.
+	 */
+	public void setName(String identity) {
+		this.name = identity;
+	}
+	public String getSpecies() {
+		return null;
+	}
+
+	/**
+	 * @return Returns the country.
+	 */
+	public String getCountry() {
+		return country;
+	}
+	/**
+	 * @param country The country to set.
+	 */
+	public void setCountry(String country) {
+		this.country = country;
+	}
+	/**
+	 * @return Returns the zip.
+	 */
+	public String getZip() {
+		return zip;
+	}
+	/**
+	 * @param zip The zip to set.
+	 */
+	public void setZip(String zip) {
+		this.zip = zip;
+	}
+	/**
+	 * @return the The height in inches.
+	 */
+	public double getHeightInches() {
+		return heightInches;
+	}
+	/**
+	 * @param heightInches The height in inches.
+	 */
+	public void setHeightInches(double heightInches) {
+		this.heightInches = heightInches;
+	}
+	/**
+	 * @param address The address to set.
+	 */
+	public void setAddress(String address) {
+		this.address = address;
+	}
+	
+	public String getAddress() {
+		return address;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/Person.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/Thing.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/Thing.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/Thing.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+  This mapping demonstrates optional joined properties
+-->
+
+<hibernate-mapping package="org.hibernate.test.join" default-access="field">
+
+	<class name="Thing" table="thing">
+
+		<id name="id" column="thing_id" unsaved-value="0">
+			<generator class="native"/>
+		</id>
+
+		<join table="thing_name" optional="true">
+			<key column="thing_id"/>
+			<property name="name"/>
+		</join>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/Thing.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/Thing.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/Thing.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/Thing.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,63 @@
+//$Id: $
+package org.hibernate.test.join;
+
+/**
+ * @author Chris Jones
+ */
+public class Thing {
+	private Employee salesperson;
+	private String comments;
+
+	/**
+	 * @return Returns the salesperson.
+	 */
+	public Employee getSalesperson() {
+		return salesperson;
+	}
+	/**
+	 * @param salesperson The salesperson to set.
+	 */
+	public void setSalesperson(Employee salesperson) {
+		this.salesperson = salesperson;
+	}
+	/**
+	 * @return Returns the comments.
+	 */
+	public String getComments() {
+		return comments;
+	}
+	/**
+	 * @param comments The comments to set.
+	 */
+	public void setComments(String comments) {
+		this.comments = comments;
+	}
+
+	Long id;
+	String name;
+
+	/**
+	 * @return Returns the ID.
+	 */
+	public Long getId() {
+		return id;
+	}
+	/**
+	 * @param id The ID to set.
+	 */
+	public void setId(Long id) {
+		this.id = id;
+	}
+	/**
+	 * @return Returns the name.
+	 */
+	public String getName() {
+		return name;
+	}
+	/**
+	 * @param name The name to set.
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/Thing.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/User.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/User.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/User.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,36 @@
+//$Id$
+package org.hibernate.test.join;
+
+/**
+ * @author Mike Dillon
+ */
+public class User extends Person {
+	private String login;
+	private String silly;
+	private Double passwordExpiryDays;
+
+	/**
+	 * @return Returns the login.
+	 */
+	public String getLogin() {
+		return login;
+	}
+	/**
+	 * @param login The login to set.
+	 */
+	public void setLogin(String login) {
+		this.login = login;
+	}
+	/**
+	 * @return The password expiry policy in days.
+	 */
+	public Double getPasswordExpiryDays() {
+		return passwordExpiryDays;
+	}
+	/**
+	 * @param passwordExpiryDays The password expiry policy in days. 
+	 */
+	public void setPasswordExpiryDays(Double passwordExpiryDays) {
+		this.passwordExpiryDays = passwordExpiryDays;
+	}	
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/join/User.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinedsubclass/Address.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinedsubclass/Address.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinedsubclass/Address.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,11 @@
+//$Id: Address.java 4364 2004-08-17 12:10:32Z oneovthafew $
+package org.hibernate.test.joinedsubclass;
+
+/**
+ * @author Gavin King
+ */
+public class Address {
+	public String address;
+	public String zip;
+	public String country;
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinedsubclass/Address.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinedsubclass/Customer.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinedsubclass/Customer.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinedsubclass/Customer.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,35 @@
+//$Id: Customer.java 4364 2004-08-17 12:10:32Z oneovthafew $
+package org.hibernate.test.joinedsubclass;
+
+/**
+ * @author Gavin King
+ */
+public class Customer extends Person {
+	private Employee salesperson;
+	private String comments;
+
+	/**
+	 * @return Returns the salesperson.
+	 */
+	public Employee getSalesperson() {
+		return salesperson;
+	}
+	/**
+	 * @param salesperson The salesperson to set.
+	 */
+	public void setSalesperson(Employee salesperson) {
+		this.salesperson = salesperson;
+	}
+	/**
+	 * @return Returns the comments.
+	 */
+	public String getComments() {
+		return comments;
+	}
+	/**
+	 * @param comments The comments to set.
+	 */
+	public void setComments(String comments) {
+		this.comments = comments;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinedsubclass/Customer.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinedsubclass/Employee.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinedsubclass/Employee.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinedsubclass/Employee.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,62 @@
+//$Id: Employee.java 4364 2004-08-17 12:10:32Z oneovthafew $
+package org.hibernate.test.joinedsubclass;
+
+import java.math.BigDecimal;
+
+/**
+ * @author Gavin King
+ */
+public class Employee extends Person {
+	private String title;
+	private BigDecimal salary;
+	private double passwordExpiryDays;
+	private Employee manager;
+	/**
+	 * @return Returns the title.
+	 */
+	public String getTitle() {
+		return title;
+	}
+	/**
+	 * @param title The title to set.
+	 */
+	public void setTitle(String title) {
+		this.title = title;
+	}
+	/**
+	 * @return Returns the manager.
+	 */
+	public Employee getManager() {
+		return manager;
+	}
+	/**
+	 * @param manager The manager to set.
+	 */
+	public void setManager(Employee manager) {
+		this.manager = manager;
+	}
+	/**
+	 * @return Returns the salary.
+	 */
+	public BigDecimal getSalary() {
+		return salary;
+	}
+	/**
+	 * @param salary The salary to set.
+	 */
+	public void setSalary(BigDecimal salary) {
+		this.salary = salary;
+	}
+	/**
+	 * @return The password expiry policy in days.
+	 */
+	public double getPasswordExpiryDays() {
+		return passwordExpiryDays;
+	}
+	/**
+	 * @param passwordExpiryDays The password expiry policy in days. 
+	 */
+	public void setPasswordExpiryDays(double passwordExpiryDays) {
+		this.passwordExpiryDays = passwordExpiryDays;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinedsubclass/Employee.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinedsubclass/JoinedSubclassTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinedsubclass/JoinedSubclassTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinedsubclass/JoinedSubclassTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,281 @@
+//$Id: JoinedSubclassTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.joinedsubclass;
+
+import java.math.BigDecimal;
+import java.util.Iterator;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.LockMode;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.criterion.Property;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class JoinedSubclassTest extends FunctionalTestCase {
+
+	public JoinedSubclassTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "joinedsubclass/Person.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( JoinedSubclassTest.class );
+	}
+
+	public void testJoinedSubclass() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Employee mark = new Employee();
+		mark.setName("Mark");
+		mark.setTitle("internal sales");
+		mark.setSex('M');
+		mark.setAddress("buckhead");
+		mark.setZip("30305");
+		mark.setCountry("USA");
+
+		Customer joe = new Customer();
+		joe.setName("Joe");
+		joe.setAddress("San Francisco");
+		joe.setZip("XXXXX");
+		joe.setCountry("USA");
+		joe.setComments("Very demanding");
+		joe.setSex('M');
+		joe.setSalesperson(mark);
+
+		Person yomomma = new Person();
+		yomomma.setName("mum");
+		yomomma.setSex('F');
+
+		s.save(yomomma);
+		s.save(mark);
+		s.save(joe);
+
+		assertEquals( s.createQuery("from java.io.Serializable").list().size(), 0 );
+
+		assertEquals( s.createQuery("from Person").list().size(), 3 );
+		assertEquals( s.createQuery("from Person p where p.class = Customer").list().size(), 1 );
+		assertEquals( s.createQuery("from Person p where p.class = Person").list().size(), 1 );
+		s.clear();
+
+		List customers = s.createQuery("from Customer c left join fetch c.salesperson").list();
+		for ( Iterator iter = customers.iterator(); iter.hasNext(); ) {
+			Customer c = (Customer) iter.next();
+			assertTrue( Hibernate.isInitialized( c.getSalesperson() ) );
+			assertEquals( c.getSalesperson().getName(), "Mark" );
+		}
+		assertEquals( customers.size(), 1 );
+		s.clear();
+
+		customers = s.createQuery("from Customer").list();
+		for ( Iterator iter = customers.iterator(); iter.hasNext(); ) {
+			Customer c = (Customer) iter.next();
+			assertFalse( Hibernate.isInitialized( c.getSalesperson() ) );
+			assertEquals( c.getSalesperson().getName(), "Mark" );
+		}
+		assertEquals( customers.size(), 1 );
+		s.clear();
+
+
+		mark = (Employee) s.get( Employee.class, new Long( mark.getId() ) );
+		joe = (Customer) s.get( Customer.class, new Long( joe.getId() ) );
+
+ 		mark.setZip("30306");
+        assertEquals( s.createQuery("from Person p where p.address.zip = '30306'" ).list().size(),1 );
+
+        s.createCriteria( Person.class ).add(
+                Restrictions.in( "address", new Address[] { mark.getAddress(), joe.getAddress() } ) ).list();
+
+        s.delete(mark);
+		s.delete(joe);
+		s.delete(yomomma);
+		assertTrue( s.createQuery("from Person").list().isEmpty() );
+		t.commit();
+		s.close();
+	}
+
+	public void testAccessAsIncorrectSubclass() {
+		Session s = openSession();
+		s.beginTransaction();
+		Employee e = new Employee();
+		e.setName( "Steve" );
+		e.setSex( 'M' );
+		e.setTitle( "grand poobah" );
+		s.save( e );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		Customer c = ( Customer ) s.get( Customer.class, new Long( e.getId() ) );
+		s.getTransaction().commit();
+		s.close();
+		assertNull( c );
+
+		s = openSession();
+		s.beginTransaction();
+		e = ( Employee ) s.get( Employee.class, new Long( e.getId() ) );
+		c = ( Customer ) s.get( Customer.class, new Long( e.getId() ) );
+		s.getTransaction().commit();
+		s.close();
+		assertNotNull( e );
+		assertNull( c );
+
+		s = openSession();
+		s.beginTransaction();
+		s.delete( e );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testQuerySubclassAttribute() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Person p = new Person();
+		p.setName("Emmanuel");
+		p.setSex('M');
+		s.persist(p);
+		Employee q = new Employee();
+		q.setName("Steve");
+		q.setSex('M');
+		q.setTitle("Mr");
+		q.setSalary( new BigDecimal(1000) );
+		s.persist(q);
+
+		List result = s.createQuery("from Person where salary > 100").list();
+		assertEquals( result.size(), 1 );
+		assertSame( result.get(0), q );
+
+		result = s.createQuery("from Person where salary > 100 or name like 'E%'").list();
+		assertEquals( result.size(), 2 );
+
+		result = s.createCriteria(Person.class)
+			.add( Property.forName("salary").gt( new BigDecimal(100) ) )
+			.list();
+		assertEquals( result.size(), 1 );
+		assertSame( result.get(0), q );
+
+		//TODO: make this work:
+		/*result = s.createQuery("select salary from Person where salary > 100").list();
+		assertEquals( result.size(), 1 );
+		assertEquals( result.get(0), new BigDecimal(1000) );*/
+
+		s.delete(p);
+		s.delete(q);
+		t.commit();
+		s.close();
+	}
+	
+	public void testCustomColumnReadAndWrite() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		final double HEIGHT_INCHES = 73;
+		final double HEIGHT_CENTIMETERS = HEIGHT_INCHES * 2.54d;
+		Person p = new Person();
+		p.setName("Emmanuel");
+		p.setSex('M');
+		p.setHeightInches(HEIGHT_INCHES);
+		s.persist(p);
+		final double PASSWORD_EXPIRY_WEEKS = 4;
+		final double PASSWORD_EXPIRY_DAYS = PASSWORD_EXPIRY_WEEKS * 7d;
+		Employee e = new Employee();
+		e.setName("Steve");
+		e.setSex('M');
+		e.setTitle("Mr");		
+		e.setPasswordExpiryDays(PASSWORD_EXPIRY_DAYS);
+		s.persist(e);
+		s.flush();
+		
+		// Test value conversion during insert
+		Double heightViaSql = (Double)s.createSQLQuery("select height_centimeters from JPerson where name='Emmanuel'").uniqueResult();
+		assertEquals(HEIGHT_CENTIMETERS, heightViaSql, 0.01d);
+		Double expiryViaSql = (Double)s.createSQLQuery("select pwd_expiry_weeks from JEmployee where person_id=?")
+			.setLong(0, e.getId())
+			.uniqueResult();
+		assertEquals(PASSWORD_EXPIRY_WEEKS, expiryViaSql, 0.01d);
+		
+		// Test projection
+		Double heightViaHql = (Double)s.createQuery("select p.heightInches from Person p where p.name = 'Emmanuel'").uniqueResult();
+		assertEquals(HEIGHT_INCHES, heightViaHql, 0.01d);
+		Double expiryViaHql = (Double)s.createQuery("select e.passwordExpiryDays from Employee e where e.name = 'Steve'").uniqueResult();
+		assertEquals(PASSWORD_EXPIRY_DAYS, expiryViaHql, 0.01d);
+		
+		// Test restriction and entity load via criteria
+		p = (Person)s.createCriteria(Person.class)
+			.add(Restrictions.between("heightInches", HEIGHT_INCHES - 0.01d, HEIGHT_INCHES + 0.01d))
+			.uniqueResult();
+		assertEquals(HEIGHT_INCHES, p.getHeightInches(), 0.01d);
+		e = (Employee)s.createCriteria(Employee.class)
+			.add(Restrictions.between("passwordExpiryDays", PASSWORD_EXPIRY_DAYS - 0.01d, PASSWORD_EXPIRY_DAYS + 0.01d))
+			.uniqueResult();
+		assertEquals(PASSWORD_EXPIRY_DAYS, e.getPasswordExpiryDays(), 0.01d);
+		
+		// Test predicate and entity load via HQL
+		p = (Person)s.createQuery("from Person p where p.heightInches between ? and ?")
+			.setDouble(0, HEIGHT_INCHES - 0.01d)
+			.setDouble(1, HEIGHT_INCHES + 0.01d)
+			.uniqueResult();
+		assertEquals(HEIGHT_INCHES, p.getHeightInches(), 0.01d);
+		e = (Employee)s.createQuery("from Employee e where e.passwordExpiryDays between ? and ?")
+			.setDouble(0, PASSWORD_EXPIRY_DAYS - 0.01d)
+			.setDouble(1, PASSWORD_EXPIRY_DAYS + 0.01d)
+			.uniqueResult();
+		assertEquals(PASSWORD_EXPIRY_DAYS, e.getPasswordExpiryDays(), 0.01d);
+		
+		// Test update
+		p.setHeightInches(1);
+		e.setPasswordExpiryDays(7);
+		s.flush();
+		heightViaSql = (Double)s.createSQLQuery("select height_centimeters from JPerson where name='Emmanuel'").uniqueResult();
+		assertEquals(2.54d, heightViaSql, 0.01d);
+		expiryViaSql = (Double)s.createSQLQuery("select pwd_expiry_weeks from JEmployee where person_id=?")
+			.setLong(0, e.getId())
+			.uniqueResult();
+		assertEquals(1d, expiryViaSql, 0.01d);
+		s.delete(p);
+		s.delete(e);	
+		t.commit();
+		s.close();
+		
+	}
+
+	public void testLockingJoinedSubclass() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Person p = new Person();
+		p.setName("Emmanuel");
+		p.setSex('M');
+		s.persist(p);
+		Employee q = new Employee();
+		q.setName("Steve");
+		q.setSex('M');
+		q.setTitle("Mr");
+		q.setSalary( new BigDecimal(1000) );
+		s.persist(q);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.lock( p, LockMode.UPGRADE );
+		s.lock( q, LockMode.UPGRADE );
+		s.delete( p );
+		s.delete( q );
+		t.commit();
+		s.close();
+
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinedsubclass/JoinedSubclassTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinedsubclass/Person.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinedsubclass/Person.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinedsubclass/Person.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,76 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+  This mapping demonstrates 
+
+     (1) a table-per-subclass mapping strategy
+         
+     (2) a simple component mapping
+     
+     (3) recursive associations withing an inheritance tree
+     
+-->
+
+<hibernate-mapping 
+	package="org.hibernate.test.joinedsubclass"
+	default-access="field">
+	
+	<class name="Person" table="JPerson">
+		
+		<id name="id" 
+			column="person_id" 
+			unsaved-value="0">
+			<generator class="native"/>
+		</id>
+
+        <version name="version" column="version" type="int"/>
+
+        <property name="name"
+			not-null="true"
+			length="80"/>
+		<property name="sex" 
+			not-null="true"
+			update="false"/>
+		<property name="heightInches">
+			<column name="height_centimeters" 
+				not-null="true" 
+				read="height_centimeters / 2.54" 
+				write="? * 2.54"/>
+		</property>
+		
+		<component name="address">
+			<property name="address"/>
+			<property name="zip"/>
+			<property name="country"/>
+		</component>
+		
+		<joined-subclass name="Employee" table="JEmployee">
+				<key column="person_id"/>
+				<property name="title" column="`title`"
+					not-null="true" 
+					length="20"/>
+				<property name="salary" 
+					length="0"/>
+				<property name="passwordExpiryDays">
+					<column name="pwd_expiry_weeks" 
+						not-null="true" 
+						read="pwd_expiry_weeks * 7.0" 
+						write="? / 7.0"/>
+				</property>					
+				<many-to-one name="manager"/>
+		</joined-subclass>
+		
+		<joined-subclass name="Customer" table="JManager">
+				<key column="person_id"/>
+				<property name="comments"/>
+				<many-to-one name="salesperson"/>
+		</joined-subclass>
+		
+	</class>
+	
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinedsubclass/Person.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinedsubclass/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinedsubclass/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinedsubclass/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,93 @@
+//$Id: Person.java 10218 2006-08-04 18:24:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.joinedsubclass;
+
+
+/**
+ * @author Gavin King
+ */
+public class Person {
+	private long id;
+	private String name;
+	private char sex;
+	private int version;
+	private double heightInches;
+	private Address address = new Address();
+	/**
+	 * @return Returns the address.
+	 */
+	public Address getAddress() {
+		return address;
+	}
+
+	public void setAddress(String string) {
+		this.address.address = string;
+	}
+
+	public void setZip(String string) {
+		this.address.zip = string;
+	}
+
+	public void setCountry(String string) {
+		this.address.country = string;
+	}
+
+	
+	/**
+	 * @return Returns the sex.
+	 */
+	public char getSex() {
+		return sex;
+	}
+	/**
+	 * @param sex The sex to set.
+	 */
+	public void setSex(char sex) {
+		this.sex = sex;
+	}
+	/**
+	 * @return Returns the id.
+	 */
+	public long getId() {
+		return id;
+	}
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(long id) {
+		this.id = id;
+	}
+	/**
+	 * @return Returns the identity.
+	 */
+	public String getName() {
+		return name;
+	}
+	/**
+	 * @param identity The identity to set.
+	 */
+	public void setName(String identity) {
+		this.name = identity;
+	}
+
+	/**
+	 * @return Returns the height in inches.
+	 */
+	public double getHeightInches() {
+		return heightInches;
+	}
+
+	/**
+	 * @param heightInches The height in inches to set.
+	 */
+	public void setHeightInches(double heightInches) {
+		this.heightInches = heightInches;
+	}
+
+	public int getVersion() {
+		return version;
+	}
+
+	public void setVersion(int version) {
+		this.version = version;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinedsubclass/Person.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/Bid.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/Bid.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/Bid.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,49 @@
+//$Id: Bid.java 6793 2005-05-16 05:46:47Z oneovthafew $
+package org.hibernate.test.joinfetch;
+
+import java.util.Calendar;
+
+/**
+ * @author Gavin King
+ */
+public class Bid {
+	
+	private float amount;
+	private Item item;
+	private Calendar timestamp;
+	private Long id;
+
+	public float getAmount() {
+		return amount;
+	}
+	public void setAmount(float amount) {
+		this.amount = amount;
+	}
+	public Item getItem() {
+		return item;
+	}
+	public void setItem(Item item) {
+		this.item = item;
+	}
+	public Calendar getTimestamp() {
+		return timestamp;
+	}
+	public void setTimestamp(Calendar timestamp) {
+		this.timestamp = timestamp;
+	}
+	
+	Bid() {}
+	public Bid(Item item, float amount) {
+		this.amount = amount;
+		this.item = item;
+		item.getBids().add(this);
+		this.timestamp = Calendar.getInstance();
+	}
+	public Long getId() {
+		return id;
+	}
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/Bid.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/Category.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/Category.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/Category.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,20 @@
+//$Id: Category.java 6957 2005-05-31 04:21:58Z oneovthafew $
+package org.hibernate.test.joinfetch;
+
+/**
+ * @author Gavin King
+ */
+public class Category {
+	
+	private String name;
+
+	Category() {}
+
+	public Category(String name) {
+		this.name = name;
+	}
+	
+	public String getName() {
+		return name;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/Category.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/Comment.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/Comment.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/Comment.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,49 @@
+//$Id: Comment.java 6797 2005-05-16 12:08:03Z oneovthafew $
+package org.hibernate.test.joinfetch;
+
+import java.util.Calendar;
+
+/**
+ * @author Gavin King
+ */
+public class Comment {
+	
+	private String text;
+	private Item item;
+	private Calendar timestamp;
+	private Long id;
+
+	public Item getItem() {
+		return item;
+	}
+	public void setItem(Item item) {
+		this.item = item;
+	}
+	public Calendar getTimestamp() {
+		return timestamp;
+	}
+	public void setTimestamp(Calendar timestamp) {
+		this.timestamp = timestamp;
+	}
+	
+	Comment() {}
+	public Comment(Item item, String comment) {
+		this.text = comment;
+		this.item = item;
+		item.getComments().add(this);
+		this.timestamp = Calendar.getInstance();
+	}
+	public Long getId() {
+		return id;
+	}
+	public void setId(Long id) {
+		this.id = id;
+	}
+	public String getText() {
+		return text;
+	}
+	public void setText(String text) {
+		this.text = text;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/Comment.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/Group.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/Group.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/Group.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,33 @@
+//$Id: Group.java 7175 2005-06-17 05:23:15Z oneovthafew $
+package org.hibernate.test.joinfetch;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Group {
+	private String name;
+	private Map users = new HashMap();
+	
+	public Group(String name) {
+		this.name = name;
+	}
+
+	Group() {}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Map getUsers() {
+		return users;
+	}
+
+	public void setUsers(Map users) {
+		this.users = users;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/Group.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/Item.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/Item.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/Item.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,64 @@
+//$Id: Item.java 6957 2005-05-31 04:21:58Z oneovthafew $
+package org.hibernate.test.joinfetch;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author Gavin King
+ */
+public class Item {
+	
+	private String description;
+	private Long id;
+	private Category category;
+	private Set bids = new HashSet();
+	private Set comments = new HashSet();
+
+	public String getDescription() {
+		return description;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	Item() {}
+	public Item(Category cat, String desc) { 
+		description = desc; 
+		category = cat;
+	}
+
+	public Set getBids() {
+		return bids;
+	}
+
+	public void setBids(Set bids) {
+		this.bids = bids;
+	}
+
+	public Set getComments() {
+		return comments;
+	}
+
+	public void setComments(Set comments) {
+		this.comments = comments;
+	}
+
+	public Category getCategory() {
+		return category;
+	}
+
+	public void setCategory(Category category) {
+		this.category = category;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/Item.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/ItemBid.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/ItemBid.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/ItemBid.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,64 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+     
+-->
+
+<hibernate-mapping 
+	package="org.hibernate.test.joinfetch"
+	default-access="field">
+	
+	<class name="Category" table="AuctionCategories">
+		<id name="name"/>
+	</class>
+	
+	<class name="Item" table="AuctionItems">
+		<id name="id">
+			<generator class="increment"/>
+		</id>
+		<property name="description" not-null="true"/>
+		<many-to-one name="category" not-null="true"/>
+		<set name="bids" cascade="all" fetch="join" inverse="true" order-by="`timestamp`">
+			<key column="item"/>
+			<one-to-many class="Bid"/>
+		</set>
+		<set name="comments" cascade="all" fetch="join" inverse="true" order-by="`timestamp`">
+			<key column="item"/>
+			<one-to-many class="Comment"/>
+		</set>
+
+		<sql-query name="all">
+			<return alias="item" class="Item"/>
+			<return-join alias="bid" property="item.bids"/>
+			<return-join alias="commnt" property="item.comments"/>
+			select {item.*}, {bid.*}, {commnt.*} 
+			from AuctionItems item
+				left outer join AuctionBids bid on bid.item = item.id
+				left outer join AuctionComments commnt on commnt.item = item.id
+		</sql-query>
+
+	</class>
+	
+	<class name="Bid" table="AuctionBids">
+		<id name="id">
+			<generator class="increment"/>
+		</id>
+		<property name="amount" not-null="true"/>
+		<property name="timestamp" column="`timestamp`" not-null="true"/>
+		<many-to-one name="item" fetch="join" not-null="true"/>
+	</class>
+
+	<class name="Comment" table="AuctionComments">
+		<id name="id">
+			<generator class="increment"/>
+		</id>
+		<property name="text" not-null="true"/>
+		<property name="timestamp" column="`timestamp`" not-null="true"/>
+		<many-to-one name="item" fetch="join" not-null="true"/>
+	</class>
+	
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/ItemBid.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/JoinFetchTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/JoinFetchTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/JoinFetchTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,267 @@
+//$Id: JoinFetchTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.joinfetch;
+
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.FetchMode;
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.criterion.Projections;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class JoinFetchTest extends FunctionalTestCase {
+	
+	public JoinFetchTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "joinfetch/ItemBid.hbm.xml", "joinfetch/UserGroup.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setProperty(Environment.MAX_FETCH_DEPTH, "10");
+		cfg.setProperty(Environment.USE_SECOND_LEVEL_CACHE, "false");
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( JoinFetchTest.class );
+	}
+	
+	public void testProjection() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.createCriteria(Item.class).setProjection( Projections.rowCount() ).uniqueResult();
+		s.createCriteria(Item.class).uniqueResult();
+		t.commit();
+		s.close();
+	}
+
+	public void testJoinFetch() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.createQuery( "delete from Bid" ).executeUpdate();
+		s.createQuery( "delete from Comment" ).executeUpdate();
+		s.createQuery( "delete from Item" ).executeUpdate();
+		t.commit();
+		s.close();
+		
+		Category cat = new Category("Photography");
+		Item i = new Item(cat, "Camera");
+		Bid b = new Bid(i, 100.0f);
+		new Bid(i, 105.0f);
+		new Comment(i, "This looks like a really good deal");
+		new Comment(i, "Is it the latest version?");
+		new Comment(i, "<comment deleted>");
+		System.out.println( b.getTimestamp() );
+		
+		s = openSession();
+		t = s.beginTransaction();
+		s.persist(cat);
+		s.persist(i);
+		t.commit();
+		s.close();
+		
+		getSessions().evict(Item.class);
+
+		s = openSession();
+		t = s.beginTransaction();
+		i = (Item) s.get( Item.class, i.getId() );
+		assertTrue( Hibernate.isInitialized( i.getBids() ) );
+		assertEquals( i.getBids().size(), 2 );
+		assertTrue( Hibernate.isInitialized( i.getComments() ) );
+		assertEquals( i.getComments().size(), 3 );
+		t.commit();
+		s.close();
+
+		getSessions().evict(Bid.class);
+
+		s = openSession();
+		t = s.beginTransaction();
+		b = (Bid) s.get( Bid.class, b.getId() );
+		assertTrue( Hibernate.isInitialized( b.getItem() ) );
+		assertTrue( Hibernate.isInitialized( b.getItem().getComments() ) );
+		assertEquals( b.getItem().getComments().size(), 3 );
+		System.out.println( b.getTimestamp() );
+		t.commit();
+		s.close();
+
+		getSessions().evictCollection(Item.class.getName() + ".bids");
+		
+		s = openSession();
+		t = s.beginTransaction();
+		i = (Item) s.createCriteria( Item.class )
+			.setFetchMode("bids", FetchMode.SELECT)
+			.setFetchMode("comments", FetchMode.SELECT)
+			.uniqueResult();
+		assertFalse( Hibernate.isInitialized( i.getBids() ) );
+		assertFalse( Hibernate.isInitialized( i.getComments() ) );
+		b = (Bid) i.getBids().iterator().next();
+		assertTrue( Hibernate.isInitialized( b.getItem() ) );
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		i = (Item) s.createQuery("from Item i left join fetch i.bids left join fetch i.comments").uniqueResult();
+		assertTrue( Hibernate.isInitialized( i.getBids() ) );
+		assertTrue( Hibernate.isInitialized( i.getComments() ) );
+		assertEquals( i.getComments().size(), 3 );
+		assertEquals( i.getBids().size(), 2 );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Object[] row = (Object[]) s.getNamedQuery(Item.class.getName() + ".all").list().get(0);
+		i = (Item) row[0];
+		assertTrue( Hibernate.isInitialized( i.getBids() ) );
+		assertTrue( Hibernate.isInitialized( i.getComments() ) );
+		assertEquals( i.getComments().size(), 3 );
+		assertEquals( i.getBids().size(), 2 );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		i = (Item) s.createCriteria(Item.class).uniqueResult();
+		assertTrue( Hibernate.isInitialized( i.getBids() ) );
+		assertTrue( Hibernate.isInitialized( i.getComments() ) );
+		assertEquals( i.getComments().size(), 3 );
+		assertEquals( i.getBids().size(), 2 );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		List bids = s.createQuery("from Bid b left join fetch b.item i left join fetch i.category").list();
+		Bid bid = (Bid) bids.get(0);
+		assertTrue( Hibernate.isInitialized( bid.getItem() ) );
+		assertTrue( Hibernate.isInitialized( bid.getItem().getCategory() ) );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		List pairs = s.createQuery("from Item i left join i.bids b left join fetch i.category").list();
+		Item item = (Item) ( (Object[]) pairs.get(0) )[0];
+		assertFalse( Hibernate.isInitialized( item.getBids() ) );
+		assertTrue( Hibernate.isInitialized( item.getCategory() ) );
+		s.clear();
+		pairs = s.createQuery("from Item i left join i.bids b left join i.category").list();
+		item = (Item) ( (Object[]) pairs.get(0) )[0];
+		assertFalse( Hibernate.isInitialized( item.getBids() ) );
+		assertTrue( Hibernate.isInitialized( item.getCategory() ) );
+		s.clear();
+		pairs = s.createQuery("from Bid b left join b.item i left join fetch i.category").list();
+		bid = (Bid) ( (Object[]) pairs.get(0) )[0];
+		assertTrue( Hibernate.isInitialized( bid.getItem() ) );
+		assertTrue( Hibernate.isInitialized( bid.getItem().getCategory() ) );
+		s.clear();
+		pairs = s.createQuery("from Bid b left join b.item i left join i.category").list();
+		bid = (Bid) ( (Object[]) pairs.get(0) )[0];
+		assertTrue( Hibernate.isInitialized( bid.getItem() ) );
+		assertTrue( Hibernate.isInitialized( bid.getItem().getCategory() ) );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery( "delete from Bid" ).executeUpdate();
+		s.createQuery( "delete from Comment" ).executeUpdate();
+		s.createQuery( "delete from Item" ).executeUpdate();
+		s.createQuery( "delete from Category" ).executeUpdate();
+		t.commit();
+		s.close();
+
+	}
+	
+	public void testCollectionFilter() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Group hb = new Group("hibernate");
+		User gavin = new User("gavin");
+		User max = new User("max");
+		hb.getUsers().put("gavin", gavin);
+		hb.getUsers().put("max", max);
+		gavin.getGroups().put("hibernate", hb);
+		max.getGroups().put("hibernate", hb);
+		s.persist(hb);
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		hb = (Group) s.createCriteria(Group.class)
+				.setFetchMode("users", FetchMode.SELECT)
+				.add( Restrictions.idEq("hibernate") )
+				.uniqueResult();
+		assertFalse( Hibernate.isInitialized( hb.getUsers() ) );
+		//gavin = (User) s.createFilter( hb.getUsers(), "where index(this) = 'gavin'" ).uniqueResult();
+		Long size = (Long) s.createFilter( hb.getUsers(), "select count(*)" ).uniqueResult();
+		assertEquals( new Long(2), size );
+		assertFalse( Hibernate.isInitialized( hb.getUsers() ) );
+		s.delete(hb);
+		t.commit();
+		s.close();
+		
+	}
+	
+	public void testJoinFetchManyToMany() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Group hb = new Group("hibernate");
+		User gavin = new User("gavin");
+		User max = new User("max");
+		hb.getUsers().put("gavin", gavin);
+		hb.getUsers().put("max", max);
+		gavin.getGroups().put("hibernate", hb);
+		max.getGroups().put("hibernate", hb);
+		s.persist(hb);
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		hb = (Group) s.get(Group.class, "hibernate");
+		assertTrue( Hibernate.isInitialized( hb.getUsers() ) );
+		gavin = (User) hb.getUsers().get("gavin");
+		assertFalse( Hibernate.isInitialized( gavin.getGroups() ) );
+		max = (User) s.get(User.class, "max");
+		assertFalse( Hibernate.isInitialized( max.getGroups() ) );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		hb = (Group) s.createCriteria(Group.class)
+			.setFetchMode("users", FetchMode.JOIN)
+			.setFetchMode("users.groups", FetchMode.JOIN)
+			.uniqueResult();
+		assertTrue( Hibernate.isInitialized( hb.getUsers() ) );
+		gavin = (User) hb.getUsers().get("gavin");
+		assertTrue( Hibernate.isInitialized( gavin.getGroups() ) );
+		max = (User) s.get(User.class, "max");
+		assertTrue( Hibernate.isInitialized( max.getGroups() ) );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete(hb);
+		t.commit();
+		s.close();
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/JoinFetchTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/User.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/User.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/User.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,33 @@
+//$Id: User.java 7175 2005-06-17 05:23:15Z oneovthafew $
+package org.hibernate.test.joinfetch;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class User {
+	private String name;
+	private Map groups = new HashMap();
+
+	public User(String name) {
+		this.name = name;
+	}
+
+	User() {}
+
+	public Map getGroups() {
+		return groups;
+	}
+
+	public void setGroups(Map groups) {
+		this.groups = groups;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/User.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/UserGroup.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/UserGroup.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/UserGroup.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+     
+-->
+
+<hibernate-mapping 
+	package="org.hibernate.test.joinfetch"
+	default-access="field">
+	
+	<class name="User" table="AuctionUsers">
+		<id name="name"/>
+		<map name="groups" table="AuctionUsersGroups" fetch="join" order-by="groupName">
+			<key column="`userName`"/>
+			<map-key formula="groupName" type="string"/>
+			<many-to-many column="groupName" class="Group"/>
+		</map>
+	</class>
+	
+	<class name="Group" table="AuctionGroups">
+		<id name="name"/>
+		<map name="users" table="AuctionUsersGroups" fetch="join" order-by="`userName`" inverse="true" cascade="all">
+			<key column="groupName"/>
+			<map-key formula="`userName`" type="string"/>
+			<many-to-many column="`userName`" class="User"/>
+		</map>
+	</class>
+	
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/joinfetch/UserGroup.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/AbstractJPATest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/AbstractJPATest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/AbstractJPATest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,148 @@
+package org.hibernate.test.jpa;
+
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.proxy.EntityNotFoundDelegate;
+import org.hibernate.event.def.DefaultPersistEventListener;
+import org.hibernate.event.def.DefaultAutoFlushEventListener;
+import org.hibernate.event.def.DefaultFlushEventListener;
+import org.hibernate.event.def.DefaultFlushEntityEventListener;
+import org.hibernate.event.AutoFlushEventListener;
+import org.hibernate.event.FlushEventListener;
+import org.hibernate.event.PersistEventListener;
+import org.hibernate.event.FlushEntityEventListener;
+import org.hibernate.engine.CascadingAction;
+import org.hibernate.util.IdentityMap;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+
+import java.io.Serializable;
+
+/**
+ * An abstract test for all JPA spec related tests.
+ *
+ * @author Steve Ebersole
+ */
+public abstract class AbstractJPATest extends FunctionalTestCase {
+	public AbstractJPATest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "jpa/Part.hbm.xml", "jpa/Item.hbm.xml", "jpa/MyEntity.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		super.configure( cfg );
+		cfg.setProperty( Environment.JPAQL_STRICT_COMPLIANCE, "true" );
+		cfg.setProperty( Environment.USE_SECOND_LEVEL_CACHE, "false" );
+		cfg.setEntityNotFoundDelegate( new JPAEntityNotFoundDelegate() );
+		cfg.getEventListeners().setPersistEventListeners( buildPersistEventListeners() );
+		cfg.getEventListeners().setPersistOnFlushEventListeners( buildPersisOnFlushEventListeners() );
+		cfg.getEventListeners().setAutoFlushEventListeners( buildAutoFlushEventListeners() );
+		cfg.getEventListeners().setFlushEventListeners( buildFlushEventListeners() );
+		cfg.getEventListeners().setFlushEntityEventListeners( buildFlushEntityEventListeners() );
+	}
+
+	public String getCacheConcurrencyStrategy() {
+		// no second level caching
+		return null;
+	}
+
+
+	// mimic specific exception aspects of the JPA environment ~~~~~~~~~~~~~~~~
+
+	private static class JPAEntityNotFoundDelegate implements EntityNotFoundDelegate {
+		public void handleEntityNotFound(String entityName, Serializable id) {
+			throw new EntityNotFoundException( entityName, id );
+		}
+	}
+
+	/**
+	 * Mimic the JPA EntityNotFoundException.
+	 */
+	public static class EntityNotFoundException extends RuntimeException {
+		private final String entityName;
+		private final Serializable id;
+
+		public EntityNotFoundException(String entityName, Serializable id) {
+			this( "unable to locate specified entity", entityName, id );
+		}
+
+		public EntityNotFoundException(String message, String entityName, Serializable id) {
+			super( message );
+			this.entityName = entityName;
+			this.id = id;
+		}
+
+		public String getEntityName() {
+			return entityName;
+		}
+
+		public Serializable getId() {
+			return id;
+		}
+	}
+
+
+	// mimic specific event aspects of the JPA environment ~~~~~~~~~~~~~~~~~~~~
+
+	protected PersistEventListener[] buildPersistEventListeners() {
+		return new PersistEventListener[] { new JPAPersistEventListener() };
+	}
+
+	protected PersistEventListener[] buildPersisOnFlushEventListeners() {
+		return new PersistEventListener[] { new JPAPersistOnFlushEventListener() };
+	}
+
+	protected AutoFlushEventListener[] buildAutoFlushEventListeners() {
+		return new AutoFlushEventListener[] { JPAAutoFlushEventListener.INSTANCE };
+	}
+
+	protected FlushEventListener[] buildFlushEventListeners() {
+		return new FlushEventListener[] { JPAFlushEventListener.INSTANCE };
+	}
+
+	protected FlushEntityEventListener[] buildFlushEntityEventListeners() {
+		return new FlushEntityEventListener[] { new JPAFlushEntityEventListener() };
+	}
+
+	public static class JPAPersistEventListener extends DefaultPersistEventListener {
+		// overridden in JPA impl for entity callbacks...
+	}
+
+	public static class JPAPersistOnFlushEventListener extends JPAPersistEventListener {
+		protected CascadingAction getCascadeAction() {
+			return CascadingAction.PERSIST_ON_FLUSH;
+		}
+	}
+
+	public static class JPAAutoFlushEventListener extends DefaultAutoFlushEventListener {
+		// not sure why EM code has this ...
+		public static final AutoFlushEventListener INSTANCE = new JPAAutoFlushEventListener();
+
+		protected CascadingAction getCascadingAction() {
+			return CascadingAction.PERSIST_ON_FLUSH;
+		}
+
+		protected Object getAnything() {
+			return IdentityMap.instantiate( 10 );
+		}
+	}
+
+	public static class JPAFlushEventListener extends DefaultFlushEventListener {
+		// not sure why EM code has this ...
+		public static final FlushEventListener INSTANCE = new JPAFlushEventListener();
+
+		protected CascadingAction getCascadingAction() {
+			return CascadingAction.PERSIST_ON_FLUSH;
+		}
+
+		protected Object getAnything() {
+			return IdentityMap.instantiate( 10 );
+		}
+	}
+
+	public static class JPAFlushEntityEventListener extends DefaultFlushEntityEventListener {
+		// in JPA, used mainly for preUpdate callbacks...
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/AbstractJPATest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/Item.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/Item.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/Item.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.jpa">
+
+	<class name="Item" table="EJB3_ITEM">
+        <id name="id" column="ITEM_ID" type="long">
+            <generator class="increment"/>
+        </id>
+        <version name="version" column="VERS" type="long"/>
+        <property name="name" column="NAME" not-null="true"/>
+        <!-- modeled as many-to-one even though, yes, in real life would normally be many-to-many -->
+        <set name="parts" cascade="all" fetch="subselect" inverse="true">
+            <key column="ITEM_ID"/>
+            <one-to-many class="Part"/>
+        </set>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/Item.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/Item.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/Item.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/Item.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,53 @@
+package org.hibernate.test.jpa;
+
+import java.util.Set;
+import java.util.HashSet;
+
+/**
+ * @author Steve Ebersole
+ */
+public class Item {
+	private Long id;
+	private String name;
+	private long version;
+	private Set parts = new HashSet();
+
+	public Item() {
+	}
+
+	public Item(String name) {
+		this.name = name;
+	}
+
+	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 long getVersion() {
+		return version;
+	}
+
+	public void setVersion(long version) {
+		this.version = version;
+	}
+
+	public Set getParts() {
+		return parts;
+	}
+
+	public void setParts(Set parts) {
+		this.parts = parts;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/Item.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/MyEntity.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/MyEntity.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/MyEntity.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+
+<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<hibernate-mapping package="org.hibernate.test.jpa">
+
+    <class name="MyEntity" table="JPA_MYENTITY" discriminator-value="E">
+        <id name="id" column="ID" type="long">
+            <generator class="increment"/>
+        </id>
+        <discriminator column="TYPE" />
+        <property name="name" type="string"/>
+        <many-to-one name="other" class="MyEntity" />
+        <subclass name="MySubclassEntity" discriminator-value="S">
+            <property name="someSubProperty"/>
+        </subclass>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/MyEntity.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/MyEntity.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/MyEntity.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/MyEntity.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,36 @@
+package org.hibernate.test.jpa;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class MyEntity {
+	private Long id;
+	private String name;
+	private MyEntity other;
+
+	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 MyEntity getOther() {
+		return other;
+	}
+
+	public void setOther(MyEntity other) {
+		this.other = other;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/MyEntity.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/MySubclassEntity.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/MySubclassEntity.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/MySubclassEntity.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,18 @@
+package org.hibernate.test.jpa;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class MySubclassEntity extends MyEntity {
+	private String someSubProperty;
+
+	public String getSomeSubProperty() {
+		return someSubProperty;
+	}
+
+	public void setSomeSubProperty(String someSubProperty) {
+		this.someSubProperty = someSubProperty;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/MySubclassEntity.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/Part.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/Part.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/Part.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.jpa">
+
+	<class name="Part" table="EJB3_PART">
+        <id name="id" column="PART_ID" type="long">
+            <generator class="increment"/>
+        </id>
+        <many-to-one name="item" class="Item" column="ITEM_ID" cascade="save-update, lock" not-null="true"/>
+        <property name="name" column="NAME" not-null="true" type="string"/>
+        <property name="stockNumber" column="STOCK_NUM" not-null="true" type="string"/>
+        <property name="unitPrice" column="UNIT_PRICE" not-null="true" type="big_decimal"/>
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/Part.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/Part.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/Part.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/Part.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,66 @@
+package org.hibernate.test.jpa;
+
+import java.math.BigDecimal;
+
+/**
+ * @author Steve Ebersole
+ */
+public class Part {
+	private Long id;
+	private Item item;
+	private String name;
+	private String stockNumber;
+	private BigDecimal unitPrice;
+
+	public Part() {
+	}
+
+	public Part(Item item, String name, String stockNumber, BigDecimal unitPrice) {
+		this.item = item;
+		this.name = name;
+		this.stockNumber = stockNumber;
+		this.unitPrice = unitPrice;
+
+		this.item.getParts().add( this );
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	private void setId(Long id) {
+		this.id = id;
+	}
+
+	public Item getItem() {
+		return item;
+	}
+
+	private void setItem(Item item) {
+		this.item = item;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getStockNumber() {
+		return stockNumber;
+	}
+
+	public void setStockNumber(String stockNumber) {
+		this.stockNumber = stockNumber;
+	}
+
+	public BigDecimal getUnitPrice() {
+		return unitPrice;
+	}
+
+	public void setUnitPrice(BigDecimal unitPrice) {
+		this.unitPrice = unitPrice;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/Part.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/CascadeTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/CascadeTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/CascadeTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,315 @@
+package org.hibernate.test.jpa.cascade;
+
+import org.hibernate.test.jpa.AbstractJPATest;
+import org.hibernate.Session;
+import org.hibernate.TransientObjectException;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import junit.framework.Test;
+
+/**
+ * According to the JPA spec, persist()ing an entity should throw an exception
+ * when said entity contains a reference to a transient entity through a mapped
+ * association where that association is not marked for cascading the persist
+ * operation.
+ * <p/>
+ * This test-case tests that requirement in the various association style
+ * scenarios such as many-to-one, one-to-one, many-to-one (property-ref),
+ * one-to-one (property-ref).  Additionally, it performs each of these tests
+ * in both generated and assigned identifier usages...
+ *
+ * @author Steve Ebersole
+ */
+public class CascadeTest extends AbstractJPATest {
+
+	public static final Logger log = LoggerFactory.getLogger( CascadeTest.class );
+
+	public CascadeTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "jpa/cascade/ParentChild.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( CascadeTest.class );
+	}
+
+	public void testManyToOneGeneratedIdsOnSave() {
+		// NOTES: Child defines a many-to-one back to its Parent.  This
+		// association does not define persist cascading (which is natural;
+		// a child should not be able to create its parent).
+		try {
+			Session s = openSession();
+			s.beginTransaction();
+			Parent p = new Parent( "parent" );
+			Child c = new Child( "child" );
+			c.setParent( p );
+			s.save( c );
+			try {
+				s.getTransaction().commit();
+				fail( "expecting TransientObjectException on flush" );
+			}
+			catch( TransientObjectException e ) {
+				// expected result
+				log.trace( "handled expected exception", e );
+				s.getTransaction().rollback();
+			}
+			finally {
+				s.close();
+			}
+		}
+		finally {
+			cleanupData();
+		}
+	}
+
+	public void testManyToOneGeneratedIds() {
+		// NOTES: Child defines a many-to-one back to its Parent.  This
+		// association does not define persist cascading (which is natural;
+		// a child should not be able to create its parent).
+		try {
+			Session s = openSession();
+			s.beginTransaction();
+			Parent p = new Parent( "parent" );
+			Child c = new Child( "child" );
+			c.setParent( p );
+			s.persist( c );
+			try {
+				s.getTransaction().commit();
+				fail( "expecting TransientObjectException on flush" );
+			}
+			catch( TransientObjectException e ) {
+				// expected result
+				log.trace( "handled expected exception", e );
+				s.getTransaction().rollback();
+			}
+			finally {
+				s.close();
+			}
+		}
+		finally {
+			cleanupData();
+		}
+	}
+
+	public void testManyToOneAssignedIds() {
+		// NOTES: Child defines a many-to-one back to its Parent.  This
+		// association does not define persist cascading (which is natural;
+		// a child should not be able to create its parent).
+		try {
+			Session s = openSession();
+			s.beginTransaction();
+			ParentAssigned p = new ParentAssigned( new Long( 1 ), "parent" );
+			ChildAssigned c = new ChildAssigned( new Long( 2 ), "child" );
+			c.setParent( p );
+			s.persist( c );
+			try {
+				s.getTransaction().commit();
+				fail( "expecting TransientObjectException on flush" );
+			}
+			catch( TransientObjectException e ) {
+				// expected result
+				log.trace( "handled expected exception", e );
+				s.getTransaction().rollback();
+			}
+			finally {
+				s.close();
+			}
+		}
+		finally {
+			cleanupData();
+		}
+	}
+
+	public void testOneToOneGeneratedIds() {
+		try {
+			Session s = openSession();
+			s.beginTransaction();
+			Parent p = new Parent( "parent" );
+			ParentInfo info = new ParentInfo( "xyz" );
+			p.setInfo( info );
+			info.setOwner( p );
+			s.persist( p );
+			try {
+				s.getTransaction().commit();
+				fail( "expecting TransientObjectException on flush" );
+			}
+			catch( TransientObjectException e ) {
+				// expected result
+				log.trace( "handled expected exception", e );
+				s.getTransaction().rollback();
+			}
+			finally {
+				s.close();
+			}
+		}
+		finally {
+			cleanupData();
+		}
+	}
+
+	public void testOneToOneAssignedIds() {
+		try {
+			Session s = openSession();
+			s.beginTransaction();
+			ParentAssigned p = new ParentAssigned( new Long( 1 ), "parent" );
+			ParentInfoAssigned info = new ParentInfoAssigned( "something secret" );
+			p.setInfo( info );
+			info.setOwner( p );
+			s.persist( p );
+			try {
+				s.getTransaction().commit();
+				fail( "expecting TransientObjectException on flush" );
+			}
+			catch( TransientObjectException e ) {
+				// expected result
+				log.trace( "handled expected exception", e );
+				s.getTransaction().rollback();
+			}
+			finally {
+				s.close();
+			}
+		}
+		finally {
+			cleanupData();
+		}
+	}
+
+	public void testManyToOnePropertyRefGeneratedIds() {
+		try {
+			Session s = openSession();
+			s.beginTransaction();
+			Parent p = new Parent( "parent" );
+			Other other = new Other();
+			other.setOwner( p );
+			s.persist( other );
+			try {
+				s.getTransaction().commit();
+				fail( "expecting TransientObjectException on flush" );
+			}
+			catch( TransientObjectException e ) {
+				// expected result
+				log.trace( "handled expected exception", e );
+				s.getTransaction().rollback();
+			}
+			finally {
+				s.close();
+			}
+		}
+		finally {
+			cleanupData();
+		}
+	}
+
+	public void testManyToOnePropertyRefAssignedIds() {
+		try {
+			Session s = openSession();
+			s.beginTransaction();
+			ParentAssigned p = new ParentAssigned( new Long( 1 ), "parent" );
+			OtherAssigned other = new OtherAssigned( new Long( 2 ) );
+			other.setOwner( p );
+			s.persist( other );
+			try {
+				s.getTransaction().commit();
+				fail( "expecting TransientObjectException on flush" );
+			}
+			catch( TransientObjectException e ) {
+				// expected result
+				log.trace( "handled expected exception", e );
+				s.getTransaction().rollback();
+			}
+			finally {
+				s.close();
+			}
+		}
+		finally {
+			cleanupData();
+		}
+	}
+
+	public void testOneToOnePropertyRefGeneratedIds() {
+		try {
+			Session s = openSession();
+			s.beginTransaction();
+			Child c2 = new Child( "c2" );
+			ChildInfo info = new ChildInfo( "blah blah blah" );
+			c2.setInfo( info );
+			info.setOwner( c2 );
+			s.persist( c2 );
+			try {
+				s.getTransaction().commit();
+				fail( "expecting TransientObjectException on flush" );
+			}
+			catch( TransientObjectException e ) {
+				// expected result
+				log.trace( "handled expected exception : " + e );
+				s.getTransaction().rollback();
+			}
+			finally {
+				s.close();
+			}
+		}
+		finally {
+			cleanupData();
+		}
+	}
+
+	public void testOneToOnePropertyRefAssignedIds() {
+		try {
+			Session s = openSession();
+			s.beginTransaction();
+			ChildAssigned c2 = new ChildAssigned( new Long( 3 ), "c3" );
+			ChildInfoAssigned info = new ChildInfoAssigned( new Long( 4 ), "blah blah blah" );
+			c2.setInfo( info );
+			info.setOwner( c2 );
+			s.persist( c2 );
+			try {
+				s.getTransaction().commit();
+				fail( "expecting TransientObjectException on flush" );
+			}
+			catch( TransientObjectException e ) {
+				// expected result
+				log.trace( "handled expected exception : " + e );
+				s.getTransaction().rollback();
+			}
+			finally {
+				s.close();
+			}
+		}
+		finally {
+			cleanupData();
+		}
+	}
+
+
+	private void cleanupData() {
+		Session s = null;
+		try {
+			s = openSession();
+			s.beginTransaction();
+			s.createQuery( "delete ChildInfoAssigned" ).executeUpdate();
+			s.createQuery( "delete ChildAssigned" ).executeUpdate();
+			s.createQuery( "delete ParentAssigned" ).executeUpdate();
+			s.createQuery( "delete ChildInfoAssigned" ).executeUpdate();
+			s.createQuery( "delete ChildAssigned" ).executeUpdate();
+			s.createQuery( "delete ParentAssigned" ).executeUpdate();
+			s.getTransaction().commit();
+		}
+		catch( Throwable t ) {
+			log.warn( "unable to cleanup test data [" + fullTestName() + "] : " + t );
+		}
+		finally {
+			if ( s != null ) {
+				try {
+					s.close();
+				}
+				catch( Throwable ignore ) {
+				}
+			}
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/CascadeTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/Child.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/Child.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/Child.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,52 @@
+package org.hibernate.test.jpa.cascade;
+
+/**
+ * todo: describe Child
+ *
+ * @author Steve Ebersole
+ */
+public class Child {
+	private Long id;
+	private String name;
+	private Parent parent;
+	private ChildInfo info;
+
+	public Child() {
+	}
+
+	public Child(String name) {
+		this.name = name;
+	}
+
+	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 Parent getParent() {
+		return parent;
+	}
+
+	public void setParent(Parent parent) {
+		this.parent = parent;
+	}
+
+	public ChildInfo getInfo() {
+		return info;
+	}
+
+	public void setInfo(ChildInfo info) {
+		this.info = info;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/Child.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/ChildAssigned.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/ChildAssigned.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/ChildAssigned.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,49 @@
+package org.hibernate.test.jpa.cascade;
+
+/**
+ * Child, but with an assigned identifier.
+ *
+ * @author Steve Ebersole
+ */
+public class ChildAssigned {
+	private Long id;
+	private String name;
+	private ParentAssigned parent;
+	private ChildInfoAssigned info;
+
+	public ChildAssigned() {
+	}
+
+	public ChildAssigned(Long id, String name) {
+		this.id = id;
+		this.name = name;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public ParentAssigned getParent() {
+		return parent;
+	}
+
+	public void setParent(ParentAssigned parent) {
+		this.parent = parent;
+	}
+
+	public ChildInfoAssigned getInfo() {
+		return info;
+	}
+
+	public void setInfo(ChildInfoAssigned info) {
+		this.info = info;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/ChildAssigned.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/ChildInfo.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/ChildInfo.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/ChildInfo.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,39 @@
+package org.hibernate.test.jpa.cascade;
+
+/**
+ * todo: describe ChildInfo
+ *
+ * @author Steve Ebersole
+ */
+public class ChildInfo {
+	private Long id;
+	private Child owner;
+	private String info;
+
+	public ChildInfo() {
+	}
+
+	public ChildInfo(String info) {
+		this.info = info;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public Child getOwner() {
+		return owner;
+	}
+
+	public void setOwner(Child owner) {
+		this.owner = owner;
+	}
+
+	public String getInfo() {
+		return info;
+	}
+
+	public void setInfo(String info) {
+		this.info = info;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/ChildInfo.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/ChildInfoAssigned.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/ChildInfoAssigned.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/ChildInfoAssigned.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,40 @@
+package org.hibernate.test.jpa.cascade;
+
+/**
+ * todo: describe ChildInfo
+ *
+ * @author Steve Ebersole
+ */
+public class ChildInfoAssigned {
+	private Long id;
+	private ChildAssigned owner;
+	private String info;
+
+	public ChildInfoAssigned() {
+	}
+
+	public ChildInfoAssigned(Long id, String info) {
+		this.id = id;
+		this.info = info;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public ChildAssigned getOwner() {
+		return owner;
+	}
+
+	public void setOwner(ChildAssigned owner) {
+		this.owner = owner;
+	}
+
+	public String getInfo() {
+		return info;
+	}
+
+	public void setInfo(String info) {
+		this.info = info;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/ChildInfoAssigned.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/Other.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/Other.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/Other.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,23 @@
+package org.hibernate.test.jpa.cascade;
+
+/**
+ * todo: describe Other
+ *
+ * @author Steve Ebersole
+ */
+public class Other {
+	private Long id;
+	private Parent owner;
+
+	public Long getId() {
+		return id;
+	}
+
+	public Parent getOwner() {
+		return owner;
+	}
+
+	public void setOwner(Parent owner) {
+		this.owner = owner;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/Other.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/OtherAssigned.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/OtherAssigned.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/OtherAssigned.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,30 @@
+package org.hibernate.test.jpa.cascade;
+
+/**
+ * todo: describe Other
+ *
+ * @author Steve Ebersole
+ */
+public class OtherAssigned {
+	private Long id;
+	private ParentAssigned owner;
+
+	public OtherAssigned() {
+	}
+
+	public OtherAssigned(Long id) {
+		this.id = id;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public ParentAssigned getOwner() {
+		return owner;
+	}
+
+	public void setOwner(ParentAssigned owner) {
+		this.owner = owner;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/OtherAssigned.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/Parent.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/Parent.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/Parent.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,43 @@
+package org.hibernate.test.jpa.cascade;
+
+/**
+ * todo: describe Parent
+ *
+ * @author Steve Ebersole
+ */
+public class Parent {
+	private Long id;
+	private String name;
+	private ParentInfo info;
+
+	public Parent() {
+	}
+
+	public Parent(String name) {
+		this.name = name;
+	}
+
+	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 ParentInfo getInfo() {
+		return info;
+	}
+
+	public void setInfo(ParentInfo info) {
+		this.info = info;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/Parent.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/ParentAssigned.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/ParentAssigned.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/ParentAssigned.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,40 @@
+package org.hibernate.test.jpa.cascade;
+
+/**
+ * Parent, but with an assigned identifier.
+ *
+ * @author Steve Ebersole
+ */
+public class ParentAssigned {
+	private Long id;
+	private String name;
+	private ParentInfoAssigned info;
+
+	public ParentAssigned() {
+	}
+
+	public ParentAssigned(Long id, String name) {
+		this.id = id;
+		this.name = name;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public ParentInfoAssigned getInfo() {
+		return info;
+	}
+
+	public void setInfo(ParentInfoAssigned info) {
+		this.info = info;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/ParentAssigned.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/ParentChild.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/ParentChild.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/ParentChild.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,97 @@
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.jpa.cascade" default-access="field">
+
+    <!-- +++++++++++++   Generated ids    ++++++++++++++++++++++ -->
+
+    <class name="Parent" table="PARENT">
+        <id name="id" column="ID" type="long">
+            <generator class="increment"/>
+        </id>
+        <property name="name" type="string" unique="true"/>
+        <one-to-one name="info" class="ParentInfo" cascade="none"/>
+    </class>
+
+	<class name="Child" table="CHILD">
+        <id name="id" column="ID" type="long">
+            <generator class="increment"/>
+        </id>
+        <property name="name" type="string"/>
+        <many-to-one name="parent" class="Parent" cascade="none"/>
+        <one-to-one name="info" property-ref="owner" class="ChildInfo" cascade="none"/>
+    </class>
+
+    <class name="ParentInfo" table="P_INFO">
+        <id name="id" column="ID" type="long">
+            <generator class="foreign">
+                <param name="property">owner</param>
+            </generator>
+        </id>
+        <property name="info" column="INFO" type="string"/>
+        <one-to-one name="owner" class="Parent" constrained="true" cascade="none"/>
+    </class>
+
+    <class name="ChildInfo" table="C_INFO">
+        <id name="id" column="ID" type="long">
+            <generator class="increment"/>
+        </id>
+        <property name="info" column="INFO" type="string"/>
+        <many-to-one name="owner" class="Child" column="CHILD_ID" cascade="none"/>
+    </class>
+
+    <class name="Other" table="OTHER">
+        <id name="id" column="ID" type="long">
+            <generator class="increment"/>
+        </id>
+        <many-to-one name="owner" column="OWNER_NAME" class="Parent" property-ref="name" cascade="none"/>
+    </class>
+
+
+
+    <!-- +++++++++++++   Assigned ids    ++++++++++++++++++++++ -->
+
+    <class name="ParentAssigned" table="PARENT_A">
+        <id name="id" column="ID" type="long">
+            <generator class="assigned"/>
+        </id>
+        <property name="name" type="string" unique="true"/>
+        <one-to-one name="info" class="ParentInfoAssigned"/>
+    </class>
+
+	<class name="ChildAssigned" table="CHILD_A">
+        <id name="id" column="ID" type="long">
+            <generator class="assigned"/>
+        </id>
+        <property name="name" type="string"/>
+        <many-to-one name="parent" class="ParentAssigned" cascade="none"/>
+        <one-to-one name="info" property-ref="owner" class="ChildInfoAssigned" cascade="none"/>
+    </class>
+
+    <class name="ParentInfoAssigned" table="P_INFO_A">
+        <id name="id" column="ID" type="long">
+            <generator class="foreign">
+                <param name="property">owner</param>
+            </generator>
+        </id>
+        <property name="info" column="INFO" type="string"/>
+        <one-to-one name="owner" class="ParentAssigned" constrained="true"/>
+    </class>
+
+    <class name="ChildInfoAssigned" table="C_INFO_A">
+        <id name="id" column="ID" type="long">
+            <generator class="assigned"/>
+        </id>
+        <property name="info" column="INFO" type="string"/>
+        <many-to-one name="owner" class="ChildAssigned" column="CHILD_ID" cascade="none"/>
+    </class>
+
+    <class name="OtherAssigned" table="OTHER_A">
+        <id name="id" column="ID" type="long">
+            <generator class="assigned"/>
+        </id>
+        <many-to-one name="owner" column="OWNER_NAME" class="ParentAssigned" property-ref="name" cascade="none"/>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/ParentChild.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/ParentInfo.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/ParentInfo.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/ParentInfo.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,39 @@
+package org.hibernate.test.jpa.cascade;
+
+/**
+ * todo: describe ChildInfo
+ *
+ * @author Steve Ebersole
+ */
+public class ParentInfo {
+	private Long id;
+	private Parent owner;
+	private String info;
+
+	public ParentInfo() {
+	}
+
+	public ParentInfo(String info) {
+		this.info = info;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public Parent getOwner() {
+		return owner;
+	}
+
+	public void setOwner(Parent owner) {
+		this.owner = owner;
+	}
+
+	public String getInfo() {
+		return info;
+	}
+
+	public void setInfo(String info) {
+		this.info = info;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/ParentInfo.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/ParentInfoAssigned.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/ParentInfoAssigned.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/ParentInfoAssigned.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,39 @@
+package org.hibernate.test.jpa.cascade;
+
+/**
+ * todo: describe ChildInfo
+ *
+ * @author Steve Ebersole
+ */
+public class ParentInfoAssigned {
+	private Long id;
+	private ParentAssigned owner;
+	private String info;
+
+	public ParentInfoAssigned() {
+	}
+
+	public ParentInfoAssigned(String info) {
+		this.info = info;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public ParentAssigned getOwner() {
+		return owner;
+	}
+
+	public void setOwner(ParentAssigned owner) {
+		this.owner = owner;
+	}
+
+	public String getInfo() {
+		return info;
+	}
+
+	public void setInfo(String info) {
+		this.info = info;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/cascade/ParentInfoAssigned.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/fetch/FetchingTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/fetch/FetchingTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/fetch/FetchingTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,84 @@
+package org.hibernate.test.jpa.fetch;
+
+import java.util.Date;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.jpa.AbstractJPATest;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class FetchingTest extends AbstractJPATest {
+
+	public FetchingTest(String x) {
+		super( x );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "jpa/fetch/Person.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( FetchingTest.class );
+	}
+
+	public void testLazy() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Person p = new Person( "Gavin", "King", "JBoss Inc" );
+		Stay stay = new Stay( p, new Date(), new Date(), "A380", "Blah", "Blah" );
+		p.addStay( stay );
+		s.persist( p );
+		tx.commit();
+		s.clear();
+		tx = s.beginTransaction();
+		p = (Person) s.createQuery( "select p from Person p where p.firstName = :name" )
+				.setParameter( "name", "Gavin" ).uniqueResult();
+		assertFalse( Hibernate.isInitialized( p.getStays() ) );
+		s.delete( p );
+		tx.commit();
+		s.close();
+	}
+
+	public void testHibernateFetchingLazy() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Person p = new Person( "Gavin", "King", "JBoss Inc" );
+		Stay stay = new Stay( null, new Date(), new Date(), "A380", "Blah", "Blah" );
+		Stay stay2 = new Stay( null, new Date(), new Date(), "A320", "Blah", "Blah" );
+		Stay stay3 = new Stay( null, new Date(), new Date(), "A340", "Blah", "Blah" );
+		stay.setOldPerson( p );
+		stay2.setVeryOldPerson( p );
+		stay3.setVeryOldPerson( p );
+		p.addOldStay( stay );
+		p.addVeryOldStay( stay2 );
+		p.addVeryOldStay( stay3 );
+		s.persist( p );
+		tx.commit();
+		s.clear();
+		tx = s.beginTransaction();
+		p = (Person) s.createQuery( "select p from Person p where p.firstName = :name" )
+				.setParameter( "name", "Gavin" ).uniqueResult();
+		assertFalse( Hibernate.isInitialized( p.getOldStays() ) );
+		assertEquals( 1, p.getOldStays().size() );
+		assertFalse( "lazy extra is failing", Hibernate.isInitialized( p.getOldStays() ) );
+		s.clear();
+		stay = (Stay) s.get( Stay.class, stay.getId() );
+		assertTrue( ! Hibernate.isInitialized( stay.getOldPerson() ) );
+		s.clear();
+		stay3 = (Stay) s.get( Stay.class, stay3.getId() );
+		assertTrue( "FetchMode.JOIN should overrides lazy options", Hibernate.isInitialized( stay3.getVeryOldPerson() ) );
+		s.delete( stay3.getVeryOldPerson() );
+		tx.commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/fetch/FetchingTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/fetch/Person.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/fetch/Person.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/fetch/Person.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,48 @@
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.jpa.fetch">
+
+	<class name="Person" table="PERSON">
+        <id name="id" column="ID" type="long">
+            <generator class="increment"/>
+        </id>
+        <property name="firstName"/>
+        <property name="lastName"/>
+        <property name="companyName"/>
+
+        <bag name="stays" cascade="all" lazy="true" inverse="true">
+            <key column="PERS_ID"/>
+            <one-to-many class="Stay"/>
+        </bag>
+
+        <bag name="oldStays" cascade="all" lazy="extra" fetch="subselect" inverse="true">
+            <key column="OLD_PERS_ID"/>
+            <one-to-many class="Stay"/>
+        </bag>
+
+        <bag name="veryOldStays" cascade="all" lazy="true" fetch="select" inverse="true">
+            <key column="VERY_OLD_PERS_ID"/>
+            <one-to-many class="Stay"/>
+        </bag>
+    </class>
+
+	<class name="Stay" table="STAY">
+        <id name="id" column="ID" type="long">
+            <generator class="increment"/>
+        </id>
+
+        <property name="startDate"/>
+        <property name="endDate"/>
+        <property name="vessel"/>
+        <property name="authoriser"/>
+        <property name="comments"/>
+
+        <many-to-one name="person" column="PERS_ID" class="Person" cascade="all"/>
+        <many-to-one name="oldPerson" column="OLD_PERS_ID" class="Person" cascade="all" fetch="select"/>
+        <many-to-one name="veryOldPerson" column="VERY_OLD_PERS_ID" class="Person" cascade="all" fetch="join"/>
+
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/fetch/Person.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/fetch/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/fetch/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/fetch/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,136 @@
+package org.hibernate.test.jpa.fetch;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.Date;
+import java.util.ArrayList;
+
+/**
+ * Copied over from annotations test suite...
+ *
+ * @author Emmanuel Bernard
+ */
+public class Person implements Serializable {
+
+	// member declaration
+	private Long id;
+	private String firstName;
+	private String lastName;
+	private String companyName;
+	private Collection stays;
+	private Collection oldStays;
+	private Collection veryOldStays;
+
+	// constructors
+	public Person() {
+	}
+
+	public Person(String firstName, String lastName, String companyName) {
+		this.firstName = firstName;
+		this.lastName = lastName;
+		this.companyName = companyName;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getFirstName() {
+		return firstName;
+	}
+
+	public void setFirstName(String firstName) {
+		this.firstName = firstName;
+	}
+
+	public String getLastName() {
+		return lastName;
+	}
+
+	public void setLastName(String lastName) {
+		this.lastName = lastName;
+	}
+
+	public String getCompanyName() {
+		return companyName;
+	}
+
+	public void setCompanyName(String companyName) {
+		this.companyName = companyName;
+	}
+
+	public Collection getStays() {
+		return stays;
+	}
+
+	public void setStays(Collection stays) {
+		this.stays = stays;
+	}
+
+	public Collection getOldStays() {
+		return oldStays;
+	}
+
+	public void setOldStays(Collection oldStays) {
+		this.oldStays = oldStays;
+	}
+
+	public Collection getVeryOldStays() {
+		return veryOldStays;
+	}
+
+	public void setVeryOldStays(Collection veryOldStays) {
+		this.veryOldStays = veryOldStays;
+	}
+
+
+	// business logic
+	public void addStay(Date startDate, Date endDate, String vessel, String authoriser, String comments) {
+		Stay stay = new Stay( this, startDate, endDate, vessel, authoriser, comments );
+		addStay( stay );
+	}
+
+	public void addStay(Stay stay) {
+		Collection stays = getStays();
+		if ( stays == null ) {
+			stays = new ArrayList();
+		}
+		stays.add( stay );
+
+		this.stays = stays;
+	}
+
+	public void addOldStay(Date startDate, Date endDate, String vessel, String authoriser, String comments) {
+		Stay stay = new Stay( this, startDate, endDate, vessel, authoriser, comments );
+		addOldStay( stay );
+	}
+
+	public void addOldStay(Stay stay) {
+		Collection stays = getOldStays();
+		if ( stays == null ) {
+			stays = new ArrayList();
+		}
+		stays.add( stay );
+
+		this.oldStays = stays;
+	}
+
+	public void addVeryOldStay(Date startDate, Date endDate, String vessel, String authoriser, String comments) {
+		Stay stay = new Stay( this, startDate, endDate, vessel, authoriser, comments );
+		addVeryOldStay( stay );
+	}
+
+	public void addVeryOldStay(Stay stay) {
+		Collection stays = getVeryOldStays();
+		if ( stays == null ) {
+			stays = new ArrayList();
+		}
+		stays.add( stay );
+
+		this.veryOldStays = stays;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/fetch/Person.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/fetch/Stay.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/fetch/Stay.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/fetch/Stay.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,107 @@
+package org.hibernate.test.jpa.fetch;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Stay implements Serializable {
+
+	// member declaration
+	private Long id;
+	private Person person;
+	private Person oldPerson;
+	private Person veryOldPerson;
+	private Date startDate;
+	private Date endDate;
+	private String vessel;
+	private String authoriser;
+	private String comments;
+
+
+	// constructors
+	public Stay() {
+	}
+
+	public Stay(Person person, Date startDate, Date endDate, String vessel, String authoriser, String comments) {
+		this.authoriser = authoriser;
+		this.endDate = endDate;
+		this.person = person;
+		this.startDate = startDate;
+		this.vessel = vessel;
+		this.comments = comments;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Person getPerson() {
+		return person;
+	}
+
+	public void setPerson(Person person) {
+		this.person = person;
+	}
+
+	public Person getOldPerson() {
+		return oldPerson;
+	}
+
+	public void setOldPerson(Person oldPerson) {
+		this.oldPerson = oldPerson;
+	}
+
+	public Person getVeryOldPerson() {
+		return veryOldPerson;
+	}
+
+	public void setVeryOldPerson(Person veryOldPerson) {
+		this.veryOldPerson = veryOldPerson;
+	}
+
+	public Date getStartDate() {
+		return startDate;
+	}
+
+	public void setStartDate(Date startDate) {
+		this.startDate = startDate;
+	}
+
+	public Date getEndDate() {
+		return endDate;
+	}
+
+	public void setEndDate(Date endDate) {
+		this.endDate = endDate;
+	}
+
+	public String getVessel() {
+		return vessel;
+	}
+
+	public void setVessel(String vessel) {
+		this.vessel = vessel;
+	}
+
+	public String getAuthoriser() {
+		return authoriser;
+	}
+
+	public void setAuthoriser(String authoriser) {
+		this.authoriser = authoriser;
+	}
+
+	public String getComments() {
+		return comments;
+	}
+
+	public void setComments(String comments) {
+		this.comments = comments;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/fetch/Stay.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/lock/JPALockTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/lock/JPALockTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/lock/JPALockTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,197 @@
+package org.hibernate.test.jpa.lock;
+
+import junit.framework.Test;
+
+import org.hibernate.LockMode;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.jpa.AbstractJPATest;
+import org.hibernate.test.jpa.Item;
+import org.hibernate.test.jpa.MyEntity;
+
+/**
+ * Tests specifically relating to section 3.3.5.3 [Lock Modes] of the
+ * JPA persistence specification (as of the <i>Proposed Final Draft</i>).
+ *
+ * @author Steve Ebersole
+ */
+public class JPALockTest extends AbstractJPATest {
+	public JPALockTest(String name) {
+		super( name );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( JPALockTest.class );
+	}
+
+	/**
+	 * Test the equivalent of EJB3 LockModeType.READ
+	 * <p/>
+	 * From the spec:
+	 * <p/>
+	 * If transaction T1 calls lock(entity, LockModeType.READ) on a versioned object, the entity
+	 * manager must ensure that neither of the following phenomena can occur:<ul>
+	 * <li>P1 (Dirty read): Transaction T1 modifies a row. Another transaction T2 then reads that row and
+	 * obtains the modified value, before T1 has committed or rolled back. Transaction T2 eventually
+	 * commits successfully; it does not matter whether T1 commits or rolls back and whether it does
+	 * so before or after T2 commits.
+	 * <li>P2 (Non-repeatable read): Transaction T1 reads a row. Another transaction T2 then modifies or
+	 * deletes that row, before T1 has committed. Both transactions eventually commit successfully.
+	 * <p/>
+	 * This will generally be achieved by the entity manager acquiring a lock on the underlying database row.
+	 * Any such lock may be obtained immediately (so long as it is retained until commit completes), or the
+	 * lock may be deferred until commit time (although even then it must be retained until the commit completes).
+	 * Any implementation that supports repeatable reads in a way that prevents the above phenomena
+	 * is permissible.
+	 * <p/>
+	 * The persistence implementation is not required to support calling lock(entity, LockMode-Type.READ)
+	 * on a non-versioned object. When it cannot support such a lock call, it must throw the
+	 * PersistenceException. When supported, whether for versioned or non-versioned objects, LockMode-Type.READ
+	 * must always prevent the phenomena P1 and P2. Applications that call lock(entity, LockModeType.READ)
+	 * on non-versioned objects will not be portable.
+	 * <p/>
+	 * EJB3 LockModeType.READ actually maps to the Hibernate LockMode.OPTIMISTIC
+	 */
+	public void testLockModeTypeRead() {
+		if ( !readCommittedIsolationMaintained( "ejb3 lock tests" ) ) {
+			return;
+		}
+		if ( getDialect().doesReadCommittedCauseWritersToBlockReaders() ) {
+			reportSkip( "deadlock", "jpa read locking" );
+			return;
+		}
+
+		final String initialName = "lock test";
+		// set up some test data
+		Session s1 = getSessions().openSession();
+		Transaction t1 = s1.beginTransaction();
+		Item item = new Item();
+		item.setName( initialName );
+		s1.save( item );
+		t1.commit();
+		s1.close();
+
+		Long itemId = item.getId();
+
+		// do the isolated update
+		s1 = getSessions().openSession();
+		t1 = s1.beginTransaction();
+		item = (Item) s1.get( Item.class, itemId );
+		s1.lock( item, LockMode.UPGRADE );
+		item.setName( "updated" );
+		s1.flush();
+
+		Session s2 = getSessions().openSession();
+		Transaction t2 = s2.beginTransaction();
+		Item item2 = (Item) s2.get( Item.class, itemId );
+		assertEquals( "isolation not maintained", initialName, item2.getName() );
+
+		t1.commit();
+		s1.close();
+
+		item2 = (Item) s2.get( Item.class, itemId );
+		assertEquals( "repeatable read not maintained", initialName, item2.getName() );
+		t2.commit();
+		s2.close();
+
+		s1 = getSessions().openSession();
+		t1 = s1.beginTransaction();
+		s1.delete( item );
+		t1.commit();
+		s1.close();
+	}
+
+	/**
+	 * Test the equivalent of EJB3 LockModeType.WRITE
+	 * <p/>
+	 * From the spec:
+	 * <p/>
+	 * If transaction T1 calls lock(entity, LockModeType.WRITE) on a versioned object, the entity
+	 * manager must avoid the phenomena P1 and P2 (as with LockModeType.READ) and must also force
+	 * an update (increment) to the entity's version column. A forced version update may be performed immediately,
+	 * or may be deferred until a flush or commit. If an entity is removed before a deferred version
+	 * update was to have been applied, the forced version update is omitted, since the underlying database
+	 * row no longer exists.
+	 * <p/>
+	 * The persistence implementation is not required to support calling lock(entity, LockMode-Type.WRITE)
+	 * on a non-versioned object. When it cannot support a such lock call, it must throw the
+	 * PersistenceException. When supported, whether for versioned or non-versioned objects, LockMode-Type.WRITE
+	 * must always prevent the phenomena P1 and P2. For non-versioned objects, whether or
+	 * not LockModeType.WRITE has any additional behaviour is vendor-specific. Applications that call
+	 * lock(entity, LockModeType.WRITE) on non-versioned objects will not be portable.
+	 * <p/>
+	 * Due to the requirement that LockModeType.WRITE needs to force a version increment,
+	 * a new Hibernate LockMode was added to support this behavior: {@link org.hibernate.LockMode#FORCE}.
+	 */
+	public void testLockModeTypeWrite() {
+		if ( !readCommittedIsolationMaintained( "ejb3 lock tests" ) ) {
+			return;
+		}
+		if ( getDialect().doesReadCommittedCauseWritersToBlockReaders() ) {
+			reportSkip( "deadlock", "jpa write locking" );
+			return;
+		}
+		final String initialName = "lock test";
+		// set up some test data
+		Session s1 = getSessions().openSession();
+		Transaction t1 = s1.beginTransaction();
+		Item item = new Item();
+		item.setName( initialName );
+		s1.save( item );
+		MyEntity myEntity = new MyEntity();
+		myEntity.setName( "Test" );
+		s1.save( myEntity );
+		t1.commit();
+		s1.close();
+
+		Long itemId = item.getId();
+		long initialVersion = item.getVersion();
+
+		s1 = getSessions().openSession();
+		t1 = s1.beginTransaction();
+		item = (Item) s1.get( Item.class, itemId );
+		s1.lock( item, LockMode.FORCE );
+		assertEquals( "no forced version increment", initialVersion + 1, item.getVersion() );
+
+		myEntity = (MyEntity) s1.get( MyEntity.class, myEntity.getId() );
+		s1.lock( myEntity, LockMode.FORCE );
+		assertTrue( "LockMode.FORCE on a unversioned entity should degrade nicely to UPGRADE", true );
+
+		s1.lock( item, LockMode.FORCE );
+		assertEquals( "subsequent LockMode.FORCE did not no-op", initialVersion + 1, item.getVersion() );
+
+		Session s2 = getSessions().openSession();
+		Transaction t2 = s2.beginTransaction();
+		Item item2 = (Item) s2.get( Item.class, itemId );
+		assertEquals( "isolation not maintained", initialName, item2.getName() );
+
+		item.setName( "updated-1" );
+		s1.flush();
+		// currently an unfortunate side effect...
+		assertEquals( initialVersion + 2, item.getVersion() );
+
+		t1.commit();
+		s1.close();
+
+		item2.setName( "updated" );
+		try {
+			t2.commit();
+			fail( "optimisitc lock should have failed" );
+		}
+		catch (Throwable ignore) {
+			// expected behavior
+			t2.rollback();
+		}
+		finally {
+			s2.close();
+		}
+
+		s1 = getSessions().openSession();
+		t1 = s1.beginTransaction();
+		s1.delete( item );
+		s1.delete( myEntity );
+		t1.commit();
+		s1.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/lock/JPALockTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/lock/RepeatableReadTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/lock/RepeatableReadTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/lock/RepeatableReadTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,275 @@
+package org.hibernate.test.jpa.lock;
+
+import java.math.BigDecimal;
+
+import junit.framework.Test;
+
+import org.hibernate.LockMode;
+import org.hibernate.Session;
+import org.hibernate.StaleObjectStateException;
+import org.hibernate.Transaction;
+import org.hibernate.dialect.SQLServerDialect;
+import org.hibernate.exception.SQLGrammarException;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.jpa.AbstractJPATest;
+import org.hibernate.test.jpa.Item;
+import org.hibernate.test.jpa.Part;
+
+/**
+ * Test that the Hibernate Session complies with REPEATABLE_READ isolation
+ * semantics.
+ *
+ * @author Steve Ebersole
+ */
+public class RepeatableReadTest extends AbstractJPATest {
+
+	public RepeatableReadTest(String name) {
+		super( name );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( RepeatableReadTest.class );
+	}
+
+
+	// versioned entity tests ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+	public void testStaleVersionedInstanceFoundInQueryResult() {
+		if ( getDialect().doesReadCommittedCauseWritersToBlockReaders()) {
+			reportSkip( "lock blocking", "stale versioned instance" );
+			return;
+		}
+		String check = "EJB3 Specification";
+		Session s1 = getSessions().openSession();
+		Transaction t1 = s1.beginTransaction();
+		Item item = new Item( check );
+		s1.save(  item );
+		t1.commit();
+		s1.close();
+
+		Long itemId = item.getId();
+		long initialVersion = item.getVersion();
+
+		// Now, open a new Session and re-load the item...
+		s1 = getSessions().openSession();
+		t1 = s1.beginTransaction();
+		item = ( Item ) s1.get( Item.class, itemId );
+
+		// now that the item is associated with the persistence-context of that session,
+		// open a new session and modify it "behind the back" of the first session
+		Session s2 = getSessions().openSession();
+		Transaction t2 = s2.beginTransaction();
+		Item item2 = ( Item ) s2.get( Item.class, itemId );
+		item2.setName( "EJB3 Persistence Spec" );
+		t2.commit();
+		s2.close();
+
+		// at this point, s1 now contains stale data, so try an hql query which
+		// returns said item and make sure we get the previously associated state
+		// (i.e., the old name and the old version)
+		item2 = ( Item ) s1.createQuery( "select i from Item i" ).list().get( 0 );
+		assertTrue( item == item2 );
+		assertEquals( "encountered non-repeatable read", check, item2.getName() );
+		assertEquals( "encountered non-repeatable read", initialVersion, item2.getVersion() );
+
+		t1.commit();
+		s1.close();
+
+		// clean up
+		s1 = getSessions().openSession();
+		t1 = s1.beginTransaction();
+		s1.createQuery( "delete Item" ).executeUpdate();
+		t1.commit();
+		s1.close();
+	}
+
+	public void testStaleVersionedInstanceFoundOnLock() {
+		if ( ! readCommittedIsolationMaintained( "repeatable read tests" ) ) {
+			return;
+		}
+		if ( getDialect().doesReadCommittedCauseWritersToBlockReaders()) {
+			reportSkip( "lock blocking", "stale versioned instance" );
+			return;
+		}
+		String check = "EJB3 Specification";
+		Session s1 = getSessions().openSession();
+		Transaction t1 = s1.beginTransaction();
+		Item item = new Item( check );
+		s1.save(  item );
+		t1.commit();
+		s1.close();
+
+		Long itemId = item.getId();
+		long initialVersion = item.getVersion();
+
+		// Now, open a new Session and re-load the item...
+		s1 = getSessions().openSession();
+		t1 = s1.beginTransaction();
+		item = ( Item ) s1.get( Item.class, itemId );
+
+		// now that the item is associated with the persistence-context of that session,
+		// open a new session and modify it "behind the back" of the first session
+		Session s2 = getSessions().openSession();
+		Transaction t2 = s2.beginTransaction();
+		Item item2 = ( Item ) s2.get( Item.class, itemId );
+		item2.setName( "EJB3 Persistence Spec" );
+		t2.commit();
+		s2.close();
+
+		// at this point, s1 now contains stale data, so acquire a READ lock
+		// and make sure we get the already associated state (i.e., the old
+		// name and the old version)
+		s1.lock( item, LockMode.READ );
+		item2 = ( Item ) s1.get( Item.class, itemId );
+		assertTrue( item == item2 );
+		assertEquals( "encountered non-repeatable read", check, item2.getName() );
+		assertEquals( "encountered non-repeatable read", initialVersion, item2.getVersion() );
+
+		// attempt to acquire an UPGRADE lock; this should fail
+		try {
+			s1.lock( item, LockMode.UPGRADE );
+			fail( "expected UPGRADE lock failure" );
+		}
+		catch( StaleObjectStateException expected ) {
+			// this is the expected behavior
+		}
+		catch( SQLGrammarException t ) {
+			if ( getDialect() instanceof SQLServerDialect ) {
+				// sql-server (using snapshot isolation) reports this as a grammar exception /:)
+				//
+				// not to mention that it seems to "lose track" of the transaction in this scenario...
+				t1.rollback();
+				t1 = s1.beginTransaction();
+			}
+			else {
+				throw t;
+			}
+		}
+
+		t1.commit();
+		s1.close();
+
+		// clean up
+		s1 = getSessions().openSession();
+		t1 = s1.beginTransaction();
+		s1.createQuery( "delete Item" ).executeUpdate();
+		t1.commit();
+		s1.close();
+	}
+
+
+	// non-versioned entity tests ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+	public void testStaleNonVersionedInstanceFoundInQueryResult() {
+		if ( getDialect().doesReadCommittedCauseWritersToBlockReaders()) {
+			reportSkip( "lock blocking", "stale versioned instance" );
+			return;
+		}
+		String check = "Lock Modes";
+		Session s1 = getSessions().openSession();
+		Transaction t1 = s1.beginTransaction();
+		Part part = new Part( new Item( "EJB3 Specification" ), check, "3.3.5.3", new BigDecimal( 0.0 ) );
+		s1.save( part );
+		t1.commit();
+		s1.close();
+
+		Long partId = part.getId();
+
+		// Now, open a new Session and re-load the part...
+		s1 = getSessions().openSession();
+		t1 = s1.beginTransaction();
+		part = ( Part ) s1.get( Part.class, partId );
+
+		// now that the item is associated with the persistence-context of that session,
+		// open a new session and modify it "behind the back" of the first session
+		Session s2 = getSessions().openSession();
+		Transaction t2 = s2.beginTransaction();
+		Part part2 = ( Part ) s2.get( Part.class, partId );
+		part2.setName( "Lock Mode Types" );
+		t2.commit();
+		s2.close();
+
+		// at this point, s1 now contains stale data, so try an hql query which
+		// returns said part and make sure we get the previously associated state
+		// (i.e., the old name)
+		part2 = ( Part ) s1.createQuery( "select p from Part p" ).list().get( 0 );
+		assertTrue( part == part2 );
+		assertEquals( "encountered non-repeatable read", check, part2.getName() );
+
+		t1.commit();
+		s1.close();
+
+		// clean up
+		s1 = getSessions().openSession();
+		t1 = s1.beginTransaction();
+		s1.delete( part2 );
+		s1.delete( part2.getItem() );
+		t1.commit();
+		s1.close();
+	}
+
+	public void testStaleNonVersionedInstanceFoundOnLock() {
+		if ( ! readCommittedIsolationMaintained( "repeatable read tests" ) ) {
+			return;
+		}
+		if ( getDialect().doesReadCommittedCauseWritersToBlockReaders()) {
+			reportSkip( "lock blocking", "stale versioned instance" );
+			return;
+		}
+		String check = "Lock Modes";
+		Session s1 = getSessions().openSession();
+		Transaction t1 = s1.beginTransaction();
+		Part part = new Part( new Item( "EJB3 Specification" ), check, "3.3.5.3", new BigDecimal( 0.0 ) );
+		s1.save( part );
+		t1.commit();
+		s1.close();
+
+		Long partId = part.getId();
+
+		// Now, open a new Session and re-load the part...
+		s1 = getSessions().openSession();
+		t1 = s1.beginTransaction();
+		part = ( Part ) s1.get( Part.class, partId );
+
+		// now that the item is associated with the persistence-context of that session,
+		// open a new session and modify it "behind the back" of the first session
+		Session s2 = getSessions().openSession();
+		Transaction t2 = s2.beginTransaction();
+		Part part2 = ( Part ) s2.get( Part.class, partId );
+		part2.setName( "Lock Mode Types" );
+		t2.commit();
+		s2.close();
+
+		// at this point, s1 now contains stale data, so acquire a READ lock
+		// and make sure we get the already associated state (i.e., the old
+		// name and the old version)
+		s1.lock( part, LockMode.READ );
+		part2 = ( Part ) s1.get( Part.class, partId );
+		assertTrue( part == part2 );
+		assertEquals( "encountered non-repeatable read", check, part2.getName() );
+
+		// then acquire an UPGRADE lock; this should fail
+		try {
+			s1.lock( part, LockMode.UPGRADE );
+		}
+		catch( Throwable t ) {
+			// SQLServer, for example, immediately throws an exception here...
+			t1.rollback();
+			t1 = s1.beginTransaction();
+		}
+		part2 = ( Part ) s1.get( Part.class, partId );
+		assertTrue( part == part2 );
+		assertEquals( "encountered non-repeatable read", check, part2.getName() );
+
+		t1.commit();
+		s1.close();
+
+		// clean up
+		s1 = getSessions().openSession();
+		t1 = s1.beginTransaction();
+		s1.delete( part );
+		s1.delete( part.getItem() );
+		t1.commit();
+		s1.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/lock/RepeatableReadTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/package.html
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/package.html	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/package.html	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,9 @@
+<html>
+	<head></head>
+	<body>
+		<p>
+			Tests for any JPA-specific behavior for which we need to ensure
+			compliance.
+		</p>
+	</body>
+</html>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/package.html
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/proxy/JPAProxyTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/proxy/JPAProxyTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/proxy/JPAProxyTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,99 @@
+package org.hibernate.test.jpa.proxy;
+
+import junit.framework.AssertionFailedError;
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.jpa.AbstractJPATest;
+import org.hibernate.test.jpa.Item;
+
+/**
+ * Test relation between proxies and get()/load() processing
+ * and make sure the interactions match the ejb3 expectations
+ *
+ * @author Steve Ebersole
+ */
+public class JPAProxyTest extends AbstractJPATest {
+	public JPAProxyTest(String name) {
+		super( name );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( JPAProxyTest.class );
+	}
+
+	public void testEjb3ProxyUsage() {
+		Session s = openSession();
+		Transaction txn = s.beginTransaction();
+
+		Item item = ( Item ) s.load( Item.class, new Long(-1) );
+		assertFalse( Hibernate.isInitialized( item ) );
+		try {
+			Hibernate.initialize( item );
+			fail( "proxy access did not fail on non-existent proxy" );
+		}
+		catch ( EntityNotFoundException e ) {
+			// expected behavior
+		}
+		catch ( Throwable t ) {
+			fail( "unexpected exception type on non-existent proxy access : " + t );
+		}
+
+		s.clear();
+
+		Item item2 = ( Item ) s.load( Item.class, new Long(-1) );
+		assertFalse( Hibernate.isInitialized( item2 ) );
+		assertFalse( item == item2 );
+		try {
+			item2.getName();
+			fail( "proxy access did not fail on non-existent proxy" );
+		}
+		catch ( EntityNotFoundException e ) {
+			// expected behavior
+		}
+		catch ( Throwable t ) {
+			fail( "unexpected exception type on non-existent proxy access : " + t );
+		}
+
+		txn.commit();
+		s.close();
+	}
+
+	/**
+	 * The ejb3 find() method maps to the Hibernate get() method
+	 */
+	public void testGetSemantics() {
+		Long nonExistentId = new Long( -1 );
+		Session s = openSession();
+		Transaction txn = s.beginTransaction();
+		Item item = ( Item ) s.get( Item.class, nonExistentId );
+		assertNull( "get() of non-existent entity did not return null", item );
+		txn.commit();
+		s.close();
+
+		s = openSession();
+		txn = s.beginTransaction();
+		// first load() it to generate a proxy...
+		item = ( Item ) s.load( Item.class, nonExistentId );
+		assertFalse( Hibernate.isInitialized( item ) );
+		// then try to get() it to make sure we get an exception
+		try {
+			s.get( Item.class, nonExistentId );
+			fail( "force load did not fail on non-existent entity" );
+		}
+		catch ( EntityNotFoundException e ) {
+			// expected behavior
+		}
+		catch( AssertionFailedError e ) {
+			throw e;
+		}
+		catch ( Throwable t ) {
+			fail( "unexpected exception type on non-existent entity force load : " + t );
+		}
+		txn.commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/proxy/JPAProxyTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/ql/JPAQLComplianceTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/ql/JPAQLComplianceTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/ql/JPAQLComplianceTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,55 @@
+package org.hibernate.test.jpa.ql;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.jpa.AbstractJPATest;
+
+/**
+ * Tests for various JPAQL compliance issues
+ *
+ * @author Steve Ebersole
+ */
+public class JPAQLComplianceTest extends AbstractJPATest {
+	public JPAQLComplianceTest(String name) {
+		super( name );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( JPAQLComplianceTest.class );
+	}
+
+	public void testAliasNameSameAsUnqualifiedEntityName() {
+		Session s = openSession();
+		s.beginTransaction();
+		s.createQuery( "select item from Item item" ).list();
+		s.createQuery( "select item from Item item where item.name = 'a'" ).list();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testIdentifierCaseSensitive() throws Exception {
+		Session s = openSession( );
+		// a control test (a user reported that the JPA 'case insensitivity' support
+		// caused problems with the "discriminator resolution" code; unable to reproduce)...
+		s.createQuery( "from MyEntity e where e.class = MySubclassEntity" );
+		s.createQuery( "from MyEntity e where e.other.class = MySubclassEntity" );
+		s.createQuery( "from MyEntity where other.class = MySubclassEntity" );
+
+		s.createQuery( "select object(I) from Item i").list();
+		s.close();
+	}
+
+	public void testIdentifierCasesensitivityAndDuplicateFromElements() throws Exception {
+		Session s = openSession();
+		s.createQuery( "select e from MyEntity e where exists (select 1 from MyEntity e2 where e2.other.name  = 'something' and e2.other.other = e)" );
+		s.close();
+	}
+
+	public void testGeneratedSubquery() {
+		Session s = openSession();
+		s.createQuery( "select c FROM Item c WHERE c.parts IS EMPTY" ).list();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/ql/JPAQLComplianceTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/ql/NativeQueryTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/ql/NativeQueryTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/ql/NativeQueryTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,30 @@
+package org.hibernate.test.jpa.ql;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.jpa.AbstractJPATest;
+
+/**
+ * todo: describe NativeQueryTest
+ *
+ * @author Steve Ebersole
+ */
+public class NativeQueryTest extends AbstractJPATest {
+	public NativeQueryTest(String name) {
+		super( name );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( NativeQueryTest.class );
+	}
+
+	public void testJpaStylePositionalParametersInNativeSql() {
+		Session s = openSession();
+		s.beginTransaction();
+		s.createSQLQuery( "select NAME from EJB3_ITEM where ITEM_ID = ?1" ).setParameter( "1", new Long( 123 ) ).list();
+		s.getTransaction().commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/ql/NativeQueryTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/removed/RemovedEntityTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/removed/RemovedEntityTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/removed/RemovedEntityTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,62 @@
+package org.hibernate.test.jpa.removed;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.jpa.AbstractJPATest;
+import org.hibernate.test.jpa.Item;
+
+/**
+ *
+ * @author Steve Ebersole
+ */
+public class RemovedEntityTest extends AbstractJPATest {
+	public RemovedEntityTest(String name) {
+		super( name );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( RemovedEntityTest.class );
+	}
+
+	public void testRemoveThenContains() {
+		Session s = openSession();
+		s.beginTransaction();
+		Item item = new Item();
+		item.setName( "dummy" );
+		s.persist( item );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.delete( item );
+		boolean contains = s.contains( item );
+		s.getTransaction().commit();
+		s.close();
+
+		assertFalse( "expecting removed entity to not be contained", contains );
+	}
+
+	public void testRemoveThenGet() {
+		Session s = openSession();
+		s.beginTransaction();
+		Item item = new Item();
+		item.setName( "dummy" );
+		s.persist( item );
+		s.getTransaction().commit();
+		s.close();
+
+		Long id = item.getId();
+
+		s = openSession();
+		s.beginTransaction();
+		s.delete( item );
+		item = ( Item ) s.get( Item.class, id );
+		s.getTransaction().commit();
+		s.close();
+
+		assertNull( "expecting removed entity to be returned as null from get()", item );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/jpa/removed/RemovedEntityTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/component/Customer.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/component/Customer.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/component/Customer.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,46 @@
+package org.hibernate.test.keymanytoone.bidir.component;
+
+import java.util.Collection;
+import java.util.ArrayList;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class Customer {
+	private Long id;
+	private String name;
+	private Collection orders = new ArrayList();
+
+	public Customer() {
+	}
+
+	public Customer(String name) {
+		this.name = name;
+	}
+
+	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 getOrders() {
+		return orders;
+	}
+
+	public void setOrders(Collection orders) {
+		this.orders = orders;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/component/Customer.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/component/EagerKeyManyToOneTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/component/EagerKeyManyToOneTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/component/EagerKeyManyToOneTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,157 @@
+package org.hibernate.test.keymanytoone.bidir.component;
+
+import junit.framework.Test;
+
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.event.LoadEvent;
+import org.hibernate.event.LoadEventListener;
+import org.hibernate.event.def.DefaultLoadEventListener;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Steve Ebersole
+ */
+public class EagerKeyManyToOneTest extends FunctionalTestCase {
+
+	public EagerKeyManyToOneTest(String name) {
+		super( name );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( EagerKeyManyToOneTest.class );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "keymanytoone/bidir/component/EagerMapping.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		super.configure( cfg );
+		cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
+		LoadEventListener[] baseListeners = cfg.getEventListeners().getLoadEventListeners();
+		int baseLength = baseListeners.length;
+		LoadEventListener[] expandedListeners = new LoadEventListener[ baseLength + 1 ];
+		expandedListeners[ 0 ] = new CustomLoadListener();
+		System.arraycopy( baseListeners, 0, expandedListeners, 1, baseLength );
+		cfg.getEventListeners().setLoadEventListeners( expandedListeners );
+	}
+
+	public void testSaveCascadedToKeyManyToOne() {
+		// test cascading a save to an association with a key-many-to-one which refers to a
+		// just saved entity
+		Session s = openSession();
+		s.beginTransaction();
+		Customer cust = new Customer( "Acme, Inc." );
+		Order order = new Order( new Order.Id( cust, 1 ) );
+		cust.getOrders().add( order );
+		s.save( cust );
+		s.flush();
+		assertEquals( 2, sfi().getStatistics().getEntityInsertCount() );
+		s.delete( cust );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testLoadingStrategies() {
+		Session s = openSession();
+		s.beginTransaction();
+		Customer cust = new Customer( "Acme, Inc." );
+		Order order = new Order( new Order.Id( cust, 1 ) );
+		cust.getOrders().add( order );
+		s.save( cust );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+
+// Here is an example of HHH-2277
+// essentially we have a bidirectional association where one side of the
+// association is actually part of a composite PK
+//
+// See #testLoadEntityWithEagerFetchingToKeyManyToOneReferenceBackToSelfFailureExpected() below...
+//
+// The way these are mapped causes the problem because both sides
+// are defined as eager which leads to the infinite loop; if only
+// one side is marked as eager, then all is ok...
+//		cust = ( Customer ) s.get( Customer.class, cust.getId() );
+//		assertEquals( 1, cust.getOrders().size() );
+//		s.clear();
+
+		cust = ( Customer ) s.createQuery( "from Customer" ).uniqueResult();
+		assertEquals( 1, cust.getOrders().size() );
+		s.clear();
+
+		cust = ( Customer ) s.createQuery( "from Customer c join fetch c.orders" ).uniqueResult();
+		assertEquals( 1, cust.getOrders().size() );
+		s.clear();
+
+		cust = ( Customer ) s.createQuery( "from Customer c join fetch c.orders as o join fetch o.id.customer" ).uniqueResult();
+		assertEquals( 1, cust.getOrders().size() );
+		s.clear();
+
+		cust = ( Customer ) s.createCriteria( Customer.class ).uniqueResult();
+		assertEquals( 1, cust.getOrders().size() );
+		s.clear();
+
+		s.delete( cust );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testLoadEntityWithEagerFetchingToKeyManyToOneReferenceBackToSelf() {
+		// long winded method name to say that this is a test specifically for HHH-2277 ;)
+		// essentially we have a bidirectional association where one side of the
+		// association is actually part of a composite PK.
+		//
+		// The way these are mapped causes the problem because both sides
+		// are defined as eager which leads to the infinite loop; if only
+		// one side is marked as eager, then all is ok.  In other words the
+		// problem arises when both pieces of instance data are coming from
+		// the same result set.  This is because no "entry" can be placed
+		// into the persistence context for the association with the
+		// composite key because we are in the process of trying to build
+		// the composite-id instance
+		Session s = openSession();
+		s.beginTransaction();
+		Customer cust = new Customer( "Acme, Inc." );
+		Order order = new Order( new Order.Id( cust, 1 ) );
+		cust.getOrders().add( order );
+		s.save( cust );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		try {
+			cust = ( Customer ) s.get( Customer.class, cust.getId() );
+		}
+		catch( OverflowCondition overflow ) {
+			fail( "get()/load() caused overflow condition" );
+		}
+		s.delete( cust );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	private static class OverflowCondition extends RuntimeException {
+	}
+
+	private static class CustomLoadListener extends DefaultLoadEventListener {
+		private int internalLoadCount = 0;
+		public void onLoad(LoadEvent event, LoadType loadType) throws HibernateException {
+			if ( LoadEventListener.INTERNAL_LOAD_EAGER.getName().equals( loadType.getName() ) ) {
+				internalLoadCount++;
+				if ( internalLoadCount > 10 ) {
+					throw new OverflowCondition();
+				}
+			}
+			super.onLoad( event, loadType );
+			internalLoadCount--;
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/component/EagerKeyManyToOneTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/component/EagerMapping.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/component/EagerMapping.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/component/EagerMapping.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,42 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+    This mapping demonstrates the use of composite ids with the
+    key-many-to-one feature.  Essentially a composite id where part
+    of the composition is a foreign-key to another entity.
+
+    Here, specifically, we map the key-many-to-one as a lazy
+    association.
+-->
+
+<hibernate-mapping package="org.hibernate.test.keymanytoone.bidir.component">
+
+    <class name="Customer" table="COMP_LAZY_KM2O_CUST">
+        <id name="id" column="ID" type="long">
+            <generator class="increment" />
+        </id>
+        <property name="name" column="NAME" type="string" />
+        <bag name="orders" inverse="true" cascade="all" lazy="false" fetch="join">
+            <key column="CUST_ID" />
+            <one-to-many class="Order" />
+        </bag>
+    </class>
+
+    <class name="Order" table="COMP_LAZY_KM2O_ORDR">
+        <composite-id name="id" class="Order$Id">
+            <key-many-to-one name="customer" class="Customer" column="CUST_ID" lazy="false"/>
+            <key-property name="number" column="ORDR_NUM" type="long" />
+        </composite-id>
+        <set name="items" table="COMP_LAZY_KM2O_ITEM">
+            <key>
+                <column name="CUST_ID"/>
+                <column name="ORDER_NUM"/>
+            </key>
+            <element type="string" column="ITEM_DESC" />
+        </set>
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/component/EagerMapping.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/component/LazyKeyManyToOneTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/component/LazyKeyManyToOneTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/component/LazyKeyManyToOneTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,105 @@
+package org.hibernate.test.keymanytoone.bidir.component;
+
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Steve Ebersole
+ */
+public class LazyKeyManyToOneTest extends FunctionalTestCase {
+	public LazyKeyManyToOneTest(String name) {
+		super( name );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( LazyKeyManyToOneTest.class );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "keymanytoone/bidir/component/LazyMapping.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		super.configure( cfg );
+		cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
+	}
+
+	public void testQueryingOnMany2One() {
+		Session s = openSession();
+		s.beginTransaction();
+		Customer cust = new Customer( "Acme, Inc." );
+		Order order = new Order( new Order.Id( cust, 1 ) );
+		cust.getOrders().add( order );
+		s.save( cust );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		List results = s.createQuery( "from Order o where o.id.customer.name = :name" )
+				.setParameter( "name", cust.getName() )
+				.list();
+		assertEquals( 1, results.size() );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.delete( cust );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testSaveCascadedToKeyManyToOne() {
+		// test cascading a save to an association with a key-many-to-one which refers to a
+		// just saved entity
+		Session s = openSession();
+		s.beginTransaction();
+		Customer cust = new Customer( "Acme, Inc." );
+		Order order = new Order( new Order.Id( cust, 1 ) );
+		cust.getOrders().add( order );
+		s.save( cust );
+		s.flush();
+		assertEquals( 2, sfi().getStatistics().getEntityInsertCount() );
+		s.delete( cust );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testLoadingStrategies() {
+		Session s = openSession();
+		s.beginTransaction();
+		Customer cust = new Customer( "Acme, Inc." );
+		Order order = new Order( new Order.Id( cust, 1 ) );
+		cust.getOrders().add( order );
+		s.save( cust );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+
+		cust = ( Customer ) s.get( Customer.class, cust.getId() );
+		assertEquals( 1, cust.getOrders().size() );
+		s.clear();
+
+		cust = ( Customer ) s.createQuery( "from Customer" ).uniqueResult();
+		assertEquals( 1, cust.getOrders().size() );
+		s.clear();
+
+		cust = ( Customer ) s.createQuery( "from Customer c join fetch c.orders" ).uniqueResult();
+		assertEquals( 1, cust.getOrders().size() );
+		s.clear();
+
+		s.delete( cust );
+		s.getTransaction().commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/component/LazyKeyManyToOneTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/component/LazyMapping.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/component/LazyMapping.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/component/LazyMapping.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,42 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+    This mapping demonstrates the use of composite ids with the
+    key-many-to-one feature.  Essentially a composite id where part
+    of the composition is a foreign-key to another entity.
+
+    Here, specifically, we map the key-many-to-one as a lazy
+    association.
+-->
+
+<hibernate-mapping package="org.hibernate.test.keymanytoone.bidir.component">
+
+    <class name="Customer" table="COMP_LAZY_KM2O_CUST">
+        <id name="id" column="ID" type="long">
+            <generator class="increment" />
+        </id>
+        <property name="name" column="NAME" type="string" />
+        <bag name="orders" inverse="true" cascade="all">
+            <key column="CUST_ID" />
+            <one-to-many class="Order" />
+        </bag>
+    </class>
+
+    <class name="Order" table="COMP_LAZY_KM2O_ORDR">
+        <composite-id name="id" class="Order$Id">
+            <key-many-to-one name="customer" class="Customer" column="CUST_ID" lazy="proxy"/>
+            <key-property name="number" column="ORDR_NUM" type="long" />
+        </composite-id>
+        <set name="items" table="COMP_LAZY_KM2O_ITEM">
+            <key>
+                <column name="CUST_ID"/>
+                <column name="ORDER_NUM"/>
+            </key>
+            <element type="string" column="ITEM_DESC" />
+        </set>
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/component/LazyMapping.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/component/Order.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/component/Order.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/component/Order.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,86 @@
+package org.hibernate.test.keymanytoone.bidir.component;
+
+import java.io.Serializable;
+import java.util.Set;
+import java.util.HashSet;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class Order {
+	private Id id;
+	private Set items = new HashSet();
+
+	public Order() {
+	}
+
+	public Order(Id id) {
+		this.id = id;
+	}
+
+	public Id getId() {
+		return id;
+	}
+
+	public void setId(Id id) {
+		this.id = id;
+	}
+
+	public Set getItems() {
+		return items;
+	}
+
+	public void setItems(Set items) {
+		this.items = items;
+	}
+
+	public static class Id implements Serializable {
+		private Customer customer;
+		private long number;
+
+		public Id() {
+		}
+
+		public Id(Customer customer, long number) {
+			this.customer = customer;
+			this.number = number;
+		}
+
+		public Customer getCustomer() {
+			return customer;
+		}
+
+		public void setCustomer(Customer customer) {
+			this.customer = customer;
+		}
+
+		public long getNumber() {
+			return number;
+		}
+
+		public void setNumber(long number) {
+			this.number = number;
+		}
+
+		public boolean equals(Object o) {
+			if ( this == o ) {
+				return true;
+			}
+			if ( o == null || getClass() != o.getClass() ) {
+				return false;
+			}
+
+			Id id = ( Id ) o;
+			return number == id.number && customer.equals( id.customer );
+		}
+
+		public int hashCode() {
+			int result;
+			result = customer.hashCode();
+			result = 31 * result + ( int ) ( number ^ ( number >>> 32 ) );
+			return result;
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/component/Order.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/embedded/Customer.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/embedded/Customer.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/embedded/Customer.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,46 @@
+package org.hibernate.test.keymanytoone.bidir.embedded;
+
+import java.util.Collection;
+import java.util.ArrayList;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class Customer {
+	private Long id;
+	private String name;
+	private Collection orders = new ArrayList();
+
+	public Customer() {
+	}
+
+	public Customer(String name) {
+		this.name = name;
+	}
+
+	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 getOrders() {
+		return orders;
+	}
+
+	public void setOrders(Collection orders) {
+		this.orders = orders;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/embedded/Customer.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/embedded/KeyManyToOneTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/embedded/KeyManyToOneTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/embedded/KeyManyToOneTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,105 @@
+package org.hibernate.test.keymanytoone.bidir.embedded;
+
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Steve Ebersole
+ */
+public class KeyManyToOneTest extends FunctionalTestCase {
+	public KeyManyToOneTest(String name) {
+		super( name );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( KeyManyToOneTest.class );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "keymanytoone/bidir/embedded/Mapping.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		super.configure( cfg );
+		cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
+	}
+
+	public void testSaveCascadedToKeyManyToOne() {
+		// test cascading a save to an association with a key-many-to-one which refers to a
+		// just saved entity
+		Session s = openSession();
+		s.beginTransaction();
+		Customer cust = new Customer( "Acme, Inc." );
+		Order order = new Order( cust, 1 );
+		cust.getOrders().add( order );
+		s.save( cust );
+		s.flush();
+		assertEquals( 2, sfi().getStatistics().getEntityInsertCount() );
+		s.delete( cust );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testQueryingOnMany2One() {
+		Session s = openSession();
+		s.beginTransaction();
+		Customer cust = new Customer( "Acme, Inc." );
+		Order order = new Order( cust, 1 );
+		cust.getOrders().add( order );
+		s.save( cust );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		List results = s.createQuery( "from Order o where o.customer.name = :name" )
+				.setParameter( "name", cust.getName() )
+				.list();
+		assertEquals( 1, results.size() );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.delete( cust );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testLoadingStrategies() {
+		Session s = openSession();
+		s.beginTransaction();
+		Customer cust = new Customer( "Acme, Inc." );
+		Order order = new Order( cust, 1 );
+		cust.getOrders().add( order );
+		s.save( cust );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+
+		cust = ( Customer ) s.get( Customer.class, cust.getId() );
+		assertEquals( 1, cust.getOrders().size() );
+		s.clear();
+
+		cust = ( Customer ) s.createQuery( "from Customer" ).uniqueResult();
+		assertEquals( 1, cust.getOrders().size() );
+		s.clear();
+
+		cust = ( Customer ) s.createQuery( "from Customer c join fetch c.orders" ).uniqueResult();
+		assertEquals( 1, cust.getOrders().size() );
+		s.clear();
+
+		s.delete( cust );
+		s.getTransaction().commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/embedded/KeyManyToOneTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/embedded/Mapping.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/embedded/Mapping.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/embedded/Mapping.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,39 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+    This mapping demonstrates the use of composite ids with the
+    key-many-to-one feature where the composite-id is an embedded form.
+    Essentially a composite id where part of the composition is a
+    foreign-key to another entity.
+-->
+
+<hibernate-mapping package="org.hibernate.test.keymanytoone.bidir.embedded">
+
+    <class name="Customer" table="EMBD_KM2O_CUST">
+        <id name="id" column="ID" type="long">
+            <generator class="increment" />
+        </id>
+        <property name="name" column="NAME" type="string" />
+        <bag name="orders" inverse="true" cascade="all">
+            <key column="CUST_ID" />
+            <one-to-many class="Order" />
+        </bag>
+    </class>
+
+    <class name="Order" table="EMBD_KM2O_ORDR">
+        <composite-id mapped="false">
+            <key-many-to-one name="customer" class="Customer" column="CUST_ID" lazy="false"/>
+            <key-property name="number" column="ORDR_NUM" type="long" />
+        </composite-id>
+        <set name="items" table="EMBD_KM2O_ITEM">
+            <key>
+                <column name="CUST_ID"/>
+                <column name="ORDER_NUM"/>
+            </key>
+            <element type="string" column="ITEM_DESC" />
+        </set>
+    </class>
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/embedded/Mapping.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/embedded/Order.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/embedded/Order.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/embedded/Order.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,48 @@
+package org.hibernate.test.keymanytoone.bidir.embedded;
+
+import java.util.Set;
+import java.util.HashSet;
+import java.io.Serializable;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class Order implements Serializable {
+	private Customer customer;
+	private long number;
+	private Set items = new HashSet();
+
+	public Order() {
+	}
+
+	public Order(Customer customer, long number) {
+		this.customer = customer;
+		this.number = number;
+	}
+
+	public Customer getCustomer() {
+		return customer;
+	}
+
+	public void setCustomer(Customer customer) {
+		this.customer = customer;
+	}
+
+	public long getNumber() {
+		return number;
+	}
+
+	public void setNumber(long number) {
+		this.number = number;
+	}
+
+	public Set getItems() {
+		return items;
+	}
+
+	public void setItems(Set items) {
+		this.items = items;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/keymanytoone/bidir/embedded/Order.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazycache/Document.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazycache/Document.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazycache/Document.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,100 @@
+//$Id: Document.java 7772 2005-08-05 23:03:46Z oneovthafew $
+package org.hibernate.test.lazycache;
+
+import java.util.Date;
+
+/**
+ * @author Gavin King
+ */
+public class Document {
+	
+	private Long id;
+	private String name;
+	private String upperCaseName;
+	private String summary;
+	private String text;
+	private Date lastTextModification;
+	
+	public Document(String name, String summary, String text) {
+		lastTextModification = new Date();
+		this.name = name;
+		upperCaseName = name.toUpperCase();
+		this.summary = summary;
+		this.text = text;
+	}
+	
+	Document() {}
+	
+	public Date getLastTextModification() {
+		return lastTextModification;
+	}
+
+	/**
+	 * @return Returns the id.
+	 */
+	public Long getId() {
+		return id;
+	}
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(Long id) {
+		this.id = id;
+	}
+	/**
+	 * @return Returns the name.
+	 */
+	public String getName() {
+		return name;
+	}
+	/**
+	 * @param name The name to set.
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+	/**
+	 * @return Returns the summary.
+	 */
+	public String getSummary() {
+		return summary;
+	}
+	/**
+	 * @param summary The summary to set.
+	 */
+	public void setSummary(String summary) {
+		this.summary = summary;
+	}
+	/**
+	 * @return Returns the text.
+	 */
+	public String getText() {
+		return text;
+	}
+	/**
+	 * @param text The text to set.
+	 */
+	private void setText(String text) {
+		this.text = text;
+	}
+	/**
+	 * @return Returns the upperCaseName.
+	 */
+	public String getUpperCaseName() {
+		return upperCaseName;
+	}
+	/**
+	 * @param upperCaseName The upperCaseName to set.
+	 */
+	public void setUpperCaseName(String upperCaseName) {
+		this.upperCaseName = upperCaseName;
+	}
+	
+	public void updateText(String newText) {
+		if ( !newText.equals(text) ) {
+			this.text = newText;
+			lastTextModification = new Date();
+		}
+	}
+	
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazycache/Document.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazycache/Documents.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazycache/Documents.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazycache/Documents.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+  This mapping demonstrates 
+
+     (1) use of lazy properties - this feature requires buildtime 
+         bytecode instrumentation; we don't think this is a very
+         necessary feature, but provide it for completeleness; if
+         Hibernate encounters uninstrumented classes, lazy property
+         fetching will be silently disabled, to enable testing
+     
+     (2) use of a formula to define a "derived property"
+     
+-->
+
+<hibernate-mapping 
+	package="org.hibernate.test.lazycache"
+	default-access="field">
+ 	
+	<class name="Document" table="documents">
+    	<cache usage="nonstrict-read-write" include="non-lazy" region="foo"/>
+   		<id name="id">
+    		<generator class="native"/>
+    	</id>
+    	<property name="name" not-null="true" length="50"/>
+    	<property name="upperCaseName" formula="upper(name)" lazy="true"/>
+    	<property name="summary" not-null="true" length="200" lazy="true"/>
+    	<property name="text" not-null="true" length="2000" lazy="true"/>
+    	<property name="lastTextModification" not-null="true" lazy="true" access="field"/>
+    </class>
+ 	
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazycache/Documents.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazycache/InstrumentCacheTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazycache/InstrumentCacheTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazycache/InstrumentCacheTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,139 @@
+//$Id: InstrumentCacheTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.lazycache;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.intercept.FieldInterceptionHelper;
+import org.hibernate.testing.junit.functional.DatabaseSpecificFunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class InstrumentCacheTest extends DatabaseSpecificFunctionalTestCase {
+
+	public InstrumentCacheTest(String str) {
+		super(str);
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( InstrumentCacheTest.class );
+	}
+
+	private boolean isRunnable() {
+		// skip this test if document is not instrumented/enhanced
+		return FieldInterceptionHelper.isInstrumented( new Document() );
+	}
+
+	public boolean appliesTo(Dialect dialect) {
+		return isRunnable();
+	}
+
+	public String[] getMappings() {
+		return new String[] { "lazycache/Documents.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setProperty(Environment.GENERATE_STATISTICS, "true");
+	}
+
+	public boolean overrideCacheStrategy() {
+		return false;
+	}
+
+	public void testInitFromCache() {
+		if ( !isRunnable() ) {
+			reportSkip( "classes not instrumented", "instrumentation tests" );
+			return;
+		}
+		Session s;
+		Transaction tx;
+
+		s = getSessions().openSession();
+		tx = s.beginTransaction();
+		s.persist( new Document("HiA", "Hibernate book", "Hibernate is....") );
+		tx.commit();
+		s.close();
+
+		s = getSessions().openSession();
+		tx = s.beginTransaction();
+		s.createQuery("from Document fetch all properties").uniqueResult();
+		tx.commit();
+		s.close();
+
+		getSessions().getStatistics().clear();
+
+		s = getSessions().openSession();
+		tx = s.beginTransaction();
+		Document d = (Document) s.createCriteria(Document.class).uniqueResult();
+		assertFalse( Hibernate.isPropertyInitialized(d, "text") );
+		assertFalse( Hibernate.isPropertyInitialized(d, "summary") );
+		assertEquals( "Hibernate is....", d.getText() );
+		assertTrue( Hibernate.isPropertyInitialized(d, "text") );
+		assertTrue( Hibernate.isPropertyInitialized(d, "summary") );
+		tx.commit();
+		s.close();
+
+		assertEquals( 2, getSessions().getStatistics().getPrepareStatementCount() );
+
+		s = getSessions().openSession();
+		tx = s.beginTransaction();
+		d = (Document) s.get(Document.class, d.getId());
+		assertFalse( Hibernate.isPropertyInitialized(d, "text") );
+		assertFalse( Hibernate.isPropertyInitialized(d, "summary") );
+		tx.commit();
+		s.close();
+	}
+
+	public void testInitFromCache2() {
+		if ( !isRunnable() ) {
+			reportSkip( "classes not instrumented", "instrumentation tests" );
+			return;
+		}
+		Session s;
+		Transaction tx;
+
+		s = getSessions().openSession();
+		tx = s.beginTransaction();
+		s.persist( new Document("HiA", "Hibernate book", "Hibernate is....") );
+		tx.commit();
+		s.close();
+
+		s = getSessions().openSession();
+		tx = s.beginTransaction();
+		s.createQuery("from Document fetch all properties").uniqueResult();
+		tx.commit();
+		s.close();
+
+		getSessions().getStatistics().clear();
+
+		s = getSessions().openSession();
+		tx = s.beginTransaction();
+		Document d = (Document) s.createCriteria(Document.class).uniqueResult();
+		assertFalse( Hibernate.isPropertyInitialized(d, "text") );
+		assertFalse( Hibernate.isPropertyInitialized(d, "summary") );
+		assertEquals( "Hibernate is....", d.getText() );
+		assertTrue( Hibernate.isPropertyInitialized(d, "text") );
+		assertTrue( Hibernate.isPropertyInitialized(d, "summary") );
+		tx.commit();
+		s.close();
+
+		assertEquals( 1, getSessions().getStatistics().getPrepareStatementCount() );
+
+		s = getSessions().openSession();
+		tx = s.beginTransaction();
+		d = (Document) s.get(Document.class, d.getId());
+		assertTrue( Hibernate.isPropertyInitialized(d, "text") );
+		assertTrue( Hibernate.isPropertyInitialized(d, "summary") );
+		tx.commit();
+		s.close();
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazycache/InstrumentCacheTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazyonetoone/Employee.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazyonetoone/Employee.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazyonetoone/Employee.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,38 @@
+//$Id: Employee.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.lazyonetoone;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+/**
+ * @author Gavin King
+ */
+public class Employee {
+	private String personName;
+	private Person person;
+	private Collection employments = new ArrayList(); 
+	Employee() {}
+	public Employee(Person p) {
+		this.person = p;
+		this.personName = p.getName();
+		p.setEmployee(this);
+	}
+	public Person getPerson() {
+		return person;
+	}
+	public void setPerson(Person person) {
+		this.person = person;
+	}
+	public String getPersonName() {
+		return personName;
+	}
+	public void setPersonName(String personName) {
+		this.personName = personName;
+	}
+	public Collection getEmployments() {
+		return employments;
+	}
+	public void setEmployments(Collection employments) {
+		this.employments = employments;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazyonetoone/Employee.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazyonetoone/Employment.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazyonetoone/Employment.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazyonetoone/Employment.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,46 @@
+//$Id: Employment.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.lazyonetoone;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author Gavin King
+ */
+public class Employment implements Serializable {
+	private String personName;
+	private String organizationName;
+	private Date startDate;
+	private Date endDate;
+	Employment() {}
+	public Employment(Employee e, String org) {
+		this.personName = e.getPersonName();
+		this.organizationName = org;
+		startDate = new Date();
+		e.getEmployments().add(this);
+	}
+	public String getOrganizationName() {
+		return organizationName;
+	}
+	public void setOrganizationName(String organizationName) {
+		this.organizationName = organizationName;
+	}
+	public String getPersonName() {
+		return personName;
+	}
+	public void setPersonName(String personName) {
+		this.personName = personName;
+	}
+	public Date getEndDate() {
+		return endDate;
+	}
+	public void setEndDate(Date endDate) {
+		this.endDate = endDate;
+	}
+	public Date getStartDate() {
+		return startDate;
+	}
+	public void setStartDate(Date startDate) {
+		this.startDate = startDate;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazyonetoone/Employment.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazyonetoone/LazyOneToOneTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazyonetoone/LazyOneToOneTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazyonetoone/LazyOneToOneTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,85 @@
+//$Id: LazyOneToOneTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.lazyonetoone;
+
+import java.util.Date;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.intercept.FieldInterceptionHelper;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class LazyOneToOneTest extends FunctionalTestCase {
+	
+	public LazyOneToOneTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "lazyonetoone/Person.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setProperty(Environment.MAX_FETCH_DEPTH, "2");
+		cfg.setProperty(Environment.USE_SECOND_LEVEL_CACHE, "false");
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( LazyOneToOneTest.class );
+	}
+
+	public static boolean isRunnable() {
+		return FieldInterceptionHelper.isInstrumented( new Person() );
+	}
+
+	public void testLazy() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Person p = new Person("Gavin");
+		Person p2 = new Person("Emmanuel");
+		Employee e = new Employee(p);
+		new Employment(e, "JBoss");
+		Employment old = new Employment(e, "IFA");
+		old.setEndDate( new Date() );
+		s.persist(p);
+		s.persist(p2);
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		p = (Person) s.createQuery("from Person where name='Gavin'").uniqueResult();
+		//assertFalse( Hibernate.isPropertyInitialized(p, "employee") );
+		assertSame( p.getEmployee().getPerson(), p );
+		assertTrue( Hibernate.isInitialized( p.getEmployee().getEmployments() ) );
+		assertEquals( p.getEmployee().getEmployments().size(), 1 );
+		p2 = (Person) s.createQuery("from Person where name='Emmanuel'").uniqueResult();
+		assertNull( p2.getEmployee() );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		p = (Person) s.get(Person.class, "Gavin");
+		//assertFalse( Hibernate.isPropertyInitialized(p, "employee") );
+		assertSame( p.getEmployee().getPerson(), p );
+		assertTrue( Hibernate.isInitialized( p.getEmployee().getEmployments() ) );
+		assertEquals( p.getEmployee().getEmployments().size(), 1 );
+		p2 = (Person) s.get(Person.class, "Emmanuel");
+		assertNull( p2.getEmployee() );
+		s.delete(p2);
+		s.delete(old);
+		s.delete(p);
+		t.commit();
+		s.close();
+	}
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazyonetoone/LazyOneToOneTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazyonetoone/Person.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazyonetoone/Person.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazyonetoone/Person.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.lazyonetoone">
+
+	<class name="Person">
+		<id name="name"/>
+		<one-to-one name="employee" lazy="no-proxy" cascade="persist,delete"/>
+	</class>
+	
+	<class name="Employee">
+		<id name="personName"/>
+		<one-to-one name="person" lazy="no-proxy"/>
+		<bag name="employments" 
+				inverse="true"
+				fetch="join" 
+				lazy="false"
+				where="endDate is null" 
+				cascade="persist,delete">
+			<key column="personName"/>
+			<one-to-many class="Employment"/>
+		</bag>
+	</class>
+	
+	<class name="Employment">
+		<composite-id>
+			<key-property name="personName"/>
+			<key-property name="organizationName"/>
+		</composite-id>
+		<property name="startDate" update="false"/>
+		<property name="endDate"/>
+	</class>
+	
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazyonetoone/Person.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazyonetoone/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazyonetoone/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazyonetoone/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,26 @@
+//$Id: Person.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.lazyonetoone;
+
+/**
+ * @author Gavin King
+ */
+public class Person {
+	private String name;
+	private Employee employee;
+	Person() {}
+	public Person(String name) {
+		this.name = name;
+	}
+	public Employee getEmployee() {
+		return employee;
+	}
+	public void setEmployee(Employee employee) {
+		this.employee = employee;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lazyonetoone/Person.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/A.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/A.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/A.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,55 @@
+package org.hibernate.test.legacy;
+
+
+public class A {
+	private Long id;
+	private String name;
+	private E forward;
+	
+	/**
+	 * Returns the id.
+	 * @return Long
+	 */
+	public Long getId() {
+		return id;
+	}
+	
+	/**
+	 * Returns the name.
+	 * @return String
+	 */
+	public String getName() {
+		return name;
+	}
+	
+	/**
+	 * Sets the id.
+	 * @param id The id to set
+	 */
+	public void setId(Long id) {
+		this.id = id;
+	}
+	
+	/**
+	 * Sets the name.
+	 * @param name The name to set
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	public E getForward() {
+		return forward;
+	}
+
+	public void setForward(E e) {
+		forward = e;
+	}
+
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/A.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ABC.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ABC.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ABC.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,55 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-lazy="false">
+
+	<class name="org.hibernate.test.legacy.A" discriminator-value="0" lazy="true" table="TA">
+		<id name = "id" column="identifier_column" unsaved-value = "null">
+			<generator class="increment"/>
+		</id>
+		<discriminator column="clazz_discriminata" type="integer" not-null="false"/>
+
+		<property name="name" index="indx_a_name">
+			<column name="name" index="indx_a_name2"/>
+		</property>
+
+		<subclass name="org.hibernate.test.legacy.B" discriminator-value="-1" lazy="true">
+			<property name="count" column="count_"/>
+			<join fetch="select" table="B2">
+				<key column="bid"/>
+				<property name="BName" not-null="true"/>
+			</join>
+			<subclass name="org.hibernate.test.legacy.C1" discriminator-value="null" lazy="true">
+				<property name="address" column="c1"/>
+				<one-to-one name="d"/>
+				<join table="cmore" fetch="select">
+					<key column="c1" on-delete="cascade"/>
+					<property name="C1Name"/>
+				</join>
+			</subclass>
+		</subclass>
+	</class>
+
+	<class name="org.hibernate.test.legacy.D" discriminator-value="0" proxy="org.hibernate.test.legacy.D" table="TD">
+		<id name = "id" unsaved-value = "null">
+			<generator class="assigned"/>
+		</id>
+		<property name="amount"/>
+		<many-to-one name="reverse" insert="false" update="false" outer-join="true">
+			<formula>(id)</formula>
+		</many-to-one>
+		<many-to-one name="inverse" access="field" insert="false" update="false" formula = "(id)" outer-join="true"/>
+		<!--many-to-one name="reverse" formula = "(select a.id from TA a where a.id = id)"/-->
+	</class>
+	
+	<sql-query name="propertyResultDiscriminator">
+		<return alias="a" class="org.hibernate.test.legacy.A">
+  			<return-discriminator column="clazz"/>
+			<return-property name="id" column="identifier_column"/>
+			<return-property name="name" column="name"/>
+			<return-property name="count" column="count_"/>
+		</return>
+		select identifier_column, clazz_discriminata as clazz, name, count_ from TA s
+	</sql-query>
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ABC.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ABCExtends.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ABCExtends.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ABCExtends.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-lazy="false">
+
+	<subclass name="org.hibernate.test.legacy.C2" discriminator-value="2" extends="org.hibernate.test.legacy.B" lazy="true">
+		<property name="address" column="c2"/>
+		<join table="c2more" fetch="select">
+			<key column="c2"/>
+			<property name="C2Name"/>
+		</join>
+	</subclass>
+
+	
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ABCExtends.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ABCProxy.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ABCProxy.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ABCProxy.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,62 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-lazy="false">
+
+	<class name="org.hibernate.test.legacy.A" discriminator-value="0" lazy="true" table="AP">
+		<id name="id" column="identifier_column" unsaved-value = "null">
+			<generator class="increment"/>
+		</id>
+		<discriminator column="clazz_discriminata" type="integer" force="true" not-null="false"/>
+		<property name="name"/>
+		<many-to-one name="forward" class="org.hibernate.test.legacy.E" cascade="save-update" />
+		<subclass name="org.hibernate.test.legacy.B" discriminator-value="null" lazy="true">
+			<property name="count" column="count_"/>
+
+			<map name="map" table="`map`">
+				<key column="BID"/>
+				<index column="MAPKEY" type="string"/>
+				<element column="MAPVAL" type="int"/>
+			</map>
+
+			<subclass name="org.hibernate.test.legacy.C1" discriminator-value="1" lazy="true">
+				<property name="address" column="c1"/>
+				<one-to-one name="d"/>
+				<many-to-one name="c2" column="c" class="org.hibernate.test.legacy.C2"/>
+				<bag name="c2s" inverse="true" where="identifier_column is not null"> <!--where="clazz_discriminata=2"-->
+					<key column="c"/>
+					<one-to-many class="org.hibernate.test.legacy.C2"/>
+				</bag>
+			</subclass>
+			<subclass name="org.hibernate.test.legacy.C2" discriminator-value="2" lazy="true">
+				<property name="address" column="c2"/>
+				<many-to-one name="c1" column="c" class="org.hibernate.test.legacy.C1"/>
+				<bag name="c1s" inverse="true" > <!--where="clazz_discriminata=1"-->
+					<key column="c"/>
+					<one-to-many class="org.hibernate.test.legacy.C1"/>
+				</bag>
+			</subclass>
+		</subclass>
+	</class>
+
+	<class name="org.hibernate.test.legacy.D" discriminator-value="0" lazy="true" table="DP">
+		<id name = "id" unsaved-value = "null">
+			<generator class="assigned"/>
+		</id>
+		<property name="amount"/>
+	</class>
+	
+	<class name="org.hibernate.test.legacy.E" discriminator-value="0" lazy="true" table="EP">
+		<id name = "id" unsaved-value = "null">
+			<generator class="increment"/>
+		</id>
+		<property name="amount"/>
+		<one-to-one name="reverse" class="org.hibernate.test.legacy.A" property-ref="forward" cascade="save-update"/>
+		<set name="as" lazy="true">
+			<key column="e"/>
+			<one-to-many class="org.hibernate.test.legacy.A"/>
+		</set>
+	</class>
+	
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ABCProxy.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ABCProxyTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ABCProxyTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ABCProxyTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,304 @@
+//$Id: ABCProxyTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.Test;
+import junit.textui.TestRunner;
+
+import org.hibernate.Hibernate;
+import org.hibernate.LockMode;
+import org.hibernate.Transaction;
+import org.hibernate.classic.Session;
+import org.hibernate.dialect.HSQLDialect;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+
+public class ABCProxyTest extends LegacyTestCase {
+
+	public ABCProxyTest(String arg0) {
+		super(arg0);
+	}
+	
+	public void testDiscriminatorFiltering() throws Exception {
+		if ( ( getDialect() instanceof HSQLDialect ) ) return;
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.createQuery("from C1 c1 left join c1.c2s c2").list();
+		s.createCriteria(C1.class).createCriteria("c2s").list();
+		t.commit();
+		s.close();
+	}
+
+	public void testNarrow() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.createQuery("from E e join e.reverse as b where b.count=1").list();
+		s.createQuery("from E e join e.as as b where b.count=1").list();
+		t.commit();
+		s.close();
+	}
+
+	public void testSharedColumn() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		C1 c1 = new C1();
+		C2 c2 = new C2();
+		c1.setC2(c2);
+		c2.setC1(c1);
+		s.save(c1); s.save(c2);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		List list = s.createQuery( "from B" ).list();
+		assertTrue( list.size()==2 );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c1 = (C1) s.createQuery("from C1").uniqueResult();
+		c2 = (C2) s.createQuery("from C2").uniqueResult();
+		assertTrue( c1.getC2()==c2 );
+		assertTrue( c2.getC1()==c1 );
+		assertTrue( c1.getC2s().contains(c2) );
+		assertTrue( c2.getC1s().contains(c1) );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c1 = (C1) s.get( A.class, c1.getId() );
+		c2 = (C2) s.get( A.class, c2.getId() );
+		assertTrue( c1.getC2()==c2 );
+		assertTrue( c2.getC1()==c1 );
+		assertTrue( c1.getC2s().contains(c2) );
+		assertTrue( c2.getC1s().contains(c1) );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete(c1); s.delete(c2);
+		t.commit();
+		s.close();
+
+	}
+
+	public void testSubclassing() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		C1 c1 = new C1();
+		D d = new D();
+		d.setAmount(213.34f);
+		c1.setAddress("foo bar");
+		c1.setCount(23432);
+		c1.setName("c1");
+		c1.setD(d);
+		s.save(c1);
+		d.setId( c1.getId() );
+		s.save(d);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		A c1a = (A) s.load( A.class, c1.getId() );
+		assertFalse( Hibernate.isInitialized(c1a) );
+		assertTrue( c1a.getName().equals("c1") );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		B c1b = (B) s.load( B.class, c1.getId() );
+		assertTrue(
+			(c1b.getCount()==23432) &&
+			c1b.getName().equals("c1")
+		);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c1 = (C1) s.load( C1.class, c1.getId() );
+		assertTrue(
+			c1.getAddress().equals("foo bar") &&
+			(c1.getCount()==23432) &&
+			c1.getName().equals("c1") &&
+			c1.getD().getAmount()>213.3f
+		);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c1a = (A) s.load( A.class, c1.getId() );
+		assertTrue( c1a.getName().equals("c1") );
+		c1 = (C1) s.load( C1.class, c1.getId() );
+		assertTrue(
+			c1.getAddress().equals("foo bar") &&
+			(c1.getCount()==23432) &&
+			c1.getName().equals("c1") &&
+			c1.getD().getAmount()>213.3f
+		);
+		c1b = (B) s.load( B.class, c1.getId() );
+		assertTrue(
+			(c1b.getCount()==23432) &&
+			c1b.getName().equals("c1")
+		);
+		assertTrue( c1a.getName().equals("c1") );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c1a = (A) s.load( A.class, c1.getId() );
+		assertTrue( c1a.getName().equals("c1") );
+		c1 = (C1) s.load( C1.class, c1.getId(), LockMode.UPGRADE );
+		assertTrue(
+			c1.getAddress().equals("foo bar") &&
+			(c1.getCount()==23432) &&
+			c1.getName().equals("c1") &&
+			c1.getD().getAmount()>213.3f
+		);
+		c1b = (B) s.load( B.class, c1.getId(), LockMode.UPGRADE );
+		assertTrue(
+			(c1b.getCount()==23432) &&
+			c1b.getName().equals("c1")
+		);
+		assertTrue( c1a.getName().equals("c1") );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c1a = (A) s.load( A.class, c1.getId() );
+		c1 = (C1) s.load( C1.class, c1.getId() );
+		c1b = (B) s.load( B.class, c1.getId() );
+		assertTrue( c1a.getName().equals("c1") );
+		assertTrue(
+			c1.getAddress().equals("foo bar") &&
+			(c1.getCount()==23432) &&
+			c1.getName().equals("c1") &&
+			c1.getD().getAmount()>213.3f
+		);
+		assertTrue(
+			(c1b.getCount()==23432) &&
+			c1b.getName().equals("c1")
+		);
+		System.out.println( s.delete("from A") );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.save( new B() );
+		s.save( new A() );
+		assertTrue( s.createQuery( "from B" ).list().size()==1 );
+		assertTrue( s.createQuery( "from A" ).list().size()==2 );
+		s.delete("from A");
+		t.commit();
+		s.close();
+	}
+
+	public void testSubclassMap() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		B b = new B();
+		s.save(b);
+		Map map = new HashMap();
+		map.put("3", new Integer(1) );
+		b.setMap(map);
+		s.flush();
+		s.delete(b);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		map = new HashMap();
+		map.put("3", new Integer(1) );
+		b = new B();
+		b.setMap(map);
+		s.save(b);
+		s.flush();
+		s.delete(b);
+		t.commit();
+		s.close();
+	}
+
+	public void testOneToOne() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		A a = new A();
+		E d1 = new E();
+		C1 c = new C1();
+		E d2 = new E();
+		a.setForward(d1);
+		d1.setReverse(a);
+		c.setForward(d2);
+		d2.setReverse(c);
+		Serializable aid = s.save(a);
+		Serializable d2id = s.save(d2);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		List l = s.find( "from E e, A a where e.reverse = a.forward and a = ?", a, Hibernate.entity(A.class) );
+		assertTrue( l.size()==1 );
+		l = s.createQuery( "from E e join fetch e.reverse" ).list();
+		assertTrue( l.size()==2 );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		l = s.createQuery( "from E e" ).list();
+		assertTrue( l.size()==2 );
+		E e = (E) l.get(0);
+		assertTrue( e==e.getReverse().getForward() );
+		e = (E) l.get(1);
+		assertTrue( e==e.getReverse().getForward() );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		a = (A) s.load(A.class, aid);
+		d2 = (E) s.load(E.class, d2id);
+		assertTrue( a==a.getForward().getReverse() );
+		assertTrue( d2==d2.getReverse().getForward() );
+		s.delete(a);
+		s.delete( a.getForward() );
+		s.delete(d2);
+		s.delete( d2.getReverse() );
+		t.commit();
+
+		s = openSession();
+		t = s.beginTransaction();
+		l = s.createQuery( "from E e" ).list();
+		assertTrue( l.size()==0 );
+		t.commit();
+		s.close();
+	}
+
+	public String[] getMappings() {
+		return new String[] {  "legacy/ABCProxy.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( ABCProxyTest.class );
+	}
+
+	public static void main(String[] args) throws Exception {
+		TestRunner.run( suite() );
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ABCProxyTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ABCTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ABCTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ABCTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,164 @@
+//$Id: ABCTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.legacy;
+
+import java.util.List;
+
+import junit.framework.Test;
+import junit.textui.TestRunner;
+import org.hibernate.classic.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+
+public class ABCTest extends LegacyTestCase {
+
+	public ABCTest(String arg0) {
+		super(arg0);
+	}
+	
+	public void testFormulaAssociation() throws Throwable {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		D d = new D();
+		Long did = new Long(12);
+		s.save(d, did);
+		A a = new A();
+		a.setName("a");
+		s.save(a, did);
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		d = (D) s.get(D.class, did);
+		assertTrue(d.getReverse().getId().equals(did));
+		s.clear();
+		getSessions().evict(D.class);
+		getSessions().evict(A.class);
+		d = (D) s.get(D.class, did);
+		assertTrue(d.inverse.getId().equals(did));
+		assertTrue(d.inverse.getName().equals("a"));
+		s.clear();
+		getSessions().evict(D.class);
+		getSessions().evict(A.class);
+		assertTrue( s.createQuery( "from D d join d.reverse r join d.inverse i where i = r" ).list().size()==1 );
+		t.commit();
+		s.close();
+	}
+
+	public void testHigherLevelIndexDefinition() throws Throwable {
+		String[] commands = getCfg().generateSchemaCreationScript( getDialect() );
+		int max = commands.length;
+		boolean found = false;
+		for (int indx = 0; indx < max; indx++) {
+			System.out.println("Checking command : " + commands[indx]);
+			found = commands[indx].indexOf("create index indx_a_name") >= 0;
+			if (found)
+				break;
+		}
+		assertTrue("Unable to locate indx_a_name index creation", found);
+	}
+
+	public void testSubclassing() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		C1 c1 = new C1();
+		D d = new D();
+		d.setAmount(213.34f);
+		c1.setAddress("foo bar");
+		c1.setCount(23432);
+		c1.setName("c1");
+		c1.setBName("a funny name");
+		c1.setD(d);
+		s.save(c1);
+		d.setId( c1.getId() );
+		s.save(d);
+
+		assertTrue( s.createQuery( "from C2 c where 1=1 or 1=1" ).list().size()==0 );
+
+		t.commit();
+		s.close();
+
+		getSessions().evict(A.class);
+		
+		s = openSession();
+		t = s.beginTransaction();
+		c1 = (C1) s.get( A.class, c1.getId() );
+		assertTrue(
+			c1.getAddress().equals("foo bar") &&
+			(c1.getCount()==23432) &&
+			c1.getName().equals("c1") &&
+			c1.getD().getAmount()>213.3f
+		);
+		assertEquals( "a funny name", c1.getBName() );
+		t.commit();
+		s.close();
+		
+		getSessions().evict(A.class);
+
+		s = openSession();
+		t = s.beginTransaction();
+		c1 = (C1) s.get( B.class, c1.getId() );
+		assertTrue(
+			c1.getAddress().equals("foo bar") &&
+			(c1.getCount()==23432) &&
+			c1.getName().equals("c1") &&
+			c1.getD().getAmount()>213.3f
+		);
+		assertEquals( "a funny name", c1.getBName() );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c1 = (C1) s.load( C1.class, c1.getId() );
+		assertTrue(
+			c1.getAddress().equals("foo bar") &&
+			(c1.getCount()==23432) &&
+			c1.getName().equals("c1") &&
+			c1.getD().getAmount()>213.3f
+		);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		List bs = s.createQuery("from B").list();
+		for (int i=0; i<bs.size(); i++) {
+			C1 b = (C1) bs.get(i);
+			s.delete(b);
+			s.delete( b.getD() );
+		}
+		t.commit();
+		s.close();
+	}
+	
+	public void testGetSave() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		assertNull( s.get( D.class, new Long(1) ) );
+		D d = new D();
+		d.setId( new Long(1) );
+		s.save(d);
+		s.flush();
+		assertNotNull( s.get( D.class, new Long(1) ) );
+		s.delete(d);
+		s.flush();
+		t.commit();
+		s.close();
+	}
+
+	public String[] getMappings() {
+		return new String[] { "legacy/ABC.hbm.xml", "legacy/ABCExtends.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( ABCTest.class );
+	}
+
+	public static void main(String[] args) throws Exception {
+		TestRunner.run( suite() );
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ABCTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Abstract.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Abstract.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Abstract.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,33 @@
+//$Id: Abstract.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.util.Set;
+
+public abstract class Abstract extends Foo implements AbstractProxy {
+	
+	private java.sql.Time time;
+	private Set abstracts;
+	
+	public java.sql.Time getTime() {
+		return time;
+	}
+	
+	public void setTime(java.sql.Time time) {
+		this.time = time;
+	}
+	
+	public Set getAbstracts() {
+		return abstracts;
+	}
+	
+	public void setAbstracts(Set abstracts) {
+		this.abstracts = abstracts;
+	}
+	
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Abstract.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/AbstractProxy.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/AbstractProxy.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/AbstractProxy.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,13 @@
+package org.hibernate.test.legacy;
+
+public interface AbstractProxy extends FooProxy {
+	public void setAbstracts(java.util.Set arg0);
+	public java.util.Set getAbstracts();
+	public void setTime(java.sql.Time arg0);
+	public java.sql.Time getTime();
+}
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/AbstractProxy.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/AltSimple.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/AltSimple.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/AltSimple.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-lazy="false">
+
+    <class name="org.hibernate.test.legacy.Simple" table="SIMP">
+        <id type="long" column="id_">
+            <generator class="assigned"/>
+        </id>
+        <property name="name"/>
+        <property name="address"/>
+        <property name="count" column="count_" not-null="true" unique="true"/> 
+        <property name="date" column="date_"/>
+        <property name="pay"/>
+        <many-to-one name="other"/>
+    </class>
+    
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/AltSimple.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Assignable.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Assignable.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Assignable.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,28 @@
+package org.hibernate.test.legacy;
+
+import java.util.Collection;
+
+/**
+ * @author Administrator
+ */
+public class Assignable {
+	private String id;
+	private Collection categories;
+
+	public Collection getCategories() {
+		return categories;
+	}
+
+	public String getId() {
+		return id;
+	}
+
+	public void setCategories(Collection collection) {
+		categories = collection;
+	}
+
+	public void setId(String string) {
+		id = string;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Assignable.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/B.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/B.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/B.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,40 @@
+package org.hibernate.test.legacy;
+
+import java.util.Map;
+
+
+public class B extends A {
+	private int count;
+	private Map map;
+	private String bName = "B Name";
+	
+	public int getCount() {
+		return count;
+	}
+	
+	public void setCount(int count) {
+		this.count = count;
+	}
+	
+	public Map getMap() {
+		return map;
+	}
+
+	public void setMap(Map map) {
+		this.map = map;
+	}
+
+	public String getBName() {
+		return bName;
+	}
+
+	public void setBName(String name) {
+		bName = name;
+	}
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/B.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Bar.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Bar.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Bar.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,67 @@
+//$Id: Bar.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+public class Bar extends Abstract implements BarProxy, Named {
+	private String barString;
+	private FooComponent barComponent = new FooComponent("bar", 69, null, null);
+	private Baz baz;
+	private int x;
+	private Object object;
+	
+	public int getX() {
+		return x;
+	}
+	public void setX(int x) {
+		this.x = x;
+	}
+
+	public String getBarString() {
+		return barString;
+	}
+	
+	void setBarString(String barString) {
+		this.barString = barString;
+	}
+	
+	public FooComponent getBarComponent() {
+		return barComponent;
+	}
+	
+	public void setBarComponent(FooComponent barComponent) {
+		this.barComponent = barComponent;
+	}
+	
+	public Baz getBaz() {
+		return baz;
+	}
+	
+	public void setBaz(Baz baz) {
+		this.baz = baz;
+	}
+	
+	private String name = "bar";
+	
+	public String getName() {
+		return name;
+	}
+	
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Object getObject() {
+		return object;
+	}
+
+	public void setObject(Object object) {
+		this.object = object;
+	}
+
+}
+
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Bar.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/BarProxy.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/BarProxy.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/BarProxy.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,18 @@
+//$Id: BarProxy.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+public interface BarProxy extends AbstractProxy {
+	public void setBaz(Baz arg0);
+	public Baz getBaz();
+	public void setBarComponent(FooComponent arg0);
+	public FooComponent getBarComponent();
+	//public void setBarString(String arg0);
+	public String getBarString();
+	public Object getObject();
+	public void setObject(Object o);
+}
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/BarProxy.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/BasicNameable.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/BasicNameable.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/BasicNameable.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,48 @@
+//$Id: BasicNameable.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+/**
+ * @author administrator
+ *
+ *
+ */
+public class BasicNameable implements Nameable {
+	
+	private String name;
+	private Long id;
+	
+	/**
+	 * @see Nameable#getName()
+	 */
+	public String getName() {
+		return name;
+	}
+	
+	/**
+	 * @see Nameable#setName()
+	 */
+	public void setName(String n) {
+		name = n;
+	}
+	
+	/**
+	 * @see Nameable#getKey()
+	 */
+	public Long getKey() {
+		return id;
+	}
+	
+	/**
+	 * @see Nameable#setKey()
+	 */
+	public void setKey(Long k) {
+		id = k;
+	}
+	
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/BasicNameable.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Baz.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Baz.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Baz.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,292 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-lazy="false">
+
+	<class name="org.hibernate.test.legacy.Baz" 
+		table="baz" 
+		check="count_count > -666">
+		<id name="code" type="string">
+			<column name="baz_id_column_" length="32"/>
+			<generator class="uuid.hex"/>
+		</id>
+		<property name="count" column="count_count"/>
+		<property name="name" column="name_b"/>
+		<!--property name="text" type="text" column="text_"/-->
+		<many-to-one name="foo" outer-join="true" class="org.hibernate.test.legacy.Foo"/>
+
+		<list name="stringList" table="string_list" batch-size="12">
+			<key>
+				<column name="id" length="16"/>
+			</key>
+			<index column="`i`"/>
+			<element column="element" type="string"/>
+		</list>
+		<primitive-array name="intArray" table="int_array">
+			<key>
+				<column name="id" length="16"/>
+			</key>
+			<index column="i"/>
+			<element column="j" type="int"/>
+		</primitive-array>
+		<set name="fooSet" lazy="true" order-by="string_" batch-size="12">
+			<key>
+				<column name="baz_id" length="16"/>
+			</key>
+			<one-to-many class="org.hibernate.test.legacy.Foo"/>
+		</set>
+		<array name="components" table="bazcomponents">
+			<key>
+				<column name="baz_id" length="16"/>
+			</key>
+			<index column="i"/>
+			<composite-element class="org.hibernate.test.legacy.FooComponent">
+				<parent name="baz"/>
+				<property name="name">
+					<column name="name" length="56"/>
+				</property>
+				<property name="count" column="count_"/>
+				<nested-composite-element name="subcomponent" class="org.hibernate.test.legacy.FooComponent">
+					<property name="name" column="x_"/>
+					<property name="count" column="y_"/>
+				</nested-composite-element>
+			</composite-element>
+		</array>
+		<array name="timeArray">
+			<key>
+				<column name="baz_id" length="16"/>
+			</key>
+			<index column="j"/>
+			<element column="the_time" type="time"/>
+		</array>
+		<bag name="bag" order-by="`name_`" table="`bxaxg`">
+			<key>
+				<column name="`baz_id_`" length="16"/>
+			</key>
+			<element column="`name_`" type="string"/>
+		</bag>
+		<map name="fooToGlarch" lazy="false">
+			<key>
+				<column name="baz_id" length="16"/>
+			</key>
+			<index-many-to-many column="foo_id" class="org.hibernate.test.legacy.Foo"/>
+			<many-to-many column="glarch_id" class="org.hibernate.test.legacy.Glarch"/>
+		</map>
+		<map name="fooComponentToFoo">
+			<!--cache-->
+			<key>
+				<column name="baz_id" length="16"/>
+			</key>
+			<composite-index class="org.hibernate.test.legacy.FooComponent">
+				<key-property name="name" length="32"/>
+				<key-property name="count" column="count_"/>
+			</composite-index>
+			<many-to-many column="foo_id" class="org.hibernate.test.legacy.Foo" outer-join="true"/>
+		</map>
+		<map name="glarchToFoo">
+			<key>
+				<column name="gtf_baz_id" length="16"/>
+			</key>
+			<index-many-to-many column="gtf_foo_id" class="org.hibernate.test.legacy.Foo"/>
+			<one-to-many class="org.hibernate.test.legacy.Glarch"/>
+		</map>
+		
+		<set name="stringSet" lazy="true" sort="org.hibernate.test.legacy.StringComparator" batch-size="12">
+			<!--<cache usage="read-write"/>-->
+			<key column="id_"/>
+			<element column="element" type="string" not-null="true" length="32"/>
+		</set>
+	
+		<map name="stringDateMap" lazy="true" sort="org.hibernate.test.legacy.ReverseComparator">
+			<key column="id_"/>
+			<index column="map_key" type="string" length="32"/>
+			<element column="map_value" type="date"/>
+		</map>
+	
+		<array name="fooArray" element-class="org.hibernate.test.legacy.FooProxy" where="i&lt;8" check="i>=0">
+			<!--cache-->
+			<key column="id_"/>
+			<index column="i"/>
+			<many-to-many class="org.hibernate.test.legacy.Foo" fetch="select">
+				<column name="foo" length="36"/>
+			</many-to-many>
+		</array>
+	
+		<bag name="fooBag" lazy="true" table="baz_foo" cascade="all-delete-orphan" inverse="false">
+			<key column="baz"/>
+			<many-to-many class="org.hibernate.test.legacy.Foo" column="foo" outer-join="true"/>
+		</bag>
+	
+		<idbag name="idFooBag" lazy="true" table="baz_id_foo" cascade="all">
+			<collection-id column="pkid" type="long"> 
+				<generator class="hilo"/>
+			</collection-id>
+			<key column="baz"/>
+			<many-to-many class="org.hibernate.test.legacy.Foo" column="foo" outer-join="true"/>
+		</idbag>
+	
+		<idbag name="byteBag" lazy="true" table="baz_byte_bag">
+			<collection-id column="pkid" type="long"> 
+				<generator class="hilo"/>
+			</collection-id>
+			<key column="baz"/>
+			<element type="binary" column="bytez" not-null="true"/>
+		</idbag>
+	
+		<array name="stringArray">
+			<key column="id_"/>
+			<index column="i"/>
+			<element column="name" type="string"/>
+		</array>
+		
+		<list name="fees" lazy="true" cascade="all" check="bazind is null or (bazind>=0 and bazind&lt;10)">
+			<key column="bazid"/>
+			<index column="bazind"/>
+			<one-to-many class="org.hibernate.test.legacy.Fee"/>
+		</list>
+		
+		<list name="customs">
+			<key column="id_"/>
+			<index column="indx"/>
+			<element type="org.hibernate.test.legacy.DoubleStringType">
+				<column name="first_"/>
+				<column name="second_"/>
+			</element>
+		</list>
+	
+		<list name="topComponents" table="topcomponents">
+			<!--cache-->
+			<key column="id_"/>
+			<index column="i"/>
+			<composite-element class="org.hibernate.test.legacy.FooComponent">
+				<property name="name"/>
+				<property name="count" column="count_"/>
+			</composite-element>
+		</list>
+		
+		<set name="topFoos">
+			<key column="idtopbar" />
+			<one-to-many class = "org.hibernate.test.legacy.Bar"/>
+		</set>
+	
+		<set name="cascadingBars" cascade="all-delete-orphan">
+			<key column="idofbaz" />
+			<one-to-many class = "org.hibernate.test.legacy.Bar"/>
+		</set>
+	
+		<map name="topGlarchez" outer-join="true">
+			<key column="idtopglarch" />
+			<index type="character">
+				<column name="mapkey" sql-type="char(1)"/>
+			</index>
+			<one-to-many class = "org.hibernate.test.legacy.Glarch"/>
+		</map>
+		
+		<set name="cached" sort="natural" table="cached_set">
+			<!--cache-->
+			<key column="baz"/>
+			<composite-element class="org.hibernate.test.legacy.CompositeElement">
+				<property name="foo" not-null="true"/>
+				<property name="bar" not-null="true"/>
+			</composite-element>
+		</set>
+	
+		<map name="cachedMap" sort="natural" table="cached_map">
+			<!--cache-->
+			<key column="baz"/>
+			<index-many-to-many column="another_baz" class="org.hibernate.test.legacy.Baz"/>
+			<composite-element class="org.hibernate.test.legacy.CompositeElement">
+				<property name="foo"/>
+				<property name="bar"/>
+			</composite-element>
+		</map>
+		
+		<map name="stringGlarchMap" where="baz_map_index &gt; 'a' and tha_key is not null" cascade="all">
+			<key column="baz_map_id"/>
+			<index column="baz_map_index" type="string"/>
+			<one-to-many class="org.hibernate.test.legacy.Glarch"/>
+		</map>
+		
+		<map name="anyToAny" lazy="true">
+			<key column="baz"/>
+			<index-many-to-any id-type="long">
+				<column name="ind_clazz_"/>
+				<column name="ind_id_"/>
+			</index-many-to-any>
+			<many-to-any id-type="long">
+				<column name="el_clazz_"/>
+				<column name="el_id_"/>
+			</many-to-any>
+		</map>
+		
+		<list name="manyToAny" lazy="true">
+			<key column="baz"/>
+			<index column="ind"/>
+			<many-to-any id-type="string">
+				<column name="el_clazz_"/>
+				<column name="el_id_"/>
+			</many-to-any>
+		</list>
+		
+		<bag name="bazez" lazy="true" order-by="name_b desc" cascade="all">
+			<key column="`baz-id`"/>
+			<one-to-many class="org.hibernate.test.legacy.Baz"/>
+		</bag>
+		
+		<set name="sortablez" sort="natural" cascade="all">
+			<key column="baz"/>
+			<one-to-many class="org.hibernate.test.legacy.Sortable"/>
+		</set>
+		
+		<bag name="parts" lazy="true" cascade="save-update">
+			<key column="baz"/>
+			<one-to-many class="org.hibernate.test.legacy.Part"/>
+		</bag>
+		
+		<bag name="moreParts" lazy="true" cascade="save-update">
+			<key column="baz"/>
+			<many-to-many column="part" class="org.hibernate.test.legacy.Part"/>
+		</bag>
+		
+		<bag name="subs" inverse="true" cascade="all" access="field">
+			<key column="superBaz" on-delete="cascade"/>
+			<one-to-many class="org.hibernate.test.legacy.Baz"/>
+		</bag>
+		
+		<many-to-one name="superBaz" access="field"/>
+		
+		<component name="collectionComponent">
+			<component name="nested">
+				<property name="str" column="`str`"/>
+				<bag name="foos" cascade="all">
+					<key column="baz_compon_id"/>
+					<one-to-many class="org.hibernate.test.legacy.Foo"/>
+				</bag>
+				<bag name="floats" table="baz_floats_bag">
+					<key column="baz_compon_id"/>
+					<element type="float" column="float_value"/>
+				</bag>
+			</component>
+		</component>
+		
+	</class>
+	
+	<class name="org.hibernate.test.legacy.Sortable">
+		<id name="id">
+			<generator class="native"/>
+		</id>
+		<property name="name"/>
+	</class>
+	
+	<class name="org.hibernate.test.legacy.Part" where="description like 'x%'">
+		<id name="id">
+			<generator class="native"/>
+		</id>
+		<discriminator column="clazz"/>
+		<property name="description"/>
+		<subclass name="org.hibernate.test.legacy.Part$SpecialPart"/>
+	</class>
+	
+	
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Baz.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Baz.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Baz.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Baz.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,451 @@
+//$Id: Baz.java 4688 2004-10-26 09:10:50Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeMap;
+import java.util.TreeSet;
+
+public class Baz implements Named, Serializable, Comparable {
+	private SortedSet stringSet;
+	private Map stringDateMap;
+	private List stringList;
+	private int[] intArray;
+	private FooProxy[] fooArray;
+	private String[] stringArray;
+	private String code;
+	private List customs;
+	private List topComponents;
+	private Set fooSet;
+	private FooComponent[] components;
+	private Date[] timeArray;
+	private int count;
+	private String name;
+	private Collection bag;
+	private Set topFoos;
+	private Map topGlarchez;
+	private Set cascadingBars;
+	private Map fooToGlarch;
+	private Map fooComponentToFoo;
+	private Map glarchToFoo;
+	private List fees;
+	private Collection fooBag;
+	private Set cached;
+	private Map cachedMap;
+	private Map stringGlarchMap;
+	private Map anyToAny;
+	private List manyToAny;
+	private Collection idFooBag;
+	private Collection byteBag;
+	private FooProxy foo;
+	private List bazez;
+	private SortedSet sortablez;
+	private NestingComponent collectionComponent;
+	private String text;
+	private List parts;
+	private List moreParts;
+	public List subs;
+	public Baz superBaz;
+	
+	Baz() {}
+	
+	public SortedSet getStringSet() {
+		return stringSet;
+	}
+	public void setStringSet(SortedSet stringSet) {
+		this.stringSet = stringSet;
+	}
+	public Map getStringDateMap() {
+		return stringDateMap;
+	}
+	public void setStringDateMap(Map stringDateMap) {
+		this.stringDateMap = stringDateMap;
+	}
+	public List getStringList() {
+		return stringList;
+	}
+	public void setStringList(List stringList) {
+		this.stringList = stringList;
+	}
+	public int[] getIntArray() {
+		return intArray;
+	}
+	public void setIntArray(int[] intArray) {
+		this.intArray = intArray;
+	}
+	public FooProxy[] getFooArray() {
+		return fooArray;
+	}
+	public void setFooArray(FooProxy[] fooArray) {
+		this.fooArray = fooArray;
+	}
+	public String[] getStringArray() {
+		return stringArray;
+	}
+	public void setStringArray(String[] stringArray) {
+		this.stringArray = stringArray;
+	}
+	
+	public String getCode() {
+		return code;
+	}
+	public void setCode(String code) {
+		this.code = code;
+	}
+	
+	public void setDefaults() {
+		SortedSet set = new TreeSet();
+		set.add("foo"); set.add("bar"); set.add("baz");
+		setStringSet(set);
+		Map map = new TreeMap();
+		map.put( "now", new Date() );
+		map.put( "never", null );
+		map.put( "big bang", new Date(0) );
+		setStringDateMap(map);
+		List list = new ArrayList();
+		list.addAll(set);
+		setStringList(list);
+		setIntArray( new int[] { 1,3,3,7 } );
+		setFooArray( new Foo[0] );
+		setStringArray( (String[]) list.toArray( new String[0] ) );
+		customs = new ArrayList();
+		customs.add( new String[] { "foo", "bar" } );
+		customs.add( new String[] { "A", "B" } );
+		customs.add( new String[] { "1", "2" } );
+		
+		fooSet = new HashSet();
+		components = new FooComponent[] {
+			new FooComponent("foo", 42, null, null),
+			new FooComponent("bar", 88, null, new FooComponent("sub", 69, null, null) )
+		};
+		timeArray = new Date[] { new Date(), new Date(), null, new Date(0) };
+		TreeSet x = new TreeSet();
+		x.add("w"); x.add("x"); x.add("y"); x.add("z");
+		TreeSet a = new TreeSet();
+		a.add("a"); a.add("b"); a.add("d"); a.add("c");
+		
+		count = 667;
+		name="Bazza";
+		topComponents = new ArrayList();
+		topComponents.add( new FooComponent("foo", 11, new Date[] { new Date(), new Date(123) }, null) );
+		topComponents.add( new FooComponent("bar", 22, new Date[] { new Date(7), new Date(456) }, null) );
+		topComponents.add( null );
+		bag = new ArrayList();
+		bag.add("duplicate");
+		bag.add("duplicate");
+		bag.add("duplicate");
+		bag.add("unique");
+		cached = new TreeSet();
+		CompositeElement ce = new CompositeElement();
+		ce.setFoo("foo");
+		ce.setBar("bar");
+		CompositeElement ce2 = new CompositeElement();
+		ce2.setFoo("fooxxx");
+		ce2.setBar("barxxx");
+		cached.add(ce);
+		cached.add(ce2);
+		cachedMap = new TreeMap();
+		cachedMap.put(this, ce);
+		
+		text="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
+		for (int i=0; i<10; i++) text+=text;
+		
+	}
+	
+	public List getCustoms() {
+		return customs;
+	}
+	public void setCustoms(List customs) {
+		this.customs = customs;
+	}
+	
+	public Set getFooSet() {
+		return fooSet;
+	}
+	public void setFooSet(Set fooSet) {
+		this.fooSet = fooSet;
+	}
+	
+	public FooComponent[] getComponents() {
+		return components;
+	}
+	public void setComponents(FooComponent[] components) {
+		this.components = components;
+	}
+	
+	public Date[] getTimeArray() {
+		return timeArray;
+	}
+	
+	public void setTimeArray(Date[] timeArray) {
+		this.timeArray = timeArray;
+	}
+	
+	public int getCount() {
+		return count;
+	}
+	
+	public void setCount(int count) {
+		this.count = count;
+	}
+	
+	public String getName() {
+		return name;
+	}
+	
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	public List getTopComponents() {
+		return topComponents;
+	}
+	
+	public void setTopComponents(List topComponents) {
+		this.topComponents = topComponents;
+	}
+	
+	public Collection getBag() {
+		return bag;
+	}
+	
+	public void setBag(Collection bag) {
+		this.bag = bag;
+	}
+	
+	public Set getTopFoos() {
+		return topFoos;
+	}
+	
+	public void setTopFoos(Set topFoos) {
+		this.topFoos = topFoos;
+	}
+	
+	
+	public Map getTopGlarchez() {
+		return topGlarchez;
+	}
+	
+	public void setTopGlarchez(Map topGlarchez) {
+		this.topGlarchez = topGlarchez;
+	}
+	
+	public Set getCascadingBars() {
+		return cascadingBars;
+	}
+	
+	public void setCascadingBars(Set cascadingBars) {
+		this.cascadingBars = cascadingBars;
+	}
+	
+	public Map getFooToGlarch() {
+		return fooToGlarch;
+	}
+	
+	public void setFooToGlarch(Map fooToGlarch) {
+		this.fooToGlarch = fooToGlarch;
+	}
+	
+	public Map getFooComponentToFoo() {
+		return fooComponentToFoo;
+	}
+	
+	public void setFooComponentToFoo(Map fooComponentToFoo) {
+		this.fooComponentToFoo = fooComponentToFoo;
+	}
+	
+	public Map getGlarchToFoo() {
+		return glarchToFoo;
+	}
+	
+	public void setGlarchToFoo(Map glarchToFoo) {
+		this.glarchToFoo = glarchToFoo;
+	}
+	
+	public List getFees() {
+		return fees;
+	}
+
+	public void setFees(List fees) {
+		this.fees = fees;
+	}
+
+	public Collection getFooBag() {
+		return fooBag;
+	}
+
+	public void setFooBag(Collection fooBag) {
+		this.fooBag = fooBag;
+	}
+
+	/**
+	 * Returns the cached.
+	 * @return Set
+	 */
+	public Set getCached() {
+		return cached;
+	}
+
+	/**
+	 * Sets the cached.
+	 * @param cached The cached to set
+	 */
+	public void setCached(Set cached) {
+		this.cached = cached;
+	}
+
+	/**
+	 * Returns the cachedMap.
+	 * @return Map
+	 */
+	public Map getCachedMap() {
+		return cachedMap;
+	}
+
+	/**
+	 * Sets the cachedMap.
+	 * @param cachedMap The cachedMap to set
+	 */
+	public void setCachedMap(Map cachedMap) {
+		this.cachedMap = cachedMap;
+	}
+
+	/**
+	 * @see java.lang.Comparable#compareTo(java.lang.Object)
+	 */
+	public int compareTo(Object o) {
+		return ( (Baz) o ).code.compareTo(code);
+	}
+
+	/**
+	 * Returns the stringGlarchMap.
+	 * @return Map
+	 */
+	public Map getStringGlarchMap() {
+		return stringGlarchMap;
+	}
+
+	/**
+	 * Sets the stringGlarchMap.
+	 * @param stringGlarchMap The stringGlarchMap to set
+	 */
+	public void setStringGlarchMap(Map stringGlarchMap) {
+		this.stringGlarchMap = stringGlarchMap;
+	}
+
+	/**
+	 * Returns the anyToAny.
+	 * @return Map
+	 */
+	public Map getAnyToAny() {
+		return anyToAny;
+	}
+
+	/**
+	 * Sets the anyToAny.
+	 * @param anyToAny The anyToAny to set
+	 */
+	public void setAnyToAny(Map anyToAny) {
+		this.anyToAny = anyToAny;
+	}
+
+	public Collection getIdFooBag() {
+		return idFooBag;
+	}
+
+	public void setIdFooBag(Collection collection) {
+		idFooBag = collection;
+	}
+
+	public Collection getByteBag() {
+		return byteBag;
+	}
+
+	public void setByteBag(Collection list) {
+		byteBag = list;
+	}
+
+	public FooProxy getFoo() {
+		return foo;
+	}
+
+	public void setFoo(FooProxy foo) {
+		this.foo = foo;
+	}
+
+	public List getBazez() {
+		return bazez;
+	}
+
+	public void setBazez(List list) {
+		bazez = list;
+	}
+
+	public SortedSet getSortablez() {
+		return sortablez;
+	}
+
+	public void setSortablez(SortedSet set) {
+		sortablez = set;
+	}
+
+
+	public NestingComponent getCollectionComponent() {
+		return collectionComponent;
+	}
+
+	public void setCollectionComponent(NestingComponent collection) {
+		collectionComponent = collection;
+	}
+
+	/**
+	 * @return
+	 */
+	public String getText() {
+		return text;
+	}
+
+	/**
+	 * @param string
+	 */
+	public void setText(String string) {
+		text = string;
+	}
+
+	public List getParts() {
+		return parts;
+	}
+
+	public void setParts(List list) {
+		parts = list;
+	}
+
+	public List getManyToAny() {
+		return manyToAny;
+	}
+
+	public void setManyToAny(List manyToAny) {
+		this.manyToAny = manyToAny;
+	}
+
+	public List getMoreParts() {
+		return moreParts;
+	}
+	public void setMoreParts(List moreParts) {
+		this.moreParts = moreParts;
+	}
+}
+
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Baz.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Blobber.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Blobber.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Blobber.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-lazy="false">
+	<class name="org.hibernate.test.legacy.Blobber" dynamic-update="true">
+		<id name="id">
+			<generator class="hilo"/>
+		</id>
+		<property name="blob" column="blob_"/>
+		<property name="clob" column="clob_"/>
+	</class>
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Blobber.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Blobber.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Blobber.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Blobber.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,58 @@
+package org.hibernate.test.legacy;
+
+import java.sql.Blob;
+import java.sql.Clob;
+
+public class Blobber {
+	private int id;
+	private Blob blob;
+	private Clob clob;
+	/**
+	 * Returns the blob.
+	 * @return Blob
+	 */
+	public Blob getBlob() {
+		return blob;
+	}
+
+	/**
+	 * Returns the clob.
+	 * @return Clob
+	 */
+	public Clob getClob() {
+		return clob;
+	}
+
+	/**
+	 * Returns the id.
+	 * @return int
+	 */
+	public int getId() {
+		return id;
+	}
+
+	/**
+	 * Sets the blob.
+	 * @param blob The blob to set
+	 */
+	public void setBlob(Blob blob) {
+		this.blob = blob;
+	}
+
+	/**
+	 * Sets the clob.
+	 * @param clob The clob to set
+	 */
+	public void setClob(Clob clob) {
+		this.clob = clob;
+	}
+
+	/**
+	 * Sets the id.
+	 * @param id The id to set
+	 */
+	public void setId(int id) {
+		this.id = id;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Blobber.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Broken.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Broken.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Broken.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-lazy="false">
+
+    <class name="org.hibernate.test.legacy.Broken" table="BROKE">
+        <!--id name="id" type="long" column="id_">
+            <generator class="hilo"/>
+        </id-->
+        <composite-id>
+        	<key-property name="id"/>
+        	<key-property name="otherId"/>
+        </composite-id>
+        <timestamp name="timestamp" column="`timestamp`"/>
+        <joined-subclass name="org.hibernate.test.legacy.Fixed" table="FIX">
+        	<key>
+        		<column name="BROKE_ID"/>
+        		<column name="OTHER_BROKE_ID"/>
+        	</key>
+			<set name="set" lazy="true" inverse="true">
+                <key>
+                	<column name="FIX_ID"/>
+                	<column name="OTHER_FIX_ID"/>
+                </key>
+                <one-to-many class="org.hibernate.test.legacy.Broken"/>
+            </set>
+            <property name="list" type="serializable"/>
+        </joined-subclass>
+    </class>
+    
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Broken.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Broken.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Broken.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Broken.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,48 @@
+//$Id: Broken.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author Gavin King
+ */
+public class Broken implements Serializable {
+	private Long id;
+	private String otherId;
+	private Date timestamp;
+	public Long getId() {
+		return id;
+	}
+
+	public Date getTimestamp() {
+		return timestamp;
+	}
+
+	public void setId(Long long1) {
+		id = long1;
+	}
+
+	public void setTimestamp(Date date) {
+		timestamp = date;
+	}
+
+	public String getOtherId() {
+		return otherId;
+	}
+
+	public void setOtherId(String string) {
+		otherId = string;
+	}
+	
+	public boolean equals(Object other) {
+		if ( !(other instanceof Broken) ) return false;
+		Broken that = (Broken) other;
+		return this.id.equals(that.id) && this.otherId.equals(that.otherId);
+	}
+	
+	public int hashCode() {
+		return 1;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Broken.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/C1.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/C1.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/C1.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,91 @@
+//$Id: C1.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+public class C1 extends B{
+	private String address;
+	private String c1Name;
+	private C2 c2;
+	private D d;
+	private Collection c2s = new ArrayList();
+	/**
+	 * Returns the address.
+	 * @return String
+	 */
+	public String getAddress() {
+		return address;
+	}
+	
+	/**
+	 * Sets the address.
+	 * @param address The address to set
+	 */
+	public void setAddress(String address) {
+		this.address = address;
+	}
+	
+	/**
+	 * Returns the d.
+	 * @return D
+	 */
+	public D getD() {
+		return d;
+	}
+	
+	/**
+	 * Sets the d.
+	 * @param d The d to set
+	 */
+	public void setD(D d) {
+		this.d = d;
+	}
+	
+	/**
+	 * @return Returns the c.
+	 */
+	public C2 getC2() {
+		return c2;
+	}
+
+	/**
+	 * @param c The c to set.
+	 */
+	public void setC2(C2 c) {
+		this.c2 = c;
+	}
+
+	/**
+	 * @return Returns the cs.
+	 */
+	public Collection getC2s() {
+		return c2s;
+	}
+
+	/**
+	 * @param cs The cs to set.
+	 */
+	public void setC2s(Collection cs) {
+		this.c2s = cs;
+	}
+
+	/**
+	 * @return Returns the c1Name.
+	 */
+	public String getC1Name() {
+		return c1Name;
+	}
+	/**
+	 * @param name The c1Name to set.
+	 */
+	public void setC1Name(String name) {
+		c1Name = name;
+	}
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/C1.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/C2.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/C2.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/C2.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,69 @@
+//$Id: C2.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+public class C2 extends B {
+	private String address;
+	private C1 c1;
+	private String c2Name;
+	private Collection c1s = new ArrayList();
+	/**
+	 * Returns the address.
+	 * @return String
+	 */
+	public String getAddress() {
+		return address;
+	}
+	
+	/**
+	 * Sets the address.
+	 * @param address The address to set
+	 */
+	public void setAddress(String address) {
+		this.address = address;
+	}
+	
+	/**
+	 * @return Returns the c.
+	 */
+	public C1 getC1() {
+		return c1;
+	}
+
+	/**
+	 * @param c The c to set.
+	 */
+	public void setC1(C1 c) {
+		this.c1 = c;
+	}
+
+	/**
+	 * @return Returns the cs.
+	 */
+	public Collection getC1s() {
+		return c1s;
+	}
+
+	/**
+	 * @param cs The cs to set.
+	 */
+	public void setC1s(Collection cs) {
+		this.c1s = cs;
+	}
+
+	public String getC2Name() {
+		return c2Name;
+	}
+
+	public void setC2Name(String name) {
+		c2Name = name;
+	}
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/C2.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/CacheTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/CacheTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/CacheTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,143 @@
+//$Id: CacheTest.java 11398 2007-04-10 14:54:07Z steve.ebersole at jboss.com $
+package org.hibernate.test.legacy;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.hibernate.cache.Cache;
+import org.hibernate.cache.CacheConcurrencyStrategy;
+import org.hibernate.cache.CacheProvider;
+import org.hibernate.cache.ReadWriteCache;
+import org.hibernate.cache.HashtableCacheProvider;
+import org.hibernate.cache.access.SoftLock;
+import org.hibernate.testing.junit.UnitTestCase;
+
+public class CacheTest extends UnitTestCase {
+
+	public CacheTest(String name) {
+		super( name );
+	}
+
+	public static Test suite() {
+		return new TestSuite( CacheTest.class );
+	}
+
+	public void testCaches() throws Exception {
+		doTestCache( new HashtableCacheProvider() );
+	}
+
+	public void doTestCache(CacheProvider cacheProvider) throws Exception {
+
+		Cache cache = cacheProvider.buildCache( String.class.getName(), System.getProperties() );
+
+		long longBefore = cache.nextTimestamp();
+
+		Thread.sleep(15);
+
+		long before = cache.nextTimestamp();
+
+		Thread.sleep(15);
+
+		//cache.setTimeout(1000);
+		CacheConcurrencyStrategy ccs = new ReadWriteCache();
+		ccs.setCache(cache);
+
+		// cache something
+
+		assertTrue( ccs.put("foo", "foo", before, null, null, false) );
+
+		Thread.sleep(15);
+
+		long after = cache.nextTimestamp();
+
+		assertTrue( ccs.get("foo", longBefore)==null );
+		assertTrue( ccs.get("foo", after).equals("foo") );
+
+		assertTrue( !ccs.put("foo", "foo", before, null, null, false) );
+
+		// update it:
+
+		SoftLock lock = ccs.lock("foo", null);
+
+		assertTrue( ccs.get("foo", after)==null );
+		assertTrue( ccs.get("foo", longBefore)==null );
+
+		assertTrue( !ccs.put("foo", "foo", before, null, null, false) );
+
+		Thread.sleep(15);
+
+		long whileLocked = cache.nextTimestamp();
+
+		assertTrue( !ccs.put("foo", "foo", whileLocked, null, null, false) );
+
+		Thread.sleep(15);
+
+		ccs.release("foo", lock);
+
+		assertTrue( ccs.get("foo", after)==null );
+		assertTrue( ccs.get("foo", longBefore)==null );
+
+		assertTrue( !ccs.put("foo", "bar", whileLocked, null, null, false) );
+		assertTrue( !ccs.put("foo", "bar", after, null, null, false) );
+
+		Thread.sleep(15);
+
+		long longAfter = cache.nextTimestamp();
+
+		assertTrue( ccs.put("foo", "baz", longAfter, null, null, false) );
+
+		assertTrue( ccs.get("foo", after)==null );
+		assertTrue( ccs.get("foo", whileLocked)==null );
+
+		Thread.sleep(15);
+
+		long longLongAfter = cache.nextTimestamp();
+
+		assertTrue( ccs.get("foo", longLongAfter).equals("baz") );
+
+		// update it again, with multiple locks:
+
+		SoftLock lock1 = ccs.lock("foo", null);
+		SoftLock lock2 = ccs.lock("foo", null);
+
+		assertTrue( ccs.get("foo", longLongAfter)==null );
+
+		Thread.sleep(15);
+
+		whileLocked = cache.nextTimestamp();
+
+		assertTrue( !ccs.put("foo", "foo", whileLocked, null, null, false) );
+
+		Thread.sleep(15);
+
+		ccs.release("foo", lock2);
+
+		Thread.sleep(15);
+
+		long betweenReleases = cache.nextTimestamp();
+
+		assertTrue( !ccs.put("foo", "bar", betweenReleases, null, null, false) );
+		assertTrue( ccs.get("foo", betweenReleases)==null );
+
+		Thread.sleep(15);
+
+		ccs.release("foo", lock1);
+
+		assertTrue( !ccs.put("foo", "bar", whileLocked, null, null, false) );
+
+		Thread.sleep(15);
+
+		longAfter = cache.nextTimestamp();
+
+		assertTrue( ccs.put("foo", "baz", longAfter, null, null, false) );
+		assertTrue( ccs.get("foo", whileLocked)==null );
+
+		Thread.sleep(15);
+
+		longLongAfter = cache.nextTimestamp();
+
+		assertTrue( ccs.get("foo", longLongAfter).equals("baz") );
+
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/CacheTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Category.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Category.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Category.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,54 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-lazy="false">
+
+	<class name="org.hibernate.test.legacy.Category" 
+		table="category"
+		dynamic-update="true"
+		dynamic-insert="true">
+
+		<id name="id" column="category_key_col">
+			<generator class="native"/>
+		</id>
+
+		<list name="subcategories" lazy="true" cascade="save-update,merge,delete,lock">
+		    <!--cache-->
+			<key column="parent"/>
+			<index column="ord"/>
+			<one-to-many class="org.hibernate.test.legacy.Category"/>
+		</list>
+
+		<property name="name"/>
+		<many-to-one name="assignable" column="`assign-able-id`"/>
+
+	</class>
+
+	<class name="org.hibernate.test.legacy.Assignable" table="`assign-able`">
+		<id name="id">
+			<generator class="assigned"/>
+		</id>
+
+		<bag name="categories" inverse="true" cascade="all" lazy="true">
+			<key column="`assign-able-id`"/>
+			<one-to-many class="org.hibernate.test.legacy.Category"/>
+		</bag>
+	</class>
+
+	<sql-query name="namedsql">
+		<return alias="category" class="org.hibernate.test.legacy.Category"/>
+		<return alias="assignable" class="org.hibernate.test.legacy.Assignable"/>		
+		select {category.*}, {assignable.*} from category {category}, "assign-able" {assignable}	
+	</sql-query>
+
+	<sql-query name="nonaliasedsql">
+		<return alias="category" class="org.hibernate.test.legacy.Category">
+			<return-property name="id" column="category_key_col"/>
+			<return-property name="name" column="name"/>
+			<return-property name="assignable" column="assignid"/>
+		</return>
+		select category_key_col, name, "assign-able-id" as assignid from category
+	</sql-query>
+	
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Category.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Category.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Category.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Category.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,85 @@
+//$Id: Category.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.legacy;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ */
+public class Category {
+	
+	public static final String ROOT_CATEGORY = "/";
+	public static final int ROOT_ID = 42;
+
+	private long id;
+	private String name;
+	private List subcategories = new ArrayList();
+	private Assignable assignable;
+	/**
+	 * Returns the id.
+	 * @return long
+	 */
+	public long getId() {
+		return id;
+	}
+	
+	/**
+	 * Sets the id.
+	 * @param id The id to set
+	 */
+	public void setId(long id) {
+		this.id = id;
+	}
+	
+	/**
+	 * Returns the subcategories.
+	 * @return List
+	 */
+	public List getSubcategories() {
+		return subcategories;
+	}
+	
+	/**
+	 * Sets the subcategories.
+	 * @param subcategories The subcategories to set
+	 */
+	public void setSubcategories(List subcategories) {
+		this.subcategories = subcategories;
+	}
+	
+	/**
+	 * Returns the name.
+	 * @return String
+	 */
+	public String getName() {
+		return name;
+	}
+	
+	/**
+	 * Sets the name.
+	 * @param name The name to set
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	public Assignable getAssignable() {
+		return assignable;
+	}
+
+	public void setAssignable(Assignable assignable) {
+		this.assignable = assignable;
+	}
+	
+	public String toString() {
+		return id + ":" + name;
+	}
+
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Category.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Child.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Child.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Child.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,48 @@
+//$Id: Child.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+public class Child {
+	private Parent parent;
+	private int count;
+	private int x;
+	
+	public int getX() {
+		return x;
+	}
+	public void setX(int x) {
+		this.x = x;
+	}
+	
+	public Parent getParent() {
+		return parent;
+	}
+	
+	
+	public void setParent(Parent parent) {
+		this.parent = parent;
+	}
+	
+	
+	public int getCount() {
+		return count;
+	}
+	
+	
+	public void setCount(int count) {
+		this.count = count;
+	}
+	
+	public long getId() {
+		return parent.getId();
+	}
+	private void setId(long id) {
+	}
+	
+}
+
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Child.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Circular.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Circular.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Circular.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-lazy="false" default-cascade="save-update">
+
+    <class name="org.hibernate.test.legacy.Circular" dynamic-update="true">
+        <id name="id" column="id_" length="64" unsaved-value="null">
+            <generator class="uuid"/>
+        </id>
+        <property name="clazz"/>
+        <many-to-one name="other"/>
+        <property name="anyEntity">
+        	<column name="classname"/>
+        	<column name="any_id"/>
+        </property>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Circular.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Circular.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Circular.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Circular.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,88 @@
+//$Id: Circular.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+public class Circular {
+	
+	private String id;
+	private Class clazz;
+	private Circular other;
+	private Object anyEntity;
+	
+	/**
+	 * Constructor for Circular.
+	 */
+	public Circular() {
+		super();
+	}
+	
+	/**
+	 * Returns the clazz.
+	 * @return Class
+	 */
+	public Class getClazz() {
+		return clazz;
+	}
+	
+	/**
+	 * Returns the id.
+	 * @return String
+	 */
+	public String getId() {
+		return id;
+	}
+	
+	/**
+	 * Sets the clazz.
+	 * @param clazz The clazz to set
+	 */
+	public void setClazz(Class clazz) {
+		this.clazz = clazz;
+	}
+	
+	/**
+	 * Sets the id.
+	 * @param id The id to set
+	 */
+	public void setId(String id) {
+		this.id = id;
+	}
+	
+	/**
+	 * Returns the other.
+	 * @return Circular
+	 */
+	public Circular getOther() {
+		return other;
+	}
+	
+	/**
+	 * Sets the other.
+	 * @param other The other to set
+	 */
+	public void setOther(Circular other) {
+		this.other = other;
+	}
+	
+	/**
+	 * Returns the anyEntity.
+	 * @return Object
+	 */
+	public Object getAnyEntity() {
+		return anyEntity;
+	}
+	
+	/**
+	 * Sets the anyEntity.
+	 * @param anyEntity The anyEntity to set
+	 */
+	public void setAnyEntity(Object anyEntity) {
+		this.anyEntity = anyEntity;
+	}
+	
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Circular.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Commento.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Commento.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Commento.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-lazy="false">
+<!--
+    Created by the Middlegen Hibernate plugin 2.1
+
+    http://boss.bekk.no/boss/middlegen/
+    http://hibernate.sourceforge.net/
+-->
+
+<class entity-name="Commento" table="MARECM">
+    <id name="mclink" type="long" column="MCLINK">
+        <generator class="assigned"/>
+    </id>
+
+    <property name="mcompr" type="java.lang.String" column="MCOMPR" length="1"/>
+    <property name="mcomme" type="java.lang.String" column="MCOMME" length="30"/>
+
+    <!-- Associations -->
+    <!--many-to-one name="marelo" class="Marelo" column="MCLINK" unique="true"/-->
+    <one-to-one name="marelo" entity-name="Marelo" outer-join="auto" property-ref="commento"/>
+
+</class>
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Commento.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Company.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Company.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Company.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,29 @@
+package org.hibernate.test.legacy;
+
+/**
+ * @author hbm2java
+ */
+public class Company extends org.hibernate.test.legacy.Party {
+
+   java.lang.String id;
+   java.lang.String president;
+
+
+  java.lang.String getId() {
+    return id;
+  }
+
+  void  setId(java.lang.String newValue) {
+    id = newValue;
+  }
+
+  java.lang.String getPresident() {
+    return president;
+  }
+
+  void  setPresident(java.lang.String newValue) {
+    president = newValue;
+  }
+
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Company.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Component.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Component.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Component.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,42 @@
+//$Id: Component.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+/**
+ * Component
+ * 
+ * @author Emmanuel Bernard
+ */
+public class Component {
+    private String _name;
+    
+    private SubComponent _subComponent;
+
+    /**
+     * @return
+     */
+    public String getName() {
+        return _name;
+    }
+
+    /**
+     * @param string
+     */
+    public void setName(String string) {
+        _name = string;
+    }
+
+    /**
+     * @return
+     */
+    public SubComponent getSubComponent() {
+        return _subComponent;
+    }
+
+    /**
+     * @param component
+     */
+    public void setSubComponent(SubComponent component) {
+        _subComponent = component;
+    }
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Component.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ComponentCollection.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ComponentCollection.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ComponentCollection.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,35 @@
+//$Id: ComponentCollection.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+import java.util.List;
+
+public class ComponentCollection implements Serializable {
+	private String str;
+	private List foos;
+	private List floats;
+	public List getFoos() {
+		return foos;
+	}
+
+	public String getStr() {
+		return str;
+	}
+
+	public void setFoos(List list) {
+		foos = list;
+	}
+
+	public void setStr(String string) {
+		str = string;
+	}
+
+	public List getFloats() {
+		return floats;
+	}
+
+	public void setFloats(List list) {
+		floats = list;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ComponentCollection.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ComponentNotNull.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ComponentNotNull.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ComponentNotNull.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,90 @@
+//$Id: ComponentNotNull.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+/**
+ * Component used to check not-null sub properties management
+ * 
+ * @author Emmanuel Bernard
+ */
+public class ComponentNotNull {
+	/* 
+	 * I've flatten several components in one class, this is kind of ugly but
+ 	 * I don't have to write tons of classes
+ 	 */
+	private String prop1Nullable;
+	private String prop2Nullable;
+	private ComponentNotNull supercomp;
+	private ComponentNotNull subcomp;
+	private String prop1Subcomp;
+
+	/**
+	 * @return
+	 */
+	public String getProp1Nullable() {
+		return prop1Nullable;
+	}
+
+	/**
+	 * @return
+	 */
+	public String getProp1Subcomp() {
+		return prop1Subcomp;
+	}
+
+	/**
+	 * @return
+	 */
+	public String getProp2Nullable() {
+		return prop2Nullable;
+	}
+
+	/**
+	 * @return
+	 */
+	public ComponentNotNull getSubcomp() {
+		return subcomp;
+	}
+
+	/**
+	 * @return
+	 */
+	public ComponentNotNull getSupercomp() {
+		return supercomp;
+	}
+
+	/**
+	 * @param string
+	 */
+	public void setProp1Nullable(String string) {
+		prop1Nullable = string;
+	}
+
+	/**
+	 * @param string
+	 */
+	public void setProp1Subcomp(String string) {
+		prop1Subcomp = string;
+	}
+
+	/**
+	 * @param string
+	 */
+	public void setProp2Nullable(String string) {
+		prop2Nullable = string;
+	}
+
+	/**
+	 * @param null1
+	 */
+	public void setSubcomp(ComponentNotNull null1) {
+		subcomp = null1;
+	}
+
+	/**
+	 * @param null1
+	 */
+	public void setSupercomp(ComponentNotNull null1) {
+		supercomp = null1;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ComponentNotNull.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ComponentNotNullMaster.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ComponentNotNullMaster.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ComponentNotNullMaster.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,64 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping default-lazy="false">
+
+	<class name="org.hibernate.test.legacy.ComponentNotNullMaster"> <!-- discriminator-value="A"> -->
+		<id name="id" column="container_id">
+			<generator class="native" />
+		</id>
+		<property name="test"/>
+		
+		<component name="nullable">
+		  <property name="prop1Nullable" />
+		  <property name="prop2Nullable"/>
+		</component>
+		
+		<component name="supercomp">
+		  <component name="subcomp">
+    		  <property name="prop1Subcomp" not-null="true"/>
+		  </component>
+		</component>
+		
+		<list name="components" lazy="true">
+			<key column = "container_id"/>
+			<index column = "list_index"/>
+			<composite-element class="org.hibernate.test.legacy.ComponentNotNullMaster$ContainerInnerClass">
+				<property name="name"/>
+				<property name="count" column="count_"/>
+				<many-to-one name="simple" not-null="true" cascade="save-update"/>
+				<many-to-one name="one" cascade="save-update"/>
+				<many-to-one name="many" cascade="save-update"/>
+			</composite-element>
+		</list>
+		
+				
+		<list name="componentsImplicit" lazy="true">
+			<key column = "container_id"/>
+			<index column = "list_index3"/>
+			<composite-element class="org.hibernate.test.legacy.ComponentNotNullMaster$ContainerInnerClass">
+				<property name="name"/>
+				<property name="count" column="count_"/>
+				<many-to-one name="simple" cascade="save-update"/>
+				<many-to-one name="one" cascade="save-update"/>
+				<nested-composite-element name="nested" class="org.hibernate.test.legacy.ComponentNotNullMaster$ContainerInnerClass">
+					<property name="nestedproperty" not-null="true"/>
+				</nested-composite-element>
+			</composite-element>
+		</list>
+		<!-- subclass name="org.hibernate.test.legacy.ExtendedComponentNotNull" discriminator-value="B">
+		  <component name="subclassComp" not-null="true">
+		    <property name="subclass" />
+		  </component>
+		</subclass -->
+		<!-- joined-subclass name="org.hibernate.test.legacy.ExtendedComponentNotNull">
+		  <key column="id"/>
+		  <component name="subclassComp" not-null="true">
+		    <property name="subclass" />
+		  </component>
+		</joined-subclass -->
+	</class>
+	
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ComponentNotNullMaster.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ComponentNotNullMaster.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ComponentNotNullMaster.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ComponentNotNullMaster.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,142 @@
+//$Id: ComponentNotNullMaster.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.util.List;
+
+/**
+ * Entity containing components for not-null testing
+ * 
+ * @author Emmanuel Bernard
+ */
+public class ComponentNotNullMaster {
+	
+	private int id;
+	private String test;
+	private ComponentNotNull nullable;
+	private ComponentNotNull supercomp;
+	private List components;
+	private List componentsImplicit;
+
+	public int getId() {
+		return id;
+	}
+
+	public ComponentNotNull getNullable() {
+		return nullable;
+	}
+
+	public void setId(int i) {
+		id = i;
+	}
+
+	public void setNullable(ComponentNotNull component) {
+		nullable = component;
+	}
+
+	public static final class ContainerInnerClass {
+		private Simple simple;
+		private String name;
+		private One one;
+		private Many many;
+		private int count;
+		private ContainerInnerClass nested;
+		private String nestedproperty;
+		
+		public void setSimple(Simple simple) {
+			this.simple = simple;
+		}
+		
+		public Simple getSimple() {
+			return simple;
+		}
+
+		public String getName() {
+			return name;
+		}
+		
+
+		public void setName(String name) {
+			this.name = name;
+		}
+		
+		public String toString() {
+			return name +  " = " + simple.getCount() +
+			 "/"  + ( one==null ? "nil" : one.getKey().toString() ) +
+			 "/"  + ( many==null ? "nil" : many.getKey().toString() );
+		}
+		
+		public One getOne() {
+			return one;
+		}
+		
+		public void setOne(One one) {
+			this.one = one;
+		}
+		
+		public Many getMany() {
+			return many;
+		}
+
+		public void setMany(Many many) {
+			this.many = many;
+		}
+		
+		public int getCount() {
+			return count;
+		}
+
+		public void setCount(int count) {
+			this.count = count;
+		}
+
+		public ContainerInnerClass getNested() {
+			return nested;
+		}
+
+		public void setNested(ContainerInnerClass class1) {
+			nested = class1;
+		}
+
+		public String getNestedproperty() {
+			return nestedproperty;
+		}
+
+		public void setNestedproperty(String string) {
+			nestedproperty = string;
+		}
+
+	}
+
+	public List getComponents() {
+		return components;
+	}
+
+	public void setComponents(List list) {
+		components = list;
+	}
+
+	public List getComponentsImplicit() {
+		return componentsImplicit;
+	}
+
+	public void setComponentsImplicit(List list) {
+		componentsImplicit = list;
+	}
+
+	public ComponentNotNull getSupercomp() {
+		return supercomp;
+	}
+
+	public void setSupercomp(ComponentNotNull component) {
+		supercomp = component;
+	}
+
+	public String getTest() {
+		return test;
+	}
+
+	public void setTest(String string) {
+		test = string;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ComponentNotNullMaster.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ComponentNotNullTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ComponentNotNullTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ComponentNotNullTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,206 @@
+//{Id:}
+package org.hibernate.test.legacy;
+
+import java.util.ArrayList;
+
+import junit.framework.Test;
+import junit.textui.TestRunner;
+
+import org.hibernate.PropertyValueException;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Test some cases of not-null properties inside components.
+ *
+ * @author Emmanuel Bernard
+ */
+public class ComponentNotNullTest extends LegacyTestCase {
+
+	public ComponentNotNullTest(String x) {
+		super(x);
+	}
+
+	public String[] getMappings() {
+		return new String[] {
+			"legacy/ComponentNotNullMaster.hbm.xml",
+			"legacy/One.hbm.xml",
+			"legacy/Many.hbm.xml",
+			"legacy/Simple.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( ComponentNotNullTest.class );
+	}
+
+	public static void main(String[] args) throws Exception {
+		TestRunner.run(suite());
+	}
+
+	public void testComponentNotNull() throws Exception {
+
+		//everything not null
+		//
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		ComponentNotNullMaster master = new ComponentNotNullMaster();
+		ComponentNotNull nullable = new ComponentNotNull();
+		ComponentNotNull supercomp = new ComponentNotNull();
+		ComponentNotNull subcomp = new ComponentNotNull();
+
+		master.setNullable(nullable);
+		subcomp.setProp1Subcomp("test");
+		supercomp.setSubcomp(subcomp);
+		master.setSupercomp(supercomp);
+		s.save(master);
+		t.commit();
+		s.close();
+
+		//null prop of a subcomp
+		//
+		s = openSession();
+		t = s.beginTransaction();
+
+		master = new ComponentNotNullMaster();
+		nullable = new ComponentNotNull();
+		supercomp = new ComponentNotNull();
+		subcomp = new ComponentNotNull();
+
+		master.setNullable(nullable);
+		// do not set property
+		//subcomp.setProp1Subcomp("test");
+		supercomp.setSubcomp(subcomp);
+		master.setSupercomp(supercomp);
+
+
+		try {
+			s.save(master);
+			t.commit();
+			fail("Inserting not-null null property should fail");
+		} catch (PropertyValueException e) {
+			//succeed
+		}
+		t.rollback();
+		s.close();
+
+		//null component having not-null column
+		//
+		s = openSession();
+		t = s.beginTransaction();
+
+		master = new ComponentNotNullMaster();
+		nullable = new ComponentNotNull();
+		supercomp = new ComponentNotNull();
+		subcomp = new ComponentNotNull();
+
+		master.setNullable(nullable);
+		// do not set supercomp for master
+		//subcomp.setProp1Subcomp("test");
+		//supercomp.setSubcomp(subcomp);
+		//master.setSupercomp(supercomp);
+
+
+		try {
+			s.save(master);
+			t.commit();
+			fail("Inserting not-null null property should fail");
+		} catch (PropertyValueException e) {
+			//succeed
+		}
+		t.rollback();
+		s.close();
+	}
+
+	public void testCompositeElement() throws Exception {
+		//composite-element nullable
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		ComponentNotNullMaster master = new ComponentNotNullMaster();
+		ComponentNotNull nullable = new ComponentNotNull();
+		ComponentNotNull supercomp = new ComponentNotNull();
+		ComponentNotNull subcomp = new ComponentNotNull();
+
+		master.setNullable(nullable);
+		subcomp.setProp1Subcomp("test");
+		supercomp.setSubcomp(subcomp);
+		master.setSupercomp(supercomp);
+
+		master.setComponents(new ArrayList());
+		ComponentNotNullMaster.ContainerInnerClass cc =
+			new ComponentNotNullMaster.ContainerInnerClass();
+		master.getComponents().add(cc);
+
+		try {
+			s.save(master);
+			t.commit();
+			fail("Inserting not-null many-to-one should fail");
+		} catch (PropertyValueException e) {
+			//success
+		}
+		t.rollback();
+		s.close();
+
+		//null nested component having not-null column
+		//
+		s = openSession();
+		t = s.beginTransaction();
+
+		master = new ComponentNotNullMaster();
+		nullable = new ComponentNotNull();
+		supercomp = new ComponentNotNull();
+		subcomp = new ComponentNotNull();
+
+		master.setNullable(nullable);
+		subcomp.setProp1Subcomp("test");
+		supercomp.setSubcomp(subcomp);
+		master.setSupercomp(supercomp);
+
+		master.setComponentsImplicit(new ArrayList());
+		ComponentNotNullMaster.ContainerInnerClass nestedCc =
+			new ComponentNotNullMaster.ContainerInnerClass();
+		cc =
+			new ComponentNotNullMaster.ContainerInnerClass();
+		cc.setNested(nestedCc);
+		master.getComponentsImplicit().add(cc);
+
+		try {
+			s.save(master);
+			t.commit();
+			fail("Inserting not-null null property should fail");
+		} catch (PropertyValueException e) {
+			//succeed
+		}
+		t.rollback();
+		s.close();
+
+		//nested component having not-null column
+		//
+		s = openSession();
+		t = s.beginTransaction();
+
+		master = new ComponentNotNullMaster();
+		nullable = new ComponentNotNull();
+		supercomp = new ComponentNotNull();
+		subcomp = new ComponentNotNull();
+
+		master.setNullable(nullable);
+		subcomp.setProp1Subcomp("test");
+		supercomp.setSubcomp(subcomp);
+		master.setSupercomp(supercomp);
+
+		master.setComponentsImplicit(new ArrayList());
+		nestedCc =
+			new ComponentNotNullMaster.ContainerInnerClass();
+		cc =
+			new ComponentNotNullMaster.ContainerInnerClass();
+		cc.setNested(nestedCc);
+		nestedCc.setNestedproperty("test");
+		master.getComponentsImplicit().add(cc);
+
+		s.save(master);
+		t.commit();
+		s.close();
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ComponentNotNullTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Componentizable.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Componentizable.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Componentizable.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-lazy="false">
+	<class name="org.hibernate.test.legacy.Componentizable">
+		<id name="id">
+			<generator class="native"/>
+		</id>
+		<property name="nickName"/>
+		<component name="component" access="property" class="org.hibernate.test.legacy.Component">
+			<property name="name"/>
+			<component name="subComponent" class="org.hibernate.test.legacy.SubComponent">
+		   	<property name="subName"/>
+		   	<property name="subName1"/>
+	  		</component>
+		</component>
+	</class>
+	
+	<sql-query name="queryComponentWithOtherColumn">
+	 <return class="org.hibernate.test.legacy.Componentizable">
+	   <return-property name="nickName" column="n2"/>
+	   <return-property name="component.subComponent.subName">
+         <return-column name="otherSubName"/>
+       </return-property>
+       <return-property name="component.subComponent.subName1">
+         <return-column name="subName1"/>
+	   </return-property>
+       <return-property name="component.name">
+         <return-column name="name"/>
+       </return-property>
+     </return>
+	 select id, nickName as n2, name, subName as otherSubName, subName1 from Componentizable
+	</sql-query>
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Componentizable.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Componentizable.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Componentizable.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Componentizable.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,60 @@
+//$Id: Componentizable.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+/**
+ * contains components
+ * 
+ * @author emmanuel
+ */
+public class Componentizable {
+	/** surrogate id */
+	private Integer _id;
+    
+    public String _nickName;
+	
+	/** component */
+    private Component _component;
+
+    /**
+     * @return
+     */
+    public Integer getId() {
+        return _id;
+    }
+
+    /**
+     * @param integer
+     */
+    public void setId(Integer integer) {
+        _id = integer;
+    }
+
+    /**
+     * @return
+     */
+    public Component getComponent() {
+        return _component;
+    }
+
+    /**
+     * @param component
+     */
+    public void setComponent(Component component) {
+        _component = component;
+    }
+
+    /**
+     * @return
+     */
+    public String getNickName() {
+        return _nickName;
+    }
+
+    /**
+     * @param string
+     */
+    public void setNickName(String string) {
+        _nickName = string;
+    }
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Componentizable.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/CompositeElement.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/CompositeElement.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/CompositeElement.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,57 @@
+//$Id: CompositeElement.java 6844 2005-05-21 14:22:16Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+
+public class CompositeElement implements Comparable, Serializable {
+	private String foo;
+	private String bar;
+	/**
+	 * Returns the bar.
+	 * @return String
+	 */
+	public String getBar() {
+		return bar;
+	}
+
+	/**
+	 * Returns the foo.
+	 * @return String
+	 */
+	public String getFoo() {
+		return foo;
+	}
+
+	/**
+	 * Sets the bar.
+	 * @param bar The bar to set
+	 */
+	public void setBar(String bar) {
+		this.bar = bar;
+	}
+
+	/**
+	 * Sets the foo.
+	 * @param foo The foo to set
+	 */
+	public void setFoo(String foo) {
+		this.foo = foo;
+	}
+
+	/**
+	 * @see java.lang.Comparable#compareTo(java.lang.Object)
+	 */
+	public int compareTo(Object o) {
+		return ( (CompositeElement) o ).foo.compareTo(foo);
+	}
+	
+	public int hashCode() {
+		return foo.hashCode() + bar.hashCode();
+	}
+	
+	public boolean equals(Object that) {
+		CompositeElement ce = (CompositeElement) that;
+		return ce.bar.equals(bar) && ce.foo.equals(foo);
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/CompositeElement.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/CompositeIdId.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/CompositeIdId.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/CompositeIdId.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,23 @@
+<?xml version="1.0"?> 
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
+<hibernate-mapping package="org.hibernate.test.legacy"> 
+   <class name="CompositeIdId"> 
+      <composite-id> 
+         <key-property name="system"/> 
+         <key-property name="id"/> 
+      </composite-id> 
+      <property name="name"/>
+      
+      <component name="composite">
+      	<property name="foo"/>
+      	<property name="bar"/>
+      </component>
+      <loader query-ref="loadC"/>
+   </class> 
+   
+   <sql-query name="loadC"> 
+      <return alias="c" class="CompositeIdId"/> 
+      select system as {c.system}, id as {c.id}, name as {c.name}, foo as {c.composite.foo}, bar as {c.composite.bar} from CompositeIdId where system=? and id=?
+   </sql-query> 
+   
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/CompositeIdId.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/CompositeIdId.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/CompositeIdId.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/CompositeIdId.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,55 @@
+/*
+ * Created on 20-Dec-2004
+ *
+ */
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+
+/**
+ * @author max
+ *
+ */
+public class CompositeIdId implements Serializable {
+
+    String system;
+    String id;
+    String name;
+    CompositeElement composite;
+    
+    
+    public String getId() {
+        return id;
+    }
+    public void setId(String id) {
+        this.id = id;
+    }
+    public String getSystem() {
+        return system;
+    }
+    public void setSystem(String system) {
+        this.system = system;
+    }
+    public String getName() {
+        return name;
+    }
+    public void setName(String name) {
+        this.name = name;
+    }
+    
+    /* (non-Javadoc)
+     * @see java.lang.Object#equals(java.lang.Object)
+     */
+    public boolean equals(Object obj) {
+        // not totally NP or type safe equals, but enough for the unittests. 
+        CompositeIdId o = (CompositeIdId) obj;
+        if(o==null) return false;
+        return o.getSystem().equals(getSystem()) && o.getId().equals(getId());
+    }
+    public CompositeElement getComposite() {
+        return composite;
+    }
+    public void setComposite(CompositeElement composite) {
+        this.composite = composite;
+    }
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/CompositeIdId.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Contained.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Contained.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Contained.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,90 @@
+//$Id: Contained.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+public class Contained {
+	private Container container;
+	private long id;
+	private Collection bag = new ArrayList();
+	private Collection lazyBag = new ArrayList();
+	
+	public boolean equals(Object other) {
+		return id==( (Contained) other ).getId();
+	}
+	public int hashCode() {
+		return new Long(id).hashCode();
+	}
+	
+	/**
+	 * Returns the container.
+	 * @return Container
+	 */
+	public Container getContainer() {
+		return container;
+	}
+	
+	/**
+	 * Returns the id.
+	 * @return long
+	 */
+	public long getId() {
+		return id;
+	}
+	
+	/**
+	 * Sets the container.
+	 * @param container The container to set
+	 */
+	public void setContainer(Container container) {
+		this.container = container;
+	}
+	
+	/**
+	 * Sets the id.
+	 * @param id The id to set
+	 */
+	public void setId(long id) {
+		this.id = id;
+	}
+	
+	/**
+	 * Returns the bag.
+	 * @return Collection
+	 */
+	public Collection getBag() {
+		return bag;
+	}
+	
+	/**
+	 * Sets the bag.
+	 * @param bag The bag to set
+	 */
+	public void setBag(Collection bag) {
+		this.bag = bag;
+	}
+	
+	/**
+	 * Returns the lazyBag.
+	 * @return Collection
+	 */
+	public Collection getLazyBag() {
+		return lazyBag;
+	}
+	
+	/**
+	 * Sets the lazyBag.
+	 * @param lazyBag The lazyBag to set
+	 */
+	public void setLazyBag(Collection lazyBag) {
+		this.lazyBag = lazyBag;
+	}
+	
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Contained.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Container.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Container.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Container.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,98 @@
+<?xml version="1.0"?>
+
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping default-lazy="false" auto-import="false">
+
+	<import class="org.hibernate.test.legacy.Container" rename="ContainerX"/>
+	<import class="org.hibernate.test.legacy.Contained"/>
+	<import class="java.lang.Object" rename="Universe"/>
+
+	<class name="org.hibernate.test.legacy.Container" proxy="org.hibernate.test.legacy.Container">
+		<id name="id" column="container_id" unsaved-value="0">
+			<generator class="native" />
+		</id>
+		<list name="oneToMany" lazy="true">
+			<key column = "container_id1"/>
+			<index column = "list_index"/>
+			<one-to-many class="org.hibernate.test.legacy.Simple"/>
+		</list>
+		<list name="manyToMany" lazy="true">
+			<key column = "container_id2"/>
+			<index column = "list_index"/>
+			<many-to-many class="org.hibernate.test.legacy.Simple"/>
+		</list>
+		<list name="components" lazy="true">
+			<key column = "container_id"/>
+			<index column = "list_index"/>
+			<composite-element class="org.hibernate.test.legacy.Container$ContainerInnerClass">
+				<property name="name"/>
+				<property name="count" column="count_"/>
+				<many-to-one name="simple"/>
+				<many-to-one name="one"/>
+				<many-to-one name="many"/>
+			</composite-element>
+		</list>
+		<set name="composites" lazy="true">
+			<key column = "container_id"/>
+			<composite-element class="org.hibernate.test.legacy.Container$ContainerInnerClass">
+				<property name="name"/>
+				<many-to-one name="simple"/>
+				<many-to-one name="one"/>
+				<many-to-one name="many"/>
+			</composite-element>
+		</set>
+		<bag name="cascades" cascade="all" table="abcd">
+			<key column="container_id"/>
+			<composite-element class="org.hibernate.test.legacy.Container$ContainerInnerClass">
+				<property name="name"/>
+				<many-to-one name="simple" cascade="all"/>
+				<many-to-one name="one" cascade="all" not-null="true"/>
+				<many-to-one name="many" cascade="all" not-null="true"/>
+			</composite-element>
+		</bag>
+		<bag name="bag" inverse="true" cascade="save-update" table="CCBAG">
+			<key column="container_id"/>
+			<many-to-many column="contained_id" class="org.hibernate.test.legacy.Contained" outer-join="true"/>
+		</bag>
+		<bag name="lazyBag" inverse="true" lazy="true" table="LCCBAG" cascade="save-update">
+			<!--cache usage="read-write"-->
+			<key column="container_id"/>
+			<many-to-many column="contained_id" class="org.hibernate.test.legacy.Contained"/>
+		</bag>
+		<map name="ternaryMap">
+			<key column="container_id"/>
+			<index column="idx" type="string" length="32"/>
+			<composite-element class="org.hibernate.test.legacy.Container$Ternary">
+				<property name="name"/>
+				<many-to-one name="foo"/>
+				<many-to-one name="glarch"/>
+			</composite-element>
+		</map>
+		<set name="ternarySet">
+			<key column="container_id"/>
+			<composite-element class="org.hibernate.test.legacy.Container$Ternary">
+				<property name="name" not-null="true"/>
+				<many-to-one name="foo" not-null="true"/>
+				<many-to-one name="glarch" not-null="true"/>
+			</composite-element>
+		</set>
+	</class>
+	
+	<class name="org.hibernate.test.legacy.Contained" proxy="org.hibernate.test.legacy.Contained">
+		<id name="id" column="container_id" unsaved-value="0">
+			<generator class="native" />
+		</id>
+		<bag name="bag" table="CCBAG">
+			<key column="contained_id"/>
+			<many-to-many column="container_id" class="org.hibernate.test.legacy.Container" outer-join="false"/>
+		</bag>
+		<bag name="lazyBag" lazy="true" table="LCCBAG">
+			<key column="contained_id"/>
+			<many-to-many column="container_id" class="org.hibernate.test.legacy.Container"/>
+		</bag>
+	</class>
+	
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Container.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Container.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Container.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Container.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,351 @@
+//$Id: Container.java 6844 2005-05-21 14:22:16Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public class Container {
+	
+	public static final class ContainerInnerClass {
+		private Simple simple;
+		private String name;
+		private One one;
+		private Many many;
+		private int count;
+		
+		public void setSimple(Simple simple) {
+			this.simple = simple;
+		}
+		
+		public Simple getSimple() {
+			return simple;
+		}
+		/**
+		 * Returns the name.
+		 * @return String
+		 */
+		public String getName() {
+			return name;
+		}
+		
+		/**
+		 * Sets the name.
+		 * @param name The name to set
+		 */
+		public void setName(String name) {
+			this.name = name;
+		}
+		
+		public String toString() {
+			return name + " = " 
+			+ (simple==null ? "nil" : Integer.toString( simple.getCount() ) )
+			+ "/" + ( one==null ? "nil" : one.getKey().toString() )
+			+ "/" + ( many==null ? "nil" : many.getKey().toString() );
+		}
+		
+		
+		/**
+		 * Returns the one.
+		 * @return One
+		 */
+		public One getOne() {
+			return one;
+		}
+		
+		/**
+		 * Sets the one.
+		 * @param one The one to set
+		 */
+		public void setOne(One one) {
+			this.one = one;
+		}
+		
+		/**
+		 * Returns the many.
+		 * @return Many
+		 */
+		public Many getMany() {
+			return many;
+		}
+		
+		/**
+		 * Sets the many.
+		 * @param many The many to set
+		 */
+		public void setMany(Many many) {
+			this.many = many;
+		}
+		
+		/**
+		 * Returns the count.
+		 * @return int
+		 */
+		public int getCount() {
+			return count;
+		}
+
+		/**
+		 * Sets the count.
+		 * @param count The count to set
+		 */
+		public void setCount(int count) {
+			this.count = count;
+		}
+		
+		public int hashCode() {
+			return count + name.hashCode();
+		}
+		
+		public boolean equals(Object other) {
+			ContainerInnerClass cic = (ContainerInnerClass) other;
+			return cic.name.equals(name) 
+				&& cic.count==count 
+				&& cic.one.getKey().equals(one.getKey())
+				&& cic.many.getKey().equals(many.getKey())
+				&& cic.simple.getCount()==simple.getCount();
+		}
+
+	}
+	
+	private List oneToMany;
+	private List manyToMany;
+	private List components;
+	private Set composites;
+	private Collection cascades;
+	private long id;
+	private Collection bag;
+	private Collection lazyBag = new ArrayList();
+	private Map ternaryMap;
+	private Set ternarySet;
+	
+	/**
+	 * Constructor for Container.
+	 */
+	public Container() {
+		super();
+	}
+	
+	/**
+	 * Returns the components.
+	 * @return List
+	 */
+	public List getComponents() {
+		return components;
+	}
+	
+	/**
+	 * Returns the manyToMany.
+	 * @return List
+	 */
+	public List getManyToMany() {
+		return manyToMany;
+	}
+	
+	/**
+	 * Returns the oneToMany.
+	 * @return List
+	 */
+	public List getOneToMany() {
+		return oneToMany;
+	}
+	
+	/**
+	 * Sets the components.
+	 * @param components The components to set
+	 */
+	public void setComponents(List components) {
+		this.components = components;
+	}
+	
+	/**
+	 * Sets the manyToMany.
+	 * @param manyToMany The manyToMany to set
+	 */
+	public void setManyToMany(List manyToMany) {
+		this.manyToMany = manyToMany;
+	}
+	
+	/**
+	 * Sets the oneToMany.
+	 * @param oneToMany The oneToMany to set
+	 */
+	public void setOneToMany(List oneToMany) {
+		this.oneToMany = oneToMany;
+	}
+	
+	/**
+	 * Returns the id.
+	 * @return long
+	 */
+	public long getId() {
+		return id;
+	}
+	
+	/**
+	 * Sets the id.
+	 * @param id The id to set
+	 */
+	public void setId(long id) {
+		this.id = id;
+	}
+	
+	/**
+	 * Gets the composites.
+	 * @return Returns a Set
+	 */
+	public Set getComposites() {
+		return composites;
+	}
+	
+	/**
+	 * Sets the composites.
+	 * @param composites The composites to set
+	 */
+	public void setComposites(Set composites) {
+		this.composites = composites;
+	}
+	
+	/**
+	 * Returns the bag.
+	 * @return Collection
+	 */
+	public Collection getBag() {
+		return bag;
+	}
+	
+	/**
+	 * Sets the bag.
+	 * @param bag The bag to set
+	 */
+	public void setBag(Collection bag) {
+		this.bag = bag;
+	}
+	
+	/**
+	 * Returns the ternary.
+	 * @return Map
+	 */
+	public Map getTernaryMap() {
+		return ternaryMap;
+	}
+	
+	/**
+	 * Sets the ternary.
+	 * @param ternary The ternary to set
+	 */
+	public void setTernaryMap(Map ternary) {
+		this.ternaryMap = ternary;
+	}
+	
+	public static final class Ternary {
+		private String name;
+		private Foo foo;
+		private Glarch glarch;
+		/**
+		 * Returns the foo.
+		 * @return Foo
+		 */
+		public Foo getFoo() {
+			return foo;
+		}
+		
+		/**
+		 * Returns the glarch.
+		 * @return Glarch
+		 */
+		public Glarch getGlarch() {
+			return glarch;
+		}
+		
+		/**
+		 * Returns the name.
+		 * @return String
+		 */
+		public String getName() {
+			return name;
+		}
+		
+		/**
+		 * Sets the foo.
+		 * @param foo The foo to set
+		 */
+		public void setFoo(Foo foo) {
+			this.foo = foo;
+		}
+		
+		/**
+		 * Sets the glarch.
+		 * @param glarch The glarch to set
+		 */
+		public void setGlarch(Glarch glarch) {
+			this.glarch = glarch;
+		}
+		
+		/**
+		 * Sets the name.
+		 * @param name The name to set
+		 */
+		public void setName(String name) {
+			this.name = name;
+		}
+		
+	}
+	
+	/**
+	 * Returns the ternarySet.
+	 * @return Set
+	 */
+	public Set getTernarySet() {
+		return ternarySet;
+	}
+	
+	/**
+	 * Sets the ternarySet.
+	 * @param ternarySet The ternarySet to set
+	 */
+	public void setTernarySet(Set ternarySet) {
+		this.ternarySet = ternarySet;
+	}
+	
+	/**
+	 * Returns the lazyBag.
+	 * @return Collection
+	 */
+	public Collection getLazyBag() {
+		return lazyBag;
+	}
+	
+	/**
+	 * Sets the lazyBag.
+	 * @param lazyBag The lazyBag to set
+	 */
+	public void setLazyBag(Collection lazyBag) {
+		this.lazyBag = lazyBag;
+	}
+	
+	/**
+	 * Returns the cascades.
+	 * @return Collection
+	 */
+	public Collection getCascades() {
+		return cascades;
+	}
+
+	/**
+	 * Sets the cascades.
+	 * @param cascades The cascades to set
+	 */
+	public void setCascades(Collection cascades) {
+		this.cascades = cascades;
+	}
+
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Container.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Custom.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Custom.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Custom.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-lazy="false">
+
+    <class name="org.hibernate.test.legacy.Custom" persister="org.hibernate.test.legacy.CustomPersister">
+        <id type="string" name="id" column="id_" length="64" unsaved-value="null">
+            <generator class="uuid.hex"/>
+        </id>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Custom.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Custom.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Custom.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Custom.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,32 @@
+//$Id: Custom.java 7275 2005-06-22 18:58:16Z oneovthafew $
+package org.hibernate.test.legacy;
+
+
+public class Custom implements Cloneable {
+	String id;
+	private String name;
+	
+	public Object clone() {
+		try {
+			return super.clone();
+		}
+		catch (CloneNotSupportedException cnse) {
+			throw new RuntimeException();
+		}
+	}
+
+	void setName(String name) {
+		this.name = name;
+	}
+
+	String getName() {
+		return name;
+	}
+
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Custom.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/CustomPersister.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/CustomPersister.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/CustomPersister.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,676 @@
+//$Id: CustomPersister.java 11398 2007-04-10 14:54:07Z steve.ebersole at jboss.com $
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+import java.util.Hashtable;
+import java.util.Map;
+import java.util.Comparator;
+
+import org.hibernate.EntityMode;
+import org.hibernate.Hibernate;
+import org.hibernate.HibernateException;
+import org.hibernate.LockMode;
+import org.hibernate.MappingException;
+import org.hibernate.LockOptions;
+import org.hibernate.tuple.entity.EntityMetamodel;
+import org.hibernate.cache.access.EntityRegionAccessStrategy;
+import org.hibernate.cache.entry.CacheEntryStructure;
+import org.hibernate.cache.entry.UnstructuredCacheEntry;
+import org.hibernate.engine.CascadeStyle;
+import org.hibernate.engine.EntityKey;
+import org.hibernate.engine.Mapping;
+import org.hibernate.engine.SessionFactoryImplementor;
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.engine.TwoPhaseLoad;
+import org.hibernate.engine.ValueInclusion;
+import org.hibernate.event.EventSource;
+import org.hibernate.event.PostLoadEvent;
+import org.hibernate.event.PreLoadEvent;
+import org.hibernate.id.IdentifierGenerator;
+import org.hibernate.id.UUIDHexGenerator;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.metadata.ClassMetadata;
+import org.hibernate.persister.entity.EntityPersister;
+import org.hibernate.sql.QuerySelect;
+import org.hibernate.sql.Select;
+import org.hibernate.type.Type;
+import org.hibernate.type.VersionType;
+import org.hibernate.util.EqualsHelper;
+
+public class CustomPersister implements EntityPersister {
+
+	private static final Hashtable INSTANCES = new Hashtable();
+	private static final IdentifierGenerator GENERATOR = new UUIDHexGenerator();
+	
+	private SessionFactoryImplementor factory;
+
+	public CustomPersister(
+			PersistentClass model, 
+			EntityRegionAccessStrategy cacheAccessStrategy,
+			SessionFactoryImplementor factory, 
+			Mapping mapping) {
+		this.factory = factory;
+	}
+
+	public boolean hasLazyProperties() {
+		return false;
+	}
+
+	private void checkEntityMode(EntityMode entityMode) {
+		if ( EntityMode.POJO != entityMode ) {
+			throw new IllegalArgumentException( "Unhandled EntityMode : " + entityMode );
+		}
+	}
+
+	private void checkEntityMode(SessionImplementor session) {
+		checkEntityMode( session.getEntityMode() );
+	}
+
+	public boolean isInherited() {
+		return false;
+	}
+	
+	public SessionFactoryImplementor getFactory() {
+		return factory;
+	}
+
+	public Class getMappedClass() {
+		return Custom.class;
+	}
+
+	public void postInstantiate() throws MappingException {}
+
+	public String getEntityName() {
+		return Custom.class.getName();
+	}
+
+	public boolean isSubclassEntityName(String entityName) {
+		return Custom.class.getName().equals(entityName);
+	}
+
+	public boolean hasProxy() {
+		return false;
+	}
+
+	public boolean hasCollections() {
+		return false;
+	}
+
+	public boolean hasCascades() {
+		return false;
+	}
+
+	public boolean isMutable() {
+		return true;
+	}
+	
+	public boolean isSelectBeforeUpdateRequired() {
+		return false;
+	}
+
+	public boolean isIdentifierAssignedByInsert() {
+		return false;
+	}
+
+	public Boolean isTransient(Object object, SessionImplementor session) {
+		return new Boolean( ( (Custom) object ).id==null );
+	}
+
+	public Object[] getPropertyValuesToInsert(Object object, Map mergeMap, SessionImplementor session)
+	throws HibernateException {
+		return getPropertyValues( object, session.getEntityMode() );
+	}
+
+	public void processInsertGeneratedProperties(Serializable id, Object entity, Object[] state, SessionImplementor session) {
+	}
+
+	public void processUpdateGeneratedProperties(Serializable id, Object entity, Object[] state, SessionImplementor session) {
+	}
+
+	public void retrieveGeneratedProperties(Serializable id, Object entity, Object[] state, SessionImplementor session) {
+		throw new UnsupportedOperationException();
+	}
+
+	public Class getMappedClass(EntityMode entityMode) {
+		checkEntityMode( entityMode );
+		return Custom.class;
+	}
+
+	public boolean implementsLifecycle(EntityMode entityMode) {
+		checkEntityMode( entityMode );
+		return false;
+	}
+
+	public boolean implementsValidatable(EntityMode entityMode) {
+		checkEntityMode( entityMode );
+		return false;
+	}
+
+	public Class getConcreteProxyClass(EntityMode entityMode) {
+		checkEntityMode( entityMode );
+		return Custom.class;
+	}
+
+	public void setPropertyValues(Object object, Object[] values, EntityMode entityMode) throws HibernateException {
+		checkEntityMode( entityMode );
+		setPropertyValue( object, 0, values[0], entityMode );
+	}
+
+	public void setPropertyValue(Object object, int i, Object value, EntityMode entityMode) throws HibernateException {
+		checkEntityMode( entityMode );
+		( (Custom) object ).setName( (String) value );
+	}
+
+	public Object[] getPropertyValues(Object object, EntityMode entityMode) throws HibernateException {
+		checkEntityMode( entityMode );
+		Custom c = (Custom) object;
+		return new Object[] { c.getName() };
+	}
+
+	public Object getPropertyValue(Object object, int i, EntityMode entityMode) throws HibernateException {
+		checkEntityMode( entityMode );
+		return ( (Custom) object ).getName();
+	}
+
+	public Object getPropertyValue(Object object, String propertyName, EntityMode entityMode) throws HibernateException {
+		checkEntityMode( entityMode );
+		return ( (Custom) object ).getName();
+	}
+
+	public Serializable getIdentifier(Object object, EntityMode entityMode) throws HibernateException {
+		checkEntityMode( entityMode );
+		return ( (Custom) object ).id;
+	}
+
+	public Serializable getIdentifier(Object entity, SessionImplementor session) {
+		checkEntityMode( session );
+		return ( (Custom) entity ).id;
+	}
+
+	public void setIdentifier(Object object, Serializable id, EntityMode entityMode) throws HibernateException {
+		checkEntityMode( entityMode );
+		( (Custom) object ).id = (String) id;
+	}
+
+	public void setIdentifier(Object entity, Serializable id, SessionImplementor session) {
+		checkEntityMode( session );
+		( (Custom) entity ).id = (String) id;
+	}
+
+	public Object getVersion(Object object, EntityMode entityMode) throws HibernateException {
+		checkEntityMode( entityMode );
+		return null;
+	}
+
+	public Object instantiate(Serializable id, EntityMode entityMode) throws HibernateException {
+		checkEntityMode( entityMode );
+		return instantiate( id );
+	}
+
+	private Object instantiate(Serializable id) {
+		Custom c = new Custom();
+		c.id = (String) id;
+		return c;
+	}
+
+	public Object instantiate(Serializable id, SessionImplementor session) {
+		checkEntityMode( session );
+		return instantiate( id );
+	}
+
+	public boolean isInstance(Object object, EntityMode entityMode) {
+		checkEntityMode( entityMode );
+		return object instanceof Custom;
+	}
+
+	public boolean hasUninitializedLazyProperties(Object object, EntityMode entityMode) {
+		checkEntityMode( entityMode );
+		return false;
+	}
+
+	public void resetIdentifier(Object entity, Serializable currentId, Object currentVersion, EntityMode entityMode) {
+		checkEntityMode( entityMode );
+		( ( Custom ) entity ).id = ( String ) currentId;
+	}
+
+	public void resetIdentifier(Object entity, Serializable currentId, Object currentVersion, SessionImplementor session) {
+		checkEntityMode( session );
+		( ( Custom ) entity ).id = ( String ) currentId;
+	}
+
+	public EntityPersister getSubclassEntityPersister(Object instance, SessionFactoryImplementor factory, EntityMode entityMode) {
+		checkEntityMode( entityMode );
+		return this;
+	}
+
+	public int[] findDirty(
+		Object[] x,
+		Object[] y,
+		Object owner,
+		SessionImplementor session
+	) throws HibernateException {
+		if ( !EqualsHelper.equals( x[0], y[0] ) ) {
+			return new int[] { 0 };
+		}
+		else {
+			return null;
+		}
+	}
+
+	public int[] findModified(
+		Object[] x,
+		Object[] y,
+		Object owner,
+		SessionImplementor session
+	) throws HibernateException {
+		if ( !EqualsHelper.equals( x[0], y[0] ) ) {
+			return new int[] { 0 };
+		}
+		else {
+			return null;
+		}
+	}
+
+	/**
+	 * @see EntityPersister#hasIdentifierProperty()
+	 */
+	public boolean hasIdentifierProperty() {
+		return true;
+	}
+
+	/**
+	 * @see EntityPersister#isVersioned()
+	 */
+	public boolean isVersioned() {
+		return false;
+	}
+
+	/**
+	 * @see EntityPersister#getVersionType()
+	 */
+	public VersionType getVersionType() {
+		return null;
+	}
+
+	/**
+	 * @see EntityPersister#getVersionProperty()
+	 */
+	public int getVersionProperty() {
+		return 0;
+	}
+
+	/**
+	 * @see EntityPersister#getIdentifierGenerator()
+	 */
+	public IdentifierGenerator getIdentifierGenerator()
+	throws HibernateException {
+		return GENERATOR;
+	}
+
+	/**
+	 * @see EntityPersister#load(Serializable, Object, org.hibernate.LockOptions , SessionImplementor)
+	 */
+	public Object load(
+		Serializable id,
+		Object optionalObject,
+		LockOptions lockOptions,
+		SessionImplementor session
+	) throws HibernateException {
+		return load(id, optionalObject, lockOptions.getLockMode(), session);
+	}
+
+	/**
+	 * @see EntityPersister#load(Serializable, Object, LockMode, SessionImplementor)
+	 */
+	public Object load(
+		Serializable id,
+		Object optionalObject,
+		LockMode lockMode,
+		SessionImplementor session
+	) throws HibernateException {
+
+		// fails when optional object is supplied
+
+		Custom clone = null;
+		Custom obj = (Custom) INSTANCES.get(id);
+		if (obj!=null) {
+			clone = (Custom) obj.clone();
+			TwoPhaseLoad.addUninitializedEntity( 
+					new EntityKey( id, this, session.getEntityMode() ), 
+					clone, 
+					this, 
+					LockMode.NONE, 
+					false,
+					session
+				);
+			TwoPhaseLoad.postHydrate(
+					this, id, 
+					new String[] { obj.getName() }, 
+					null, 
+					clone, 
+					LockMode.NONE, 
+					false, 
+					session
+				);
+			TwoPhaseLoad.initializeEntity( 
+					clone, 
+					false, 
+					session, 
+					new PreLoadEvent( (EventSource) session ), 
+					new PostLoadEvent( (EventSource) session ) 
+				);
+		}
+		return clone;
+	}
+
+	/**
+	 * @see EntityPersister#lock(Serializable, Object, Object, LockMode, SessionImplementor)
+	 */
+	public void lock(
+		Serializable id,
+		Object version,
+		Object object,
+		LockOptions lockOptions,
+		SessionImplementor session
+	) throws HibernateException {
+
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * @see EntityPersister#lock(Serializable, Object, Object, LockMode, SessionImplementor)
+	 */
+	public void lock(
+		Serializable id,
+		Object version,
+		Object object,
+		LockMode lockMode,
+		SessionImplementor session
+	) throws HibernateException {
+
+		throw new UnsupportedOperationException();
+	}
+
+	public void insert(
+		Serializable id,
+		Object[] fields,
+		Object object,
+		SessionImplementor session
+	) throws HibernateException {
+
+		INSTANCES.put(id, ( (Custom) object ).clone() );
+	}
+
+	public Serializable insert(Object[] fields, Object object, SessionImplementor session)
+	throws HibernateException {
+
+		throw new UnsupportedOperationException();
+	}
+
+	public void delete(
+		Serializable id,
+		Object version,
+		Object object,
+		SessionImplementor session
+	) throws HibernateException {
+
+		INSTANCES.remove(id);
+	}
+
+	/**
+	 * @see EntityPersister
+	 */
+	public void update(
+		Serializable id,
+		Object[] fields,
+		int[] dirtyFields,
+		boolean hasDirtyCollection,
+		Object[] oldFields,
+		Object oldVersion,
+		Object object,
+		Object rowId,
+		SessionImplementor session
+	) throws HibernateException {
+
+		INSTANCES.put( id, ( (Custom) object ).clone() );
+
+	}
+
+	private static final Type[] TYPES = new Type[] { Hibernate.STRING };
+	private static final String[] NAMES = new String[] { "name" };
+	private static final boolean[] MUTABILITY = new boolean[] { true };
+	private static final boolean[] GENERATION = new boolean[] { false };
+
+	/**
+	 * @see EntityPersister#getPropertyTypes()
+	 */
+	public Type[] getPropertyTypes() {
+		return TYPES;
+	}
+
+	/**
+	 * @see EntityPersister#getPropertyNames()
+	 */
+	public String[] getPropertyNames() {
+		return NAMES;
+	}
+
+	/**
+	 * @see EntityPersister#getPropertyCascadeStyles()
+	 */
+	public CascadeStyle[] getPropertyCascadeStyles() {
+		return null;
+	}
+
+	/**
+	 * @see EntityPersister#getIdentifierType()
+	 */
+	public Type getIdentifierType() {
+		return Hibernate.STRING;
+	}
+
+	/**
+	 * @see EntityPersister#getIdentifierPropertyName()
+	 */
+	public String getIdentifierPropertyName() {
+		return "id";
+	}
+
+	public boolean hasCache() {
+		return false;
+	}
+
+	public EntityRegionAccessStrategy getCacheAccessStrategy() {
+		return null;
+	}
+
+	public String getRootEntityName() {
+		return "CUSTOMS";
+	}
+
+	public Serializable[] getPropertySpaces() {
+		return new String[] { "CUSTOMS" };
+	}
+
+	public Serializable[] getQuerySpaces() {
+		return new String[] { "CUSTOMS" };
+	}
+
+	/**
+	 * @see EntityPersister#getClassMetadata()
+	 */
+	public ClassMetadata getClassMetadata() {
+		return null;
+	}
+
+	public boolean[] getPropertyUpdateability() {
+		return MUTABILITY;
+	}
+
+	public boolean[] getPropertyCheckability() {
+		return MUTABILITY;
+	}
+
+	/**
+	 * @see EntityPersister#getPropertyInsertability()
+	 */
+	public boolean[] getPropertyInsertability() {
+		return MUTABILITY;
+	}
+
+	public ValueInclusion[] getPropertyInsertGenerationInclusions() {
+		return new ValueInclusion[0];
+	}
+
+	public ValueInclusion[] getPropertyUpdateGenerationInclusions() {
+		return new ValueInclusion[0];
+	}
+
+
+	public boolean canExtractIdOutOfEntity() {
+		return true;
+	}
+
+	public boolean isBatchLoadable() {
+		return false;
+	}
+
+	public Type getPropertyType(String propertyName) {
+		throw new UnsupportedOperationException();
+	}
+
+	public Object getPropertyValue(Object object, String propertyName)
+		throws HibernateException {
+		throw new UnsupportedOperationException();
+	}
+
+	public Object createProxy(Serializable id, SessionImplementor session)
+		throws HibernateException {
+		throw new UnsupportedOperationException("no proxy for this class");
+	}
+
+	public Object getCurrentVersion(
+		Serializable id,
+		SessionImplementor session)
+		throws HibernateException {
+
+		return INSTANCES.get(id);
+	}
+
+	public Object forceVersionIncrement(Serializable id, Object currentVersion, SessionImplementor session)
+			throws HibernateException {
+		return null;
+	}
+
+	public EntityMode guessEntityMode(Object object) {
+		if ( !isInstance(object, EntityMode.POJO) ) {
+			return null;
+		}
+		else {
+			return EntityMode.POJO;
+		}
+	}
+
+	public boolean[] getPropertyNullability() {
+		return MUTABILITY;
+	}
+
+	public boolean isDynamic() {
+		return false;
+	}
+
+	public boolean isCacheInvalidationRequired() {
+		return false;
+	}
+
+	public void applyFilters(QuerySelect select, String alias, Map filters) {
+	}
+
+	public void applyFilters(Select select, String alias, Map filters) {
+	}
+	
+	
+	public void afterInitialize(Object entity, boolean fetched, SessionImplementor session) {
+	}
+
+	public void afterReassociate(Object entity, SessionImplementor session) {
+	}
+
+	public Object[] getDatabaseSnapshot(Serializable id, SessionImplementor session) 
+	throws HibernateException {
+		return null;
+	}
+	
+	public boolean[] getPropertyVersionability() {
+		return MUTABILITY;
+	}
+
+	public CacheEntryStructure getCacheEntryStructure() {
+		return new UnstructuredCacheEntry();
+	}
+
+	public boolean hasSubselectLoadableCollections() {
+		return false;
+	}
+
+	public int[] getNaturalIdentifierProperties() {
+		return null;
+	}
+
+	public Type[] getNaturalIdentifierTypes() {
+		return null;
+	}
+
+	public boolean hasNaturalIdentifier() {
+		return false;
+	}
+
+	public boolean hasMutableProperties() {
+		return false;
+	}
+
+	public boolean isInstrumented(EntityMode entityMode) {
+		return false;
+	}
+
+	public boolean hasInsertGeneratedProperties() {
+		return false;
+	}
+
+	public boolean hasUpdateGeneratedProperties() {
+		return false;
+	}
+
+	public boolean[] getPropertyLaziness() {
+		return null;
+	}
+
+	public boolean isLazyPropertiesCacheable() {
+		return true;
+	}
+
+	public boolean hasGeneratedProperties() {
+		return false;
+	}
+
+	public boolean isVersionPropertyGenerated() {
+		return false;
+	}
+
+	public String[] getOrphanRemovalOneToOnePaths() {
+		return null;
+	}
+
+	public Object[] getNaturalIdentifierSnapshot(Serializable id, SessionImplementor session) throws HibernateException {
+		return null;
+	}
+
+	public Comparator getVersionComparator() {
+		return null;
+	}
+
+	public EntityMetamodel getEntityMetamodel() {
+		return null;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/CustomPersister.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/CustomSQL.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/CustomSQL.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/CustomSQL.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,104 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-lazy="false" package="org.hibernate.test.legacy">
+	<class name="Role">
+
+		<id name="id" type="long">
+			<generator class="native"/>
+		</id>
+		
+		<property name="name" type="string"/>
+		
+		<set name="interventions" lazy="true" cascade="all">
+			<key column="role_id"/>
+			<one-to-many class="Intervention"/>
+			<sql-insert callable="false">/* max comment */
+				update Intervention set role_id=? where id=?</sql-insert>
+			<sql-delete callable="false">update Intervention set role_id=null where role_id=? and id=?</sql-delete>
+			<sql-delete-all callable="false">update Intervention set role_id=null where role_id=?</sql-delete-all>
+		</set>
+		
+		<list name="bunchOfStrings">			
+			<key column="GROUPID"/>
+			<index column="posn"/>
+		    <element column="NAME" type="string"/>
+			<sql-insert callable="true">{ ? = call createRoleBunchOfStrings(?, ?, ?)}</sql-insert>
+			<sql-update callable="true">{ ? = call updateRoleBunchOfStrings(?, ?, ?)}</sql-update>
+			<sql-delete callable="true">{ ? = call deleteRoleBunchOfString(?, ?)}</sql-delete>
+			<sql-delete-all callable="true">{ ? = call deleteAllRoleBunchOfString(?)}</sql-delete-all>
+		</list>
+		
+<!--		<sql-load   callable="true">{ call loadPatient (?)}</sql-load>
+		<sql-insert callable="true">{call createPatient (?, ?, ?, ?)}</sql-insert>
+		<sql-delete callable="true">{? = call deletePatient (?)}</sql-delete> 
+		<sql-update callable="true">{? = call updatePatient (?, ?, ?, ?)}</sql-update> -->
+<!--	<sql-insert callable="true">insert </sql-insert> -->
+<!--		<sql-delete>delete from Role where values (?, upper(?)) /** i did this */</sql-insert>   -->
+		<sql-insert>insert into Role (name, id) values (?, upper(?)) /** i did this */</sql-insert>  
+<!--		<sql-update>update</sql-update>-->
+		<sql-delete>delete from Role where id=?</sql-delete>
+		
+	</class>	
+	
+	<class name="Resource" table="ecruoser">
+		<id name="id" type="string">
+			<generator class="uuid.hex"/>
+		</id>
+		
+		<discriminator column="discriminator" type="string"/>
+		
+		<property name="name" type="string"/>
+		<property name="userCode" type="string"/>
+		
+		<subclass name="Drug">
+			
+		</subclass>
+	</class>
+	
+	<class name="Party">
+		<id name="id" type="string">
+			<generator class="uuid.hex"/>
+		</id>
+		<discriminator column="discriminator" type="string"/>
+		<join table="partyjointable">
+			<key column="partyid"/>
+     		<property name="name" column="xname" type="string"/>
+	    	<property name="address" type="string"/>
+			<sql-insert callable="true">{ call createJoinTable(?, ?, ?) }</sql-insert>			
+			<sql-update callable="true">{ ? = call updateJoinTable(?, ?, ?) }</sql-update> <!-- xname, address, partyid -->
+			<sql-delete callable="true">{ ? = call deleteJoinTable(?) }</sql-delete> <!-- partyid -->
+		</join>
+							
+		<subclass name="Person">
+			<property name="givenName" type="string"/>			
+			<property name="lastName" type="string"/>		
+			<property name="nationalID" unique="true" type="string"/>
+		</subclass>		
+
+		<subclass name="Company">
+		   <property name="president" type="string"/>
+		</subclass>				
+	</class>
+	
+	<class name="Intervention">
+		<id name="id" type="string">
+			<generator class="uuid.hex"/>
+		</id>
+		
+		<version name="version" type="long"/>
+		
+		<property name="description" type="string"/>
+		
+		<joined-subclass name="Medication">
+			<key column="interventionid"/>
+			<many-to-one name="prescribedDrug" class="org.hibernate.test.legacy.Drug"/>			
+			<sql-insert>insert into /** put weird comments here */ Medication (prescribedDrug, interventionid) values (?, ?)</sql-insert> 
+		</joined-subclass>
+		
+	</class>
+	
+	
+	
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/CustomSQL.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/CustomSQLTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/CustomSQLTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/CustomSQLTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,216 @@
+//$Id: CustomSQLTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.legacy;
+
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.HibernateException;
+import org.hibernate.id.PostInsertIdentifierGenerator;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.classic.Session;
+
+/**
+ * @author MAX
+ *
+ */
+public class CustomSQLTest extends LegacyTestCase {
+
+	public CustomSQLTest(String name) {
+		super(name);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "legacy/CustomSQL.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( CustomSQLTest.class );
+	}
+
+	private boolean isUsingIdentity() {
+		return PostInsertIdentifierGenerator.class.isAssignableFrom( getDialect().getNativeIdentifierGeneratorClass() );
+	}
+
+	public void testInsert() throws HibernateException, SQLException {
+		if ( isUsingIdentity() ) {
+			reportSkip( "hand sql expecting non-identity id gen", "Custom SQL" );
+			return;
+		}
+
+		Role p = new Role();
+
+		p.setName("Patient");
+
+		Session s = openSession();
+
+		s.save(p);
+		s.flush();
+
+		s.connection().commit();
+		s.close();
+
+		getSessions().evict(Role.class);
+		s = openSession();
+
+		Role p2 = (Role) s.get(Role.class, new Long(p.getId()));
+		assertNotSame(p, p2);
+		assertEquals(p2.getId(),p.getId());
+		assertTrue(p2.getName().equalsIgnoreCase(p.getName()));
+		s.delete(p2);
+		s.flush();
+
+
+		s.connection().commit();
+		s.close();
+
+
+	}
+
+	public void testJoinedSubclass() throws HibernateException, SQLException {
+		Medication m = new Medication();
+
+		m.setPrescribedDrug(new Drug());
+
+		m.getPrescribedDrug().setName("Morphine");
+
+
+		Session s = openSession();
+
+		s.save(m.getPrescribedDrug());
+		s.save(m);
+
+		s.flush();
+		s.connection().commit();
+		s.close();
+		s = openSession();
+
+		Medication m2  = (Medication) s.get(Medication.class, m.getId());
+		assertNotSame(m, m2);
+
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+	}
+
+	public void testCollectionCUD() throws HibernateException, SQLException {
+		if ( isUsingIdentity() ) {
+			reportSkip( "hand sql expecting non-identity id gen", "Custom SQL" );
+			return;
+		}
+
+		Role role = new Role();
+
+		role.setName("Jim Flanders");
+
+		Intervention iv = new Medication();
+		iv.setDescription("JF medical intervention");
+
+		role.getInterventions().add(iv);
+
+		List sx = new ArrayList();
+		sx.add("somewhere");
+		sx.add("somehow");
+		sx.add("whatever");
+		role.setBunchOfStrings(sx);
+
+		Session s = openSession();
+
+		s.save(role);
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		s = openSession();
+
+		Role r = (Role) s.get(Role.class,new Long(role.getId()));
+		assertNotSame(role,r);
+
+		assertEquals(1,r.getInterventions().size());
+
+		assertEquals(3, r.getBunchOfStrings().size());
+
+		r.getBunchOfStrings().set(1, "replacement");
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		s = openSession();
+
+		r = (Role) s.get(Role.class,new Long(role.getId()));
+		assertNotSame(role,r);
+
+		assertEquals(r.getBunchOfStrings().get(1),"replacement");
+		assertEquals(3, r.getBunchOfStrings().size());
+
+		r.getBunchOfStrings().set(1, "replacement");
+
+		r.getBunchOfStrings().remove(1);
+		s.flush();
+
+		r.getBunchOfStrings().clear();
+		s.flush();
+
+		s.connection().commit();
+		s.close();
+
+	}
+
+	public void testCRUD() throws HibernateException, SQLException {
+		if ( isUsingIdentity() ) {
+			reportSkip( "hand sql expecting non-identity id gen", "Custom SQL" );
+			return;
+		}
+
+		Person p = new Person();
+
+		p.setName("Max");
+		p.setLastName("Andersen");
+		p.setNationalID("110974XYZ�");
+		p.setAddress("P. P. Street 8");
+
+		Session s = openSession();
+
+		s.save(p);
+		s.flush();
+
+		s.connection().commit();
+		s.close();
+
+		getSessions().evict(Person.class);
+		s = openSession();
+
+		Person p2 = (Person) s.get(Person.class, p.getId());
+		assertNotSame(p, p2);
+		assertEquals(p2.getId(),p.getId());
+		assertEquals(p2.getLastName(),p.getLastName());
+		s.flush();
+
+		List list = s.createQuery( "select p from Party as p" ).list();
+		assertTrue(list.size() == 1);
+
+		s.connection().commit();
+		s.close();
+
+		s = openSession();
+
+		list = s.createQuery( "select p from Person as p where p.address = 'L�rkev�nget 1'" ).list();
+		assertTrue(list.size() == 0);
+		p.setAddress("L�rkev�nget 1");
+		s.update(p);
+		list = s.createQuery( "select p from Person as p where p.address = 'L�rkev�nget 1'" ).list();
+		assertTrue(list.size() == 1);
+		list = s.createQuery( "select p from Party as p where p.address = 'P. P. Street 8'" ).list();
+		assertTrue(list.size() == 0);
+
+		s.delete(p);
+		list = s.createQuery( "select p from Person as p" ).list();
+		assertTrue(list.size() == 0);
+
+		s.connection().commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/CustomSQLTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/D.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/D.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/D.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,61 @@
+//$Id: D.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+public class D {
+	private Long id;
+	private float amount;
+	private A reverse;
+	public A inverse;
+	
+	public D() {
+		// try to induce an infinite loop in the lazy-loading machinery
+		setAmount(100.0f);
+		getAmount();
+	}	
+	/**
+	 * Returns the amount.
+	 * @return float
+	 */
+	public float getAmount() {
+		return amount;
+	}
+	
+	/**
+	 * Returns the id.
+	 * @return long
+	 */
+	public Long getId() {
+		return id;
+	}
+	
+	/**
+	 * Sets the amount.
+	 * @param amount The amount to set
+	 */
+	public void setAmount(float amount) {
+		this.amount = amount;
+	}
+	
+	/**
+	 * Sets the id.
+	 * @param id The id to set
+	 */
+	public void setId(Long id) {
+		this.id = id;
+	}
+	
+	public A getReverse() {
+		return reverse;
+	}
+
+	public void setReverse(A a) {
+		reverse = a;
+	}
+
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/D.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Detail.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Detail.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Detail.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,60 @@
+//$Id: Detail.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+
+public class Detail implements Serializable {
+	
+	private Master master;
+	private int i;
+	private Set details = new HashSet();
+	private int x;
+	
+	public int getX() {
+		return x;
+	}
+	public void setX(int x) {
+		this.x = x;
+	}
+	
+	public Master getMaster() {
+		return master;
+	}
+	
+	public void setMaster(Master master) {
+		this.master = master;
+	}
+	
+	public int getI() {
+		return i;
+	}
+	
+	public void setI(int i) {
+		this.i = i;
+	}
+	
+	/**
+	 * Returns the details.
+	 * @return Set
+	 */
+	public Set getSubDetails() {
+		return details;
+	}
+	
+	/**
+	 * Sets the details.
+	 * @param details The details to set
+	 */
+	public void setSubDetails(Set details) {
+		this.details = details;
+	}
+	
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Detail.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/DoubleStringType.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/DoubleStringType.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/DoubleStringType.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,106 @@
+//$Id: DoubleStringType.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+
+import org.hibernate.Hibernate;
+import org.hibernate.HibernateException;
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.type.StringType;
+import org.hibernate.type.Type;
+import org.hibernate.usertype.CompositeUserType;
+
+public class DoubleStringType implements CompositeUserType {
+
+	private static final int[] TYPES = { Types.VARCHAR, Types.VARCHAR };
+
+	public int[] sqlTypes() {
+		return TYPES;
+	}
+
+	public Class returnedClass() {
+		return String[].class;
+	}
+
+	public boolean equals(Object x, Object y) {
+		if (x==y) return true;
+		if (x==null || y==null) return false;
+		return ( (String[]) x )[0].equals( ( (String[]) y )[0] ) && ( (String[]) x )[1].equals( ( (String[]) y )[1] );
+	}
+
+	public int hashCode(Object x) throws HibernateException {
+		String[] a = (String[]) x;
+		return a[0].hashCode() + 31 * a[1].hashCode(); 
+	}
+
+	public Object deepCopy(Object x) {
+		if (x==null) return null;
+		String[] result = new String[2];
+		String[] input = (String[]) x;
+		result[0] = input[0];
+		result[1] = input[1];
+		return result;
+	}
+
+	public boolean isMutable() { return true; }
+
+	public Object nullSafeGet(ResultSet rs,	String[] names, SessionImplementor session,	Object owner)
+	throws HibernateException, SQLException {
+
+		String first = StringType.INSTANCE.nullSafeGet( rs, names[0], session );
+		String second = StringType.INSTANCE.nullSafeGet( rs, names[1], session );
+
+		return ( first==null && second==null ) ? null : new String[] { first, second };
+	}
+
+	public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session)
+	throws HibernateException, SQLException {
+
+		String[] strings = (value==null) ? new String[2] : (String[]) value;
+
+		StringType.INSTANCE.nullSafeSet( st, strings[0], index, session );
+		StringType.INSTANCE.nullSafeSet( st, strings[1], index+1, session );
+	}
+
+	public String[] getPropertyNames() {
+		return new String[] { "s1", "s2" };
+	}
+
+	public Type[] getPropertyTypes() {
+		return new Type[] { StringType.INSTANCE, StringType.INSTANCE };
+	}
+
+	public Object getPropertyValue(Object component, int property) {
+		return ( (String[]) component )[property];
+	}
+
+	public void setPropertyValue(
+		Object component,
+		int property,
+		Object value) {
+
+		( (String[]) component )[property] = (String) value;
+	}
+
+	public Object assemble(
+		Serializable cached,
+		SessionImplementor session,
+		Object owner) {
+
+		return deepCopy(cached);
+	}
+
+	public Serializable disassemble(Object value, SessionImplementor session) {
+		return (Serializable) deepCopy(value);
+	}
+	
+	public Object replace(Object original, Object target, SessionImplementor session, Object owner) 
+	throws HibernateException {
+		return original;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/DoubleStringType.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Down.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Down.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Down.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,20 @@
+//$Id: Down.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+
+/**
+ * @author Gavin King
+ */
+public class Down extends Up {
+
+	private long value;
+
+	public long getValue() {
+		return value;
+	}
+
+	public void setValue(long l) {
+		value = l;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Down.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Drug.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Drug.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Drug.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,20 @@
+package org.hibernate.test.legacy;
+
+/**
+ * @author hbm2java
+ */
+public class Drug extends org.hibernate.test.legacy.Resource {
+
+   java.lang.String id;
+
+
+  java.lang.String getId() {
+    return id;
+  }
+
+  void  setId(java.lang.String newValue) {
+    id = newValue;
+  }
+
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Drug.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/E.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/E.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/E.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,71 @@
+//$Id: E.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.util.Set;
+
+public class E {
+	private Long id;
+	private float amount;
+	private A reverse;
+	private Set as;
+	/**
+	 * Returns the amount.
+	 * @return float
+	 */
+	public float getAmount() {
+		return amount;
+	}
+	
+	/**
+	 * Returns the id.
+	 * @return long
+	 */
+	public Long getId() {
+		return id;
+	}
+	
+	/**
+	 * Sets the amount.
+	 * @param amount The amount to set
+	 */
+	public void setAmount(float amount) {
+		this.amount = amount;
+	}
+	
+	/**
+	 * Sets the id.
+	 * @param id The id to set
+	 */
+	public void setId(Long id) {
+		this.id = id;
+	}
+	
+	public A getReverse() {
+		return reverse;
+	}
+
+	public void setReverse(A a) {
+		reverse = a;
+	}
+
+	/**
+	 * @return Returns the as.
+	 */
+	public Set getAs() {
+		return as;
+	}
+
+	/**
+	 * @param as The as to set.
+	 */
+	public void setAs(Set as) {
+		this.as = as;
+	}
+
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/E.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Eye.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Eye.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Eye.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-lazy="false" 
+	default-cascade="save-update"
+	package="org.hibernate.test.legacy">
+	
+	<class name="Eye" lazy="true">
+		<id name="id" unsaved-value="0">
+			<generator class="hilo"/>
+		</id>
+		<property name="name"/>
+		<set name="jays" inverse="true" outer-join="true" cascade="all">
+			<key column="eye"/>
+			<one-to-many class="Jay"/>
+		</set>
+		<many-to-one name="jay" outer-join="true"/>
+	</class>
+	
+	<class name="Jay" lazy="true">
+		<id name="id" unsaved-value="0">
+			<generator class="hilo"/>
+		</id>
+		<many-to-one name="eye" outer-join="true"/>
+	</class>
+	
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Eye.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Eye.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Eye.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Eye.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,72 @@
+//$Id: Eye.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author Gavin King
+ */
+public class Eye {
+	private long id;
+	private String name;
+	private Jay jay;
+	private Set jays = new HashSet();
+
+	/**
+	 * @return Returns the id.
+	 */
+	public long getId() {
+		return id;
+	}
+
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	/**
+	 * @return Returns the jay.
+	 */
+	public Jay getJay() {
+		return jay;
+	}
+
+	/**
+	 * @param jay The jay to set.
+	 */
+	public void setJay(Jay jay) {
+		this.jay = jay;
+	}
+
+	/**
+	 * @return Returns the jays.
+	 */
+	public Set getJays() {
+		return jays;
+	}
+
+	/**
+	 * @param jays The jays to set.
+	 */
+	public void setJays(Set jays) {
+		this.jays = jays;
+	}
+
+	/**
+	 * @return Returns the name.
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * @param name The name to set.
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Eye.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fee.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fee.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fee.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-lazy="false">
+
+    <class name="org.hibernate.test.legacy.Fee" table="`the fees`">
+        <id type="string" name="key" column="id_" length="64" unsaved-value="null">
+            <generator class="uuid"/>
+        </id>
+        <property name="fi"/>
+        <many-to-one name="fee"/>
+        <many-to-one name="anotherFee"/>
+        <many-to-one name="qux" cascade="all"/>
+        <property name="count" column="count_"/>
+        <set name="fees">
+        	<key column="fee_id"/>
+        	<element column="str_" type="string" not-null="true"/>
+        </set>
+        <component name="compon" update="false">
+        	<property name="name"/>
+        	<property name="null" column="null_prop"/>
+        </component>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fee.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fee.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fee.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fee.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,98 @@
+//$Id: Fee.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+import java.util.Set;
+
+public class Fee implements Serializable {
+	public Fee fee;
+	public Fee anotherFee;
+	public String fi;
+	public String key;
+	public Set fees;
+	private Qux qux;
+	private FooComponent compon;
+	private int count;
+	
+	public Fee() {
+	}
+	
+	public Fee getFee() {
+		return fee;
+	}
+	
+	public void setFee(Fee fee) {
+		this.fee = fee;
+	}
+	
+	public String getFi() {
+		return fi;
+	}
+	
+	public void setFi(String fi) {
+		this.fi = fi;
+	}
+	
+	public String getKey() {
+		return key;
+	}
+	
+	public void setKey(String key) {
+		this.key = key;
+	}
+	
+	public Set getFees() {
+		return fees;
+	}
+	
+	public void setFees(Set fees) {
+		this.fees = fees;
+	}
+	
+	public Fee getAnotherFee() {
+		return anotherFee;
+	}
+	
+	public void setAnotherFee(Fee anotherFee) {
+		this.anotherFee = anotherFee;
+	}
+	
+	public Qux getQux() {
+		return qux;
+	}
+	
+	public void setQux(Qux qux) {
+		this.qux = qux;
+	}
+	
+	public FooComponent getCompon() {
+		return compon;
+	}
+	
+	public void setCompon(FooComponent compon) {
+		this.compon = compon;
+	}
+	
+	/**
+	 * Returns the count.
+	 * @return int
+	 */
+	public int getCount() {
+		return count;
+	}
+
+	/**
+	 * Sets the count.
+	 * @param count The count to set
+	 */
+	public void setCount(int count) {
+		this.count = count;
+	}
+
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fee.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fixed.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fixed.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fixed.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,31 @@
+//$Id: Fixed.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Gavin King
+ */
+public class Fixed extends Broken {
+	private Set set;
+	private List list = new ArrayList();
+
+	public Set getSet() {
+		return set;
+	}
+
+	public void setSet(Set set) {
+		this.set = set;
+	}
+
+	public List getList() {
+		return list;
+	}
+
+	public void setList(List list) {
+		this.list = list;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fixed.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fo.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fo.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fo.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-lazy="false">
+
+	<class name="org.hibernate.test.legacy.Fo" table="foes">
+		<composite-id class="org.hibernate.test.legacy.FumCompositeID">
+			<key-property name="string">
+				<column name="string_" length="20"/>
+			</key-property>
+			<key-property name="short" column="short_"/>
+			<key-property name="date" column="date_" type="date"/>
+		</composite-id>
+		<version name="version" type="long"/>
+		<property name="serial" column="serial_"/>
+		<property name="buf"/>
+		<property name="x"/>
+	</class>
+	
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fo.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fo.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fo.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fo.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,60 @@
+//$Id: Fo.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+
+public final class Fo {
+	
+	public static Fo newFo() {
+		return new Fo();
+	}
+	
+	private Fo() {}
+	
+	private byte[] buf;
+	private Serializable serial;
+	private long version;
+	private int x;
+	
+	public int getX() {
+		return x;
+	}
+	public void setX(int x) {
+		this.x = x;
+	}
+	
+	public byte[] getBuf() {
+		return buf;
+	}
+	
+	
+	public Serializable getSerial() {
+		return serial;
+	}
+	
+	
+	public void setBuf(byte[] buf) {
+		this.buf = buf;
+	}
+	
+	
+	public void setSerial(Serializable serial) {
+		this.serial = serial;
+	}
+	
+	public long getVersion() {
+		return version;
+	}
+	
+	public void setVersion(long version) {
+		this.version = version;
+	}
+	
+}
+
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fo.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Foo.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Foo.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Foo.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,437 @@
+//$Id: Foo.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+import java.sql.Timestamp;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Locale;
+
+import org.hibernate.CallbackException;
+import org.hibernate.Session;
+import org.hibernate.classic.Lifecycle;
+
+public class Foo implements Lifecycle, FooProxy, Serializable {
+
+	private static int count=0;
+
+	public static class Struct implements java.io.Serializable {
+		String name;
+		int count;
+		public boolean equals(Object other) {
+			Struct s = (Struct) other;
+			return ( s.name==name || s.name.equals(name) ) && s.count==count;
+		}
+		public int hashCode() {
+			return count;
+		}
+	}
+
+	/*public boolean equals(Object other) {
+		FooProxy otherFoo = (FooProxy) other;
+		return this.key.equals( otherFoo.getKey() ) && this._string.equals( otherFoo.getString() );
+	}
+
+	public int hashCode() {
+		return key.hashCode() - _string.hashCode();
+	}*/
+
+	String key;
+	FooProxy _foo;
+	String _string;
+	Date _date;
+	Date _timestamp;
+	Integer _integer;
+	Long _long;
+	Short _short;
+	Float _float;
+	Double _double;
+	Boolean _boolean;
+	Byte _byte;
+	Integer _null;
+	int _int;
+	boolean _bool;
+	float _zero;
+	byte[] _bytes;
+	boolean yesno;
+	java.io.Serializable blob;
+	java.io.Serializable nullBlob;
+	byte[] binary;
+	String[] custom;
+	FooComponent component;
+	char _char;
+	Fee dependent;
+	Locale theLocale;
+	private int version;
+	private Timestamp versionTimestamp;
+	private Calendar versionCalendar;
+	private float formula;
+	private String joinedProp;
+
+	private int x;
+
+	public int getX() {
+		return x;
+	}
+	public void setX(int x) {
+		this.x = x;
+	}
+
+	public Foo() {
+	}
+
+	public Foo(int x) {
+		this.x=x;
+	}
+
+	public boolean onSave(Session db) throws CallbackException {
+		_string = "a string";
+		_date = new Date(123);
+		_timestamp = new Date( System.currentTimeMillis() );
+		_integer = new Integer( -666 );
+		_long = new Long( 696969696969696969l - count++ );
+		_short = new Short("42");
+		_float = new Float( 6666.66f );
+		//_double = new Double( 1.33e-69 );  // this double is too big for the sap db jdbc driver
+		_double = new Double( 1.12e-36 );
+		_boolean = new Boolean(true);
+		_byte = new Byte( (byte) 127 );
+		_int = 2;
+		_char = '@';
+		_bytes = _string.getBytes();
+		Struct s = new Struct();
+		s.name="name";
+		s.count = 69;
+		blob = s;
+		binary = ( _string + "yada yada yada" ).getBytes();
+		custom = new String[] { "foo", "bar" };
+		component = new FooComponent("foo", 12, new Date[] { _date, _timestamp, null, new Date() }, new FooComponent("bar", 666, new Date[] { new Date(123456l), null }, null ) );
+		component.setGlarch( new Glarch() );
+		dependent = new Fee();
+		dependent.setFi( "belongs to foo # " + getKey() );
+		theLocale = Locale.getDefault();
+		return NO_VETO;
+	}
+
+	public boolean onDelete(Session db) throws CallbackException {
+		return NO_VETO;
+	}
+	public boolean onUpdate(Session db) throws CallbackException {
+		return NO_VETO;
+	}
+
+	public void onLoad(Session db, Serializable id) {
+	}
+
+	public String getKey() {
+		return key;
+	}
+	public void setKey(String key) {
+		this.key = key;
+	}
+
+	public FooProxy getFoo() {
+		return _foo;
+	}
+	public void setFoo(FooProxy foo) {
+		_foo = foo;
+	}
+
+	public String getString() {
+		return _string;
+	}
+	public void setString(String string) {
+		_string = string;
+		//if (_foo!=null) _foo.setString(string);
+	}
+
+	public java.util.Date getDate() {
+		return _date;
+	}
+	public void setDate(java.util.Date date) {
+		_date = date;
+	}
+
+	public java.util.Date getTimestamp() {
+		return _timestamp;
+	}
+	public void setTimestamp(java.util.Date timestamp) {
+		_timestamp = timestamp;
+	}
+
+	public Integer getInteger() {
+		return _integer;
+	}
+	public void setInteger(Integer iinteger) {
+		_integer = iinteger;
+	}
+	public Long getLong() {
+		return _long;
+	}
+	public void setLong(Long llong) {
+		_long = llong;
+	}
+
+
+	public Short getShort() {
+		return _short;
+	}
+	public void setShort(Short sshort) {
+		_short = sshort;
+	}
+	public Float getFloat() {
+		return _float;
+	}
+	public void setFloat(Float ffloat) {
+		_float = ffloat;
+	}
+	public Double getDouble() {
+		return _double;
+	}
+	public void setDouble(Double ddouble) {
+		_double = ddouble;
+	}
+	public Boolean getBoolean() {
+		return _boolean;
+	}
+	public void setBoolean(Boolean bboolean) {
+		_boolean = bboolean;
+	}
+	public byte[] getBytes() {
+		return _bytes;
+	}
+	public void setBytes(byte[] bytes) {
+		_bytes = bytes;
+	}
+	public float getZero() {
+		return _zero;
+	}
+	public void setZero(float zero) {
+		_zero = zero;
+	}
+	public boolean getBool() {
+		return _bool;
+	}
+	public void setBool(boolean bool) {
+		_bool = bool;
+	}
+
+	public int getInt() {
+		return _int;
+	}
+	public void setInt(int iint) {
+		_int = iint;
+	}
+
+	public Integer getNull() {
+		return _null;
+	}
+	public void setNull(Integer nnull) {
+		_null = nnull;
+	}
+
+	public Byte getByte() {
+		return _byte;
+	}
+
+	public void setByte(Byte bbyte) {
+		_byte = bbyte;
+	}
+
+	public String toString() {
+		return this.getClass().getName() + ": " + key;
+	}
+
+	public void disconnect() {
+		if ( _foo!=null) _foo.disconnect();
+		_foo=null;
+	}
+
+	public boolean equalsFoo(Foo other) {
+		if ( _bytes!=other._bytes ) {
+			if ( _bytes==null || other._bytes==null ) return false;
+			if ( _bytes.length!=other._bytes.length ) return false;
+			for ( int i=0; i< _bytes.length; i++) {
+				if ( _bytes[i] != other._bytes[i] ) return false;
+			}
+		}
+
+		return ( this._bool == other._bool )
+		&& ( ( this._boolean == other._boolean ) || ( this._boolean.equals(other._boolean) ) )
+		&& ( ( this._byte == other._byte ) || ( this._byte.equals(other._byte) ) )
+		//&& ( ( this._date == other._date ) || ( this._date.getDate() == other._date.getDate() && this._date.getMonth() == other._date.getMonth() && this._date.getYear() == other._date.getYear() ) )
+		&& ( ( this._double == other._double ) || ( this._double.equals(other._double) ) )
+		&& ( ( this._float == other._float ) || ( this._float.equals(other._float) ) )
+		&& ( this._int == other._int )
+		&& ( ( this._integer == other._integer ) || ( this._integer.equals(other._integer) ) )
+		&& ( ( this._long == other._long ) || ( this._long.equals(other._long) ) )
+		&& ( this._null == other._null )
+		&& ( ( this._short == other._short ) || ( this._short.equals(other._short) ) )
+		&& ( ( this._string == other._string) || ( this._string.equals(other._string) ) )
+		//&& ( ( this._timestamp==other._timestamp) || ( this._timestamp.getDate() == other._timestamp.getDate() && this._timestamp.getYear() == other._timestamp.getYear() && this._timestamp.getMonth() == other._timestamp.getMonth() ) )
+		&& ( this._zero == other._zero )
+		&& ( ( this._foo == other._foo ) || ( this._foo.getKey().equals( other._foo.getKey() ) ) )
+		&& ( ( this.blob == other.blob ) || ( this.blob.equals(other.blob) ) )
+		&& ( this.yesno == other.yesno )
+		&& ( ( this.binary == other.binary ) || java.util.Arrays.equals(this.binary, other.binary) )
+		&& ( this.key.equals(other.key) )
+		&& ( this.theLocale.equals(other.theLocale) )
+		&& ( ( this.custom == other.custom ) || ( this.custom[0].equals(other.custom[0]) && this.custom[1].equals(other.custom[1]) ) );
+
+	}
+
+	public boolean getYesno() {
+		return yesno;
+	}
+
+	public void setYesno(boolean yesno) {
+		this.yesno = yesno;
+	}
+
+	public java.io.Serializable getBlob() {
+		return blob;
+	}
+
+	public void setBlob(java.io.Serializable blob) {
+		this.blob = blob;
+	}
+
+	public java.io.Serializable getNullBlob() {
+		return nullBlob;
+	}
+
+	public void setNullBlob(java.io.Serializable nullBlob) {
+		this.nullBlob = nullBlob;
+	}
+
+	public byte[] getBinary() {
+		return binary;
+	}
+	public void setBinary(byte[] binary) {
+		this.binary = binary;
+	}
+
+	public String[] getCustom() {
+		return custom;
+	}
+
+	public void setCustom(String[] custom) {
+		this.custom = custom;
+	}
+
+	public FooComponent getComponent() {
+		return component;
+	}
+	public void setComponent(FooComponent component) {
+		this.component = component;
+	}
+
+	public FooComponent getNullComponent() {
+		return null;
+	}
+	public void setNullComponent(FooComponent fc) throws Exception {
+		if (fc!=null) throw new Exception("Null component");
+	}
+
+	public Character getChar() {
+		return new Character(_char);
+	}
+
+	public void setChar(Character _char) {
+		this._char = _char.charValue();
+	}
+
+	public Fee getDependent() {
+		return dependent;
+	}
+
+	public void setDependent(Fee dependent) {
+		this.dependent = dependent;
+	}
+
+	/**
+	 * Returns the locale.
+	 * @return Locale
+	 */
+	public Locale getLocale() {
+		return theLocale;
+	}
+
+	/**
+	 * Sets the locale.
+	 * @param locale The locale to set
+	 */
+	public void setLocale(Locale locale) {
+		this.theLocale = locale;
+	}
+
+	/**
+	 * Returns the version.
+	 * @return int
+	 */
+	public int getVersion() {
+		return version;
+	}
+
+	/**
+	 * Sets the version.
+	 * @param version The version to set
+	 */
+	public void setVersion(int version) {
+		this.version = version;
+	}
+
+	/**
+	 * Returns the versionTimestamp.
+	 * @return Timestamp
+	 */
+	public Timestamp getVersionTimestamp() {
+		return versionTimestamp;
+	}
+
+	/**
+	 * Sets the versionTimestamp.
+	 * @param versionTimestamp The versionTimestamp to set
+	 */
+	public void setVersionTimestamp(Timestamp versionTimestamp) {
+		this.versionTimestamp = versionTimestamp;
+	}
+
+	public void finalize() { }
+
+	public Calendar getVersionCalendar() {
+		return versionCalendar;
+	}
+
+	public void setVersionCalendar(Calendar calendar) {
+		versionCalendar = calendar;
+	}
+
+	public float getFormula() {
+		return formula;
+	}
+
+	public void setFormula(float f) {
+		formula = f;
+	}
+
+	/**
+	 * @return Returns the joinedProp.
+	 */
+	public String getJoinedProp() {
+		return joinedProp;
+	}
+
+	/**
+	 * @param joinedProp The joinedProp to set.
+	 */
+	public void setJoinedProp(String joinedProp) {
+		this.joinedProp = joinedProp;
+	}
+
+}
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Foo.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/FooBar.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/FooBar.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/FooBar.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,178 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-lazy="false" package="org.hibernate.test.legacy">
+
+	<import class="Result"/>
+	<import class="Named"/>
+
+	<class
+		name="Foo"
+		table="`foos`"
+		proxy="FooProxy"
+		discriminator-value="F"
+		batch-size="4"
+		dynamic-insert="true"
+		dynamic-update="true"
+		select-before-update="true">
+
+		<!--cache-->
+
+		<id name="key" type="string">
+			<column name="`foo_idcolumnname123`" length="36"/>
+			<generator class="uuid.hex">
+				<param name="seperator">:</param>
+			</generator>
+		</id>
+		<discriminator column="`foo_subclass_1234`" type="character" force="true"/>
+		<version name="version"/>
+		<!--<version name="versionCalendar" type="calendar"/>-->
+		<!--<timestamp name="versionTimestamp"/>-->
+		<many-to-one name="foo" class="Foo">
+				<column name="foo" length="36" index="fbmtoidx"/>
+		</many-to-one>
+		<property name="long">
+			<column name="long_" index="fbmtoidx" unique-key="abc" not-null="true"/>
+		</property>
+		<property name="integer">
+				<column name="`integer__`" unique-key="abc" not-null="true"/>
+		</property>
+		<property name="float">
+				<column name="float_" unique-key="abc" not-null="true" check="float_ > 0.0"/>
+		</property>
+		<property name="x"/>
+		<property name="double" column="double_"/>
+
+		<primitive-array name="bytes" table="foobytes">
+			<key column="id"/>
+			<index column="i"/>
+			<element column="byte_" type="byte"/>
+		</primitive-array>
+
+		<property name="date" type="date" column="date_"/>
+		<property name="timestamp" type="timestamp" column="timestamp_"/>
+		<property name="boolean" column="boolean_"/>
+		<property name="bool" column="bool_"/>
+		<property name="null" column="null_"/>
+		<property name="short" column="short_"/>
+		<property name="char" column="char_"/>
+		<property name="zero" column="zero_"/>
+		<property name="int" column="int_"/>
+		<property name="string">
+				<column name="string_" length="48" index="fbstridx"/>
+		</property>
+		<property name="byte" column="byte_"/>
+		<property name="yesno" type="yes_no"/>
+		<property name="blob" type="org.hibernate.test.legacy.Foo$Struct" column="blobb_"/>
+		<property name="nullBlob" type="serializable"/>
+		<property name="binary" column="bin_"/>
+		<property name="theLocale" access="field" column="`localeayzabc123`"/>
+
+		<property name="formula" formula="int_/2"/>
+
+		<property name="custom" type="org.hibernate.test.legacy.DoubleStringType" access="field">
+				<column name="first_name" length="66"/>
+				<column name="surname" length="66"/>
+		</property>
+
+		<component name="component">
+			<property name="count" column="count_" type="int" not-null="true"/>
+			<property name="name">
+				<column name="name_" length="32" not-null="true"/>
+			</property>
+			<many-to-one name="glarch"
+				column="g__"
+				cascade="all"
+				class="org.hibernate.test.legacy.Glarch"
+				lazy="proxy"
+				outer-join="true"/>
+			<property name="null" column="cmpnt_null_"/>
+			<component name="subcomponent">
+				<!--property name="count" column="subcount"/-->
+				<property name="name" column="subname"/>
+				<array name="importantDates" table="foo_times">
+					<key column="foo_id"/>
+					<index column="i"/>
+					<element column="date_" type="time"/>
+				</array>
+				<many-to-one name="fee"
+					column="fee_sub"
+					cascade="all"
+					class="Fee"
+					outer-join="false"
+					access="field"/>
+			</component>
+			<array name="importantDates" table="foo_dates">
+				<key column="foo_id"/>
+				<index column="i"/>
+				<element column="date_" type="date"/>
+			</array>
+		</component>
+		<component name="nullComponent">
+			<property name="name" column="null_cmpnt_"/>
+		</component>
+
+		<join table="jointable">
+			<key column="fooid" on-delete="cascade"/>
+			<property name="joinedProp"/>
+		</join>
+
+		<join table="foo_dep_table">
+			<key column="fooid"/>
+			<many-to-one name="dependent"
+				class="org.hibernate.test.legacy.Fee"
+				cascade="all"
+				not-null="true"/>
+		</join>
+
+		<subclass
+			name="Trivial"
+			proxy="FooProxy"
+			discriminator-value="T"/>
+
+		<subclass
+			name="Abstract"
+			proxy="AbstractProxy"
+			discriminator-value="null">
+				<set name="abstracts" batch-size="2">
+					<key column="abstract_id"/>
+					<one-to-many class="Abstract"/>
+				</set>
+				<property name="time" column="the_time"/>
+
+				<subclass
+					name="Bar"
+					proxy="BarProxy"
+					discriminator-value="B">
+					<many-to-one name="baz"/>
+					<property name="barString">
+						<column name="bar_string" length="24"/>
+					</property>
+					<component name="barComponent" class="FooComponent">
+						<parent name="parent"/>
+						<property name="count" column="bar_count"/>
+						<property name="name" length="64"/>
+						<array name ="importantDates">
+								<key column="id" />
+								<index column="i"/>
+							 <element column="date_" type="date"/>
+						</array>
+					</component>
+					<any name="object" meta-type="character" id-type="long" cascade="all">
+						<meta-value value="O" class="One"/>
+						<meta-value value="M" class="Many"/>
+						<column name="clazz" length="100"/>
+						<column name="gen_id"/>
+					</any>
+					<join table="bar_join_table">
+						<key column="bar_id"/>
+						<property name="name" column="name_name"/>
+					</join>
+				</subclass>
+		</subclass>
+	</class>
+
+
+</hibernate-mapping>
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/FooBar.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/FooBarTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/FooBarTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/FooBarTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,4859 @@
+//$Id: FooBarTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+import java.sql.Connection;
+import java.sql.Time;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TimeZone;
+import java.util.TreeMap;
+import java.util.TreeSet;
+
+import junit.framework.Test;
+import junit.textui.TestRunner;
+
+import org.hibernate.Criteria;
+import org.hibernate.FetchMode;
+import org.hibernate.FlushMode;
+import org.hibernate.Hibernate;
+import org.hibernate.HibernateException;
+import org.hibernate.LazyInitializationException;
+import org.hibernate.LockMode;
+import org.hibernate.ObjectNotFoundException;
+import org.hibernate.Query;
+import org.hibernate.QueryException;
+import org.hibernate.ScrollableResults;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Environment;
+import org.hibernate.classic.Session;
+import org.hibernate.connection.ConnectionProvider;
+import org.hibernate.connection.DriverManagerConnectionProvider;
+import org.hibernate.criterion.Example;
+import org.hibernate.criterion.MatchMode;
+import org.hibernate.criterion.Order;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.dialect.DB2Dialect;
+import org.hibernate.dialect.DerbyDialect;
+import org.hibernate.dialect.HSQLDialect;
+import org.hibernate.dialect.InterbaseDialect;
+import org.hibernate.dialect.MckoiDialect;
+import org.hibernate.dialect.MySQLDialect;
+import org.hibernate.dialect.Oracle8iDialect;
+import org.hibernate.dialect.PointbaseDialect;
+import org.hibernate.dialect.PostgreSQLDialect;
+import org.hibernate.dialect.SAPDBDialect;
+import org.hibernate.dialect.Sybase11Dialect;
+import org.hibernate.dialect.SybaseASE15Dialect;
+import org.hibernate.dialect.SybaseDialect;
+import org.hibernate.dialect.TimesTenDialect;
+import org.hibernate.engine.SessionFactoryImplementor;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.proxy.HibernateProxy;
+import org.hibernate.util.JoinedIterator;
+import org.hibernate.util.SerializationHelper;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class FooBarTest extends LegacyTestCase {
+	private static final Logger log = LoggerFactory.getLogger( FooBarTest.class );
+
+	public FooBarTest(String arg) {
+		super(arg);
+	}
+
+	public String[] getMappings() {
+		return new String[] {
+			"legacy/FooBar.hbm.xml",
+			"legacy/Baz.hbm.xml",
+			"legacy/Qux.hbm.xml",
+			"legacy/Glarch.hbm.xml",
+			"legacy/Fum.hbm.xml",
+			"legacy/Fumm.hbm.xml",
+			"legacy/Fo.hbm.xml",
+			"legacy/One.hbm.xml",
+			"legacy/Many.hbm.xml",
+			"legacy/Immutable.hbm.xml",
+			"legacy/Fee.hbm.xml",
+			"legacy/Vetoer.hbm.xml",
+			"legacy/Holder.hbm.xml",
+			"legacy/Location.hbm.xml",
+			"legacy/Stuff.hbm.xml",
+			"legacy/Container.hbm.xml",
+			"legacy/Simple.hbm.xml",
+			"legacy/XY.hbm.xml"
+		};
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( FooBarTest.class );
+	}
+
+	public static void main(String[] args) throws Exception {
+		TestRunner.run( suite() );
+	}
+
+	public void testSaveOrUpdateCopyAny() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Bar bar = new Bar();
+		One one = new One();
+		bar.setObject(one);
+		s.save(bar);
+		GlarchProxy g = bar.getComponent().getGlarch();
+		bar.getComponent().setGlarch(null);
+		s.delete(g);
+		s.flush();
+		assertTrue( s.contains(one) );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		Bar bar2 = (Bar) s.saveOrUpdateCopy(bar);
+		s.flush();
+		s.delete(bar2);
+		s.flush();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testRefreshProxy() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Glarch g = new Glarch();
+		Serializable gid = s.save(g);
+		s.flush();
+		s.clear();
+		GlarchProxy gp = (GlarchProxy) s.load(Glarch.class, gid);
+		gp.getName(); //force init
+		s.refresh(gp);
+		s.delete(gp);
+		s.flush();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testOnCascadeDelete() throws Exception {
+		if ( ! supportsCircularCascadeDelete() ) {
+			return;
+		}
+
+		Session s = openSession();
+		s.beginTransaction();
+		Baz baz = new Baz();
+		baz.subs = new ArrayList();
+		Baz sub = new Baz();
+		sub.superBaz = baz;
+		baz.subs.add(sub);
+		s.save(baz);
+		s.flush();
+		assertTrue( s.createQuery("from Baz").list().size()==2 );
+		s.getTransaction().commit();
+		s.beginTransaction();
+		s.delete(baz);
+		s.getTransaction().commit();
+		s.beginTransaction();
+		assertTrue( s.createQuery("from Baz").list().size()==0 );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testRemoveFromIdbag() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Baz baz = new Baz();
+		baz.setByteBag( new ArrayList() );
+		byte[] bytes = { 12, 13 };
+		baz.getByteBag().add( new byte[] { 10, 45 } );
+		baz.getByteBag().add(bytes);
+		baz.getByteBag().add( new byte[] { 1, 11 } );
+		baz.getByteBag().add( new byte[] { 12 } );
+		s.save(baz);
+		s.flush();
+		baz.getByteBag().remove(bytes);
+		s.flush();
+		baz.getByteBag().add(bytes);
+		s.flush();
+		s.delete(baz);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testLoad() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Qux q = new Qux();
+		s.save(q);
+		BarProxy b = new Bar();
+		s.save(b);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		q = (Qux) s.load(Qux.class, q.getKey() );
+		b = (BarProxy) s.load( Foo.class, b.getKey() );
+		b.getKey();
+		assertFalse( Hibernate.isInitialized(b) );
+		b.getBarString();
+		assertTrue( Hibernate.isInitialized(b) );
+		BarProxy b2 = (BarProxy) s.load( Bar.class, b.getKey() );
+		Qux q2 = (Qux) s.load( Qux.class, q.getKey() );
+		assertTrue( "loaded same object", q==q2 );
+		assertTrue( "loaded same object", b==b2 );
+		assertTrue( Math.round( b.getFormula() ) == b.getInt()/2 );
+		s.delete(q2);
+		s.delete(b2);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testJoin() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Foo foo = new Foo();
+		foo.setJoinedProp("foo");
+		s.save(foo);
+		s.flush();
+		foo.setJoinedProp("bar");
+		s.flush();
+		String fid = foo.getKey();
+		s.delete(foo);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		Foo foo2 = new Foo();
+		foo2.setJoinedProp("foo");
+		s.save(foo2);
+		s.createQuery( "select foo.id from Foo foo where foo.joinedProp = 'foo'" ).list();
+		assertNull( s.get(Foo.class, fid) );
+		s.delete(foo2);
+		s.getTransaction().commit();
+		s.close();
+
+	}
+
+	public void testDereferenceLazyCollection() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Baz baz = new Baz();
+		baz.setFooSet( new HashSet() );
+		Foo foo = new Foo();
+		baz.getFooSet().add(foo);
+		s.save(foo);
+		s.save(baz);
+		foo.setBytes( "foobar".getBytes() );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		foo = (Foo) s.get( Foo.class, foo.getKey() );
+		assertTrue( Hibernate.isInitialized( foo.getBytes() ) );
+		assertTrue( foo.getBytes().length==6 );
+		baz = (Baz) s.get( Baz.class, baz.getCode() );
+		assertTrue( baz.getFooSet().size()==1 );
+		s.getTransaction().commit();
+		s.close();
+
+		getSessions().evictCollection("org.hibernate.test.legacy.Baz.fooSet");
+
+		s = openSession();
+		s.beginTransaction();
+		baz = (Baz) s.get( Baz.class, baz.getCode() );
+		assertFalse( Hibernate.isInitialized( baz.getFooSet() ) );
+		baz.setFooSet(null);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		foo = (Foo) s.get( Foo.class, foo.getKey() );
+		assertTrue( foo.getBytes().length==6 );
+		baz = (Baz) s.get( Baz.class, baz.getCode() );
+		assertFalse( Hibernate.isInitialized( baz.getFooSet() ) );
+		assertTrue( baz.getFooSet().size()==0 );
+		s.delete(baz);
+		s.delete(foo);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testMoveLazyCollection() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Baz baz = new Baz();
+		Baz baz2 = new Baz();
+		baz.setFooSet( new HashSet() );
+		Foo foo = new Foo();
+		baz.getFooSet().add(foo);
+		s.save(foo);
+		s.save(baz);
+		s.save(baz2);
+		foo.setBytes( "foobar".getBytes() );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		foo = (Foo) s.get( Foo.class, foo.getKey() );
+		assertTrue( Hibernate.isInitialized( foo.getBytes() ) );
+		assertTrue( foo.getBytes().length==6 );
+		baz = (Baz) s.get( Baz.class, baz.getCode() );
+		assertTrue( baz.getFooSet().size()==1 );
+		s.getTransaction().commit();
+		s.close();
+
+		getSessions().evictCollection("org.hibernate.test.legacy.Baz.fooSet");
+
+		s = openSession();
+		s.beginTransaction();
+		baz = (Baz) s.get( Baz.class, baz.getCode() );
+		assertFalse( Hibernate.isInitialized( baz.getFooSet() ) );
+		baz2 = (Baz) s.get( Baz.class, baz2.getCode() );
+		baz2.setFooSet( baz.getFooSet() );
+		baz.setFooSet(null);
+		assertFalse( Hibernate.isInitialized( baz2.getFooSet() ) );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		foo = (Foo) s.get( Foo.class, foo.getKey() );
+		assertTrue( foo.getBytes().length==6 );
+		baz = (Baz) s.get( Baz.class, baz.getCode() );
+		baz2 = (Baz) s.get( Baz.class, baz2.getCode() );
+		assertFalse( Hibernate.isInitialized( baz.getFooSet() ) );
+		assertTrue( baz.getFooSet().size()==0 );
+		assertTrue( Hibernate.isInitialized( baz2.getFooSet() ) ); //fooSet has batching enabled
+		assertTrue( baz2.getFooSet().size()==1 );
+		s.delete(baz);
+		s.delete(baz2);
+		s.delete(foo);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testCriteriaCollection() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Baz bb = (Baz) s.createCriteria(Baz.class).uniqueResult();
+		assertTrue(bb==null);
+		Baz baz = new Baz();
+		s.save(baz);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		Baz b = (Baz) s.createCriteria(Baz.class).uniqueResult();
+		assertTrue( Hibernate.isInitialized( b.getTopGlarchez() ) );
+		assertTrue( b.getTopGlarchez().size()==0 );
+		s.delete(b);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testQuery() throws Exception {
+		Session s = openSession();
+		Transaction txn = s.beginTransaction();
+		Foo foo = new Foo();
+		s.save(foo);
+		Foo foo2 = new Foo();
+		s.save(foo2);
+		foo.setFoo(foo2);
+
+		List list = s.createQuery( "from Foo foo inner join fetch foo.foo" ).list();
+		Foo foof = (Foo) list.get(0);
+		assertTrue( Hibernate.isInitialized( foof.getFoo() ) );
+
+		s.createQuery( "from Baz baz left outer join fetch baz.fooToGlarch" ).list();
+
+		list = s.createQuery( "select foo, bar from Foo foo left outer join foo.foo bar where foo = ?" )
+				.setParameter( 0, foo, Hibernate.entity(Foo.class) )
+				.list();
+		Object[] row1 = (Object[]) list.get(0);
+		assertTrue( row1[0]==foo && row1[1]==foo2 );
+
+		s.createQuery( "select foo.foo.foo.string from Foo foo where foo.foo = 'bar'" ).list();
+		s.createQuery( "select foo.foo.foo.foo.string from Foo foo where foo.foo = 'bar'" ).list();
+		s.createQuery( "select foo from Foo foo where foo.foo.foo = 'bar'" ).list();
+		s.createQuery( "select foo.foo.foo.foo.string from Foo foo where foo.foo.foo = 'bar'" ).list();
+		s.createQuery( "select foo.foo.foo.string from Foo foo where foo.foo.foo.foo.string = 'bar'" ).list();
+		if ( ! (getDialect() instanceof HSQLDialect) )
+			s.createQuery( "select foo.string from Foo foo where foo.foo.foo.foo = foo.foo.foo" ).list();
+		s.createQuery( "select foo.string from Foo foo where foo.foo.foo = 'bar' and foo.foo.foo.foo = 'baz'" ).list();
+		s.createQuery( "select foo.string from Foo foo where foo.foo.foo.foo.string = 'a' and foo.foo.string = 'b'" )
+				.list();
+
+		s.createQuery( "from Bar bar, foo in elements(bar.baz.fooArray)" ).list();
+
+		//s.find("from Baz as baz where baz.topComponents[baz].name = 'bazzz'");
+
+		if ( (getDialect() instanceof DB2Dialect) && !(getDialect() instanceof DerbyDialect) ) {
+			s.createQuery( "from Foo foo where lower( foo.foo.string ) = 'foo'" ).list();
+			s.createQuery( "from Foo foo where lower( (foo.foo.string || 'foo') || 'bar' ) = 'foo'" ).list();
+			s.createQuery( "from Foo foo where repeat( (foo.foo.string || 'foo') || 'bar', 2 ) = 'foo'" ).list();
+			s.createQuery(
+					"from Bar foo where foo.foo.integer is not null and repeat( (foo.foo.string || 'foo') || 'bar', (5+5)/2 ) = 'foo'"
+			).list();
+			s.createQuery(
+					"from Bar foo where foo.foo.integer is not null or repeat( (foo.foo.string || 'foo') || 'bar', (5+5)/2 ) = 'foo'"
+			).list();
+		}
+		if (getDialect() instanceof SybaseDialect) {
+			s.createQuery( "select baz from Baz as baz join baz.fooArray foo group by baz order by sum(foo.float)" )
+					.iterate();
+		}
+
+		s.createQuery( "from Foo as foo where foo.component.glarch.name is not null" ).list();
+		s.createQuery( "from Foo as foo left outer join foo.component.glarch as glarch where glarch.name = 'foo'" )
+				.list();
+
+		list = s.createQuery( "from Foo" ).list();
+		assertTrue( list.size()==2 && list.get(0) instanceof FooProxy );
+		list = s.createQuery( "from Foo foo left outer join foo.foo" ).list();
+		assertTrue( list.size()==2 && ( (Object[]) list.get(0) )[0] instanceof FooProxy );
+
+		s.createQuery("from Bar, Bar").list();
+		s.createQuery("from Foo, Bar").list();
+		s.createQuery( "from Baz baz left join baz.fooToGlarch, Bar bar join bar.foo" ).list();
+		s.createQuery( "from Baz baz left join baz.fooToGlarch join baz.fooSet" ).list();
+		s.createQuery( "from Baz baz left join baz.fooToGlarch join fetch baz.fooSet foo left join fetch foo.foo" )
+				.list();
+
+		list = s.createQuery(
+				"from Foo foo where foo.string='osama bin laden' and foo.boolean = true order by foo.string asc, foo.component.count desc"
+		).list();
+		assertTrue( "empty query", list.size()==0 );
+		Iterator iter = s.createQuery(
+				"from Foo foo where foo.string='osama bin laden' order by foo.string asc, foo.component.count desc"
+		).iterate();
+		assertTrue( "empty iterator", !iter.hasNext() );
+
+		list = s.createQuery( "select foo.foo from Foo foo" ).list();
+		assertTrue( "query", list.size()==1 );
+		assertTrue( "returned object", list.get(0)==foo.getFoo() );
+		foo.getFoo().setFoo(foo);
+		foo.setString("fizard");
+		//The following test is disabled for databases with no subselects...also for Interbase (not sure why).
+		if ( 
+				!(getDialect() instanceof MySQLDialect) && 
+				!(getDialect() instanceof HSQLDialect) && 
+				!(getDialect() instanceof MckoiDialect) && 
+				!(getDialect() instanceof SAPDBDialect) && 
+				!(getDialect() instanceof PointbaseDialect) &&
+				!(getDialect() instanceof DerbyDialect)
+		)  {
+			// && !db.equals("weblogic") {
+			if ( !( getDialect() instanceof InterbaseDialect ) ) {
+				list = s.createQuery( "from Foo foo where ? = some elements(foo.component.importantDates)" )
+						.setParameter( 0, new Date(), Hibernate.DATE )
+						.list();
+				assertTrue( "component query", list.size()==2 );
+			}
+			if( !( getDialect() instanceof TimesTenDialect)) {
+				list = s.createQuery( "from Foo foo where size(foo.component.importantDates) = 3" ).list(); //WAS: 4
+				assertTrue( "component query", list.size()==2 );
+				list = s.createQuery( "from Foo foo where 0 = size(foo.component.importantDates)" ).list();
+				assertTrue( "component query", list.size()==0 );
+			}
+			list = s.createQuery( "from Foo foo where exists elements(foo.component.importantDates)" ).list();
+			assertTrue( "component query", list.size()==2 );
+			s.createQuery( "from Foo foo where not exists (from Bar bar where bar.id = foo.id)" ).list();
+
+			s.createQuery(
+					"select foo.foo from Foo foo where foo = some(select x from Foo x where x.long > foo.foo.long)"
+			).list();
+			s.createQuery( "select foo.foo from Foo foo where foo = some(from Foo x where (x.long > foo.foo.long))" )
+					.list();
+			if ( !( getDialect() instanceof TimesTenDialect)) {
+				s.createQuery(
+						"select foo.foo from Foo foo where foo.long = some( select max(x.long) from Foo x where (x.long > foo.foo.long) group by x.foo )"
+				).list();
+			}
+			s.createQuery(
+					"from Foo foo where foo = some(select x from Foo x where x.long > foo.foo.long) and foo.foo.string='baz'"
+			).list();
+			s.createQuery(
+					"from Foo foo where foo.foo.string='baz' and foo = some(select x from Foo x where x.long > foo.foo.long)"
+			).list();
+			s.createQuery( "from Foo foo where foo = some(select x from Foo x where x.long > foo.foo.long)" ).list();
+
+			s.createQuery(
+					"select foo.string, foo.date, foo.foo.string, foo.id from Foo foo, Baz baz where foo in elements(baz.fooArray) and foo.string like 'foo'"
+			).iterate();
+		}
+		list = s.createQuery( "from Foo foo where foo.component.count is null order by foo.component.count" ).list();
+		assertTrue( "component query", list.size()==0 );
+		list = s.createQuery( "from Foo foo where foo.component.name='foo'" ).list();
+		assertTrue( "component query", list.size()==2 );
+		list = s.createQuery(
+				"select distinct foo.component.name, foo.component.name from Foo foo where foo.component.name='foo'"
+		).list();
+		assertTrue( "component query", list.size()==1 );
+		list = s.createQuery( "select distinct foo.component.name, foo.id from Foo foo where foo.component.name='foo'" )
+				.list();
+		assertTrue( "component query", list.size()==2 );
+		list = s.createQuery( "select foo.foo from Foo foo" ).list();
+		assertTrue( "query", list.size()==2 );
+		list = s.createQuery( "from Foo foo where foo.id=?" )
+				.setParameter( 0, foo.getKey(), Hibernate.STRING )
+				.list();
+		assertTrue( "id query", list.size()==1 );
+		list = s.createQuery( "from Foo foo where foo.key=?" )
+				.setParameter( 0, foo.getKey(), Hibernate.STRING )
+				.list();
+		assertTrue( "named id query", list.size()==1 );
+		assertTrue( "id query", list.get(0)==foo );
+		list = s.createQuery( "select foo.foo from Foo foo where foo.string='fizard'" ).list();
+		assertTrue( "query", list.size()==1 );
+		assertTrue( "returned object", list.get(0)==foo.getFoo() );
+		list = s.createQuery( "from Foo foo where foo.component.subcomponent.name='bar'" ).list();
+		assertTrue( "components of components", list.size()==2 );
+		list = s.createQuery( "select foo.foo from Foo foo where foo.foo.id=?" )
+				.setParameter( 0, foo.getFoo().getKey(), Hibernate.STRING )
+				.list();
+		assertTrue( "by id query", list.size()==1 );
+		assertTrue( "by id returned object", list.get(0)==foo.getFoo() );
+
+		s.createQuery( "from Foo foo where foo.foo = ?" ).setParameter( 0, foo.getFoo(), Hibernate.entity(Foo.class) ).list();
+
+		assertTrue( !s.createQuery( "from Bar bar where bar.string='a string' or bar.string='a string'" )
+				.iterate()
+				.hasNext() );
+
+		iter = s.createQuery( "select foo.component.name, elements(foo.component.importantDates) from Foo foo where foo.foo.id=?" )
+				.setParameter( 0, foo.getFoo().getKey(), Hibernate.STRING )
+				.iterate();
+		int i=0;
+		while ( iter.hasNext() ) {
+			i++;
+			Object[] row = (Object[]) iter.next();
+			assertTrue( row[0] instanceof String && ( row[1]==null || row[1] instanceof Date ) );
+		}
+		assertTrue(i==3); //WAS: 4
+		iter = s.createQuery( "select max( elements(foo.component.importantDates) ) from Foo foo group by foo.id" )
+				.iterate();
+		assertTrue( iter.next() instanceof Date );
+
+		list = s.createQuery(
+				"select foo.foo.foo.foo from Foo foo, Foo foo2 where"
+						+ " foo = foo2.foo and not not ( not foo.string='fizard' )"
+						+ " and foo2.string between 'a' and (foo.foo.string)"
+						+ ( ( getDialect() instanceof HSQLDialect || getDialect() instanceof InterbaseDialect || getDialect() instanceof TimesTenDialect ) ?
+						" and ( foo2.string in ( 'fiz', 'blah') or 1=1 )"
+						:
+						" and ( foo2.string in ( 'fiz', 'blah', foo.foo.string, foo.string, foo2.string ) )"
+				)
+		).list();
+		assertTrue( "complex query", list.size()==1 );
+		assertTrue( "returned object", list.get(0)==foo );
+		foo.setString("from BoogieDown  -tinsel town  =!@#$^&*())");
+		list = s.createQuery( "from Foo foo where foo.string='from BoogieDown  -tinsel town  =!@#$^&*())'" ).list();
+		assertTrue( "single quotes", list.size()==1 );
+		list = s.createQuery( "from Foo foo where not foo.string='foo''bar'" ).list();
+		assertTrue( "single quotes", list.size()==2 );
+		list = s.createQuery( "from Foo foo where foo.component.glarch.next is null" ).list();
+		assertTrue( "query association in component", list.size()==2 );
+		Bar bar = new Bar();
+		Baz baz = new Baz();
+		baz.setDefaults();
+		bar.setBaz(baz);
+		baz.setManyToAny( new ArrayList() );
+		baz.getManyToAny().add(bar);
+		baz.getManyToAny().add(foo);
+		s.save(bar);
+		s.save(baz);
+		list = s.createQuery(
+				" from Bar bar where bar.baz.count=667 and bar.baz.count!=123 and not bar.baz.name='1-E-1'"
+		).list();
+		assertTrue( "query many-to-one", list.size()==1 );
+		list = s.createQuery( " from Bar i where i.baz.name='Bazza'" ).list();
+		assertTrue( "query many-to-one", list.size()==1 );
+
+		Iterator rs = s.createQuery( "select count(distinct foo.foo) from Foo foo" ).iterate();
+		assertTrue( "count", ( (Long) rs.next() ).longValue()==2 );
+		assertTrue( !rs.hasNext() );
+		rs = s.createQuery( "select count(foo.foo.boolean) from Foo foo" ).iterate();
+		assertTrue( "count", ( (Long) rs.next() ).longValue()==2 );
+		assertTrue( !rs.hasNext() );
+		rs = s.createQuery( "select count(*), foo.int from Foo foo group by foo.int" ).iterate();
+		assertTrue( "count(*) group by", ( (Object[]) rs.next() )[0].equals( new Long(3) ) );
+		assertTrue( !rs.hasNext() );
+		rs = s.createQuery( "select sum(foo.foo.int) from Foo foo" ).iterate();
+		assertTrue( "sum", ( (Long) rs.next() ).longValue()==4 );
+		assertTrue( !rs.hasNext() );
+		rs = s.createQuery( "select count(foo) from Foo foo where foo.id=?" )
+				.setParameter( 0, foo.getKey(), Hibernate.STRING )
+				.iterate();
+		assertTrue( "id query count", ( (Long) rs.next() ).longValue()==1 );
+		assertTrue( !rs.hasNext() );
+
+		s.createQuery( "from Foo foo where foo.boolean = ?" )
+				.setParameter( 0, new Boolean(true), Hibernate.BOOLEAN )
+				.list();
+
+		s.createQuery( "select new Foo(fo.x) from Fo fo" ).list();
+		s.createQuery( "select new Foo(fo.integer) from Foo fo" ).list();
+
+		list = s.createQuery("select new Foo(fo.x) from Foo fo")
+			//.setComment("projection test")
+			.setCacheable(true)
+			.list();
+		assertTrue(list.size()==3);
+		list = s.createQuery("select new Foo(fo.x) from Foo fo")
+			//.setComment("projection test 2")
+			.setCacheable(true)
+			.list();
+		assertTrue(list.size()==3);
+
+		rs = s.createQuery( "select new Foo(fo.x) from Foo fo" ).iterate();
+		assertTrue( "projection iterate (results)", rs.hasNext() );
+		assertTrue( "projection iterate (return check)", Foo.class.isAssignableFrom( rs.next().getClass() ) );
+
+		ScrollableResults sr = s.createQuery("select new Foo(fo.x) from Foo fo").scroll();
+		assertTrue( "projection scroll (results)", sr.next() );
+		assertTrue( "projection scroll (return check)", Foo.class.isAssignableFrom( sr.get(0).getClass() ) );
+
+		list = s.createQuery( "select foo.long, foo.component.name, foo, foo.foo from Foo foo" ).list();
+		rs = list.iterator();
+		int count=0;
+		while ( rs.hasNext() ) {
+			count++;
+			Object[] row = (Object[]) rs.next();
+			assertTrue( row[0] instanceof Long );
+			assertTrue( row[1] instanceof String );
+			assertTrue( row[2] instanceof Foo );
+			assertTrue( row[3] instanceof Foo );
+		}
+		assertTrue(count!=0);
+		list = s.createQuery( "select avg(foo.float), max(foo.component.name), count(distinct foo.id) from Foo foo" )
+				.list();
+		rs = list.iterator();
+		count=0;
+		while ( rs.hasNext() ) {
+			count++;
+			Object[] row = (Object[]) rs.next();
+			assertTrue( row[0] instanceof Double );
+			assertTrue( row[1] instanceof String );
+			assertTrue( row[2] instanceof Long );
+		}
+		assertTrue(count!=0);
+		list = s.createQuery( "select foo.long, foo.component, foo, foo.foo from Foo foo" ).list();
+		rs = list.iterator();
+		count=0;
+		while ( rs.hasNext() ) {
+			count++;
+			Object[] row = (Object[]) rs.next();
+			assertTrue( row[0] instanceof Long );
+			assertTrue( row[1] instanceof FooComponent );
+			assertTrue( row[2] instanceof Foo );
+			assertTrue( row[3] instanceof Foo );
+		}
+		assertTrue(count!=0);
+
+		s.save( new Holder("ice T") );
+		s.save( new Holder("ice cube") );
+
+		assertTrue( s.createQuery( "from java.lang.Object as o" ).list().size()==15 );
+		assertTrue( s.createQuery( "from Named" ).list().size()==7 );
+		assertTrue( s.createQuery( "from Named n where n.name is not null" ).list().size()==4 );
+		iter = s.createQuery( "from Named n" ).iterate();
+		while ( iter.hasNext() ) {
+			assertTrue( iter.next() instanceof Named );
+		}
+
+		s.save( new Holder("bar") );
+		iter = s.createQuery( "from Named n0, Named n1 where n0.name = n1.name" ).iterate();
+		int cnt = 0;
+		while ( iter.hasNext() ) {
+			Object[] row = (Object[]) iter.next();
+			if ( row[0]!=row[1] ) cnt++;
+		}
+		if ( !(getDialect() instanceof HSQLDialect) ) {
+			assertTrue(cnt==2);
+			assertTrue( s.createQuery( "from Named n0, Named n1 where n0.name = n1.name" ).list().size()==7 );
+		}
+
+		Query qu = s.createQuery("from Named n where n.name = :name");
+		qu.getReturnTypes();
+		qu.getNamedParameters();
+
+		iter = s.createQuery( "from java.lang.Object" ).iterate();
+		int c = 0;
+		while ( iter.hasNext() ) {
+			iter.next();
+			c++;
+		}
+		assertTrue(c==16);
+
+		s.createQuery( "select baz.code, min(baz.count) from Baz baz group by baz.code" ).iterate();
+
+		iter = s.createQuery( "selecT baz from Baz baz where baz.stringDateMap['foo'] is not null or baz.stringDateMap['bar'] = ?" )
+				.setParameter( 0, new Date(), Hibernate.DATE )
+				.iterate();
+		assertFalse( iter.hasNext() );
+		list = s.createQuery( "select baz from Baz baz where baz.stringDateMap['now'] is not null" ).list();
+		assertTrue( list.size()==1 );
+		list = s.createQuery(
+				"select baz from Baz baz where baz.stringDateMap['now'] is not null and baz.stringDateMap['big bang'] < baz.stringDateMap['now']"
+		).list();
+		assertTrue( list.size()==1 );
+		list = s.createQuery( "select index(date) from Baz baz join baz.stringDateMap date" ).list();
+		System.out.println(list);
+		assertTrue( list.size()==2 );
+
+		s.createQuery(
+				"from Foo foo where foo.integer not between 1 and 5 and foo.string not in ('cde', 'abc') and foo.string is not null and foo.integer<=3"
+		).list();
+
+		s.createQuery( "from Baz baz inner join baz.collectionComponent.nested.foos foo where foo.string is null" )
+				.list();
+		if ( !(getDialect() instanceof MySQLDialect) && !(getDialect() instanceof MckoiDialect) && !(getDialect() instanceof SAPDBDialect) && !(getDialect() instanceof PointbaseDialect) )  {
+			s.createQuery(
+					"from Baz baz inner join baz.fooSet where '1' in (from baz.fooSet foo where foo.string is not null)"
+			).list();
+			s.createQuery(
+					"from Baz baz where 'a' in elements(baz.collectionComponent.nested.foos) and 1.0 in elements(baz.collectionComponent.nested.floats)"
+			).list();
+			s.createQuery(
+					"from Baz baz where 'b' in elements(baz.collectionComponent.nested.foos) and 1.0 in elements(baz.collectionComponent.nested.floats)"
+			).list();
+		}
+
+		s.createQuery( "from Foo foo join foo.foo where foo.foo in ('1','2','3')" ).list();
+		if ( !(getDialect() instanceof HSQLDialect) )
+			s.createQuery( "from Foo foo left join foo.foo where foo.foo in ('1','2','3')" ).list();
+		s.createQuery( "select foo.foo from Foo foo where foo.foo in ('1','2','3')" ).list();
+		s.createQuery( "select foo.foo.string from Foo foo where foo.foo in ('1','2','3')" ).list();
+		s.createQuery( "select foo.foo.string from Foo foo where foo.foo.string in ('1','2','3')" ).list();
+		s.createQuery( "select foo.foo.long from Foo foo where foo.foo.string in ('1','2','3')" ).list();
+		s.createQuery( "select count(*) from Foo foo where foo.foo.string in ('1','2','3') or foo.foo.long in (1,2,3)" )
+				.list();
+		s.createQuery( "select count(*) from Foo foo where foo.foo.string in ('1','2','3') group by foo.foo.long" )
+				.list();
+
+		s.createQuery( "from Foo foo1 left join foo1.foo foo2 left join foo2.foo where foo1.string is not null" )
+				.list();
+		s.createQuery( "from Foo foo1 left join foo1.foo.foo where foo1.string is not null" ).list();
+		s.createQuery( "from Foo foo1 left join foo1.foo foo2 left join foo1.foo.foo foo3 where foo1.string is not null" )
+				.list();
+
+		s.createQuery( "select foo.formula from Foo foo where foo.formula > 0" ).list();
+
+		int len = s.createQuery( "from Foo as foo join foo.foo as foo2 where foo2.id >'a' or foo2.id <'a'" ).list().size();
+		assertTrue(len==2);
+
+		s.delete("from Holder");
+
+		txn.commit();
+		s.close();
+
+		s = openSession();
+		txn = s.beginTransaction();
+		baz = (Baz) s.createQuery("from Baz baz left outer join fetch baz.manyToAny").uniqueResult();
+		assertTrue( Hibernate.isInitialized( baz.getManyToAny() ) );
+		assertTrue( baz.getManyToAny().size()==2 );
+		BarProxy barp = (BarProxy) baz.getManyToAny().get(0);
+		s.createQuery( "from Baz baz join baz.manyToAny" ).list();
+		assertTrue( s.createQuery( "select baz from Baz baz join baz.manyToAny a where index(a) = 0" ).list().size()==1 );
+
+		FooProxy foop = (FooProxy) s.get( Foo.class, foo.getKey() );
+		assertTrue( foop == baz.getManyToAny().get(1) );
+
+		barp.setBaz(baz);
+		assertTrue(
+				s.createQuery( "select bar from Bar bar where bar.baz.stringDateMap['now'] is not null" ).list().size()==1 );
+		assertTrue(
+				s.createQuery(
+						"select bar from Bar bar join bar.baz b where b.stringDateMap['big bang'] < b.stringDateMap['now'] and b.stringDateMap['now'] is not null"
+				).list()
+						.size()==1 );
+		assertTrue(
+				s.createQuery(
+						"select bar from Bar bar where bar.baz.stringDateMap['big bang'] < bar.baz.stringDateMap['now'] and bar.baz.stringDateMap['now'] is not null"
+				).list()
+						.size()==1 );
+
+		list = s.createQuery( "select foo.string, foo.component, foo.id from Bar foo" ).list();
+		assertTrue ( ( (FooComponent) ( (Object[]) list.get(0) )[1] ).getName().equals("foo") );
+		list = s.createQuery( "select elements(baz.components) from Baz baz" ).list();
+		assertTrue( list.size()==2 );
+		list = s.createQuery( "select bc.name from Baz baz join baz.components bc" ).list();
+		assertTrue( list.size()==2 );
+		//list = s.find("select bc from Baz baz join baz.components bc");
+
+		s.createQuery("from Foo foo where foo.integer < 10 order by foo.string").setMaxResults(12).list();
+
+		s.delete(barp);
+		s.delete(baz);
+		s.delete( foop.getFoo() );
+		s.delete(foop);
+		txn.commit();
+		s.close();
+	}
+
+	public void testCascadeDeleteDetached() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Baz baz = new Baz();
+		List list = new ArrayList();
+		list.add( new Fee() );
+		baz.setFees(list);
+		s.save(baz);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		baz = (Baz) s.get( Baz.class, baz.getCode() );
+		s.getTransaction().commit();
+		s.close();
+
+		assertFalse( Hibernate.isInitialized( baz.getFees() ) );
+
+		s = openSession();
+		s.beginTransaction();
+		s.delete(baz);
+		s.flush();
+		assertFalse( s.createQuery( "from Fee" ).iterate().hasNext() );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		baz = new Baz();
+		list = new ArrayList();
+		list.add( new Fee() );
+		list.add( new Fee() );
+		baz.setFees(list);
+		s.save(baz);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		baz = (Baz) s.get( Baz.class, baz.getCode() );
+		Hibernate.initialize( baz.getFees() );
+		s.getTransaction().commit();
+		s.close();
+
+		assertTrue( baz.getFees().size()==2 );
+
+		s = openSession();
+		s.beginTransaction();
+		s.delete(baz);
+		s.flush();
+		assertFalse( s.createQuery( "from Fee" ).iterate().hasNext() );
+		s.getTransaction().commit();
+		s.close();
+
+	}
+
+	public void testForeignKeys() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Baz baz = new Baz();
+		Foo foo = new Foo();
+		List bag = new ArrayList();
+		bag.add(foo);
+		baz.setIdFooBag(bag);
+		baz.setFoo(foo);
+		s.save(baz);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		baz = (Baz) s.load( Baz.class, baz.getCode() );
+		s.delete(baz);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testNonlazyCollection() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Baz baz = new Baz();
+		s.save(baz);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		baz = (Baz) s.createCriteria(Baz.class)
+			//.setComment("criteria test")
+			.setFetchMode( "stringDateMap", FetchMode.JOIN )
+			.uniqueResult();
+		assertTrue( Hibernate.isInitialized( baz.getFooToGlarch() ) );
+		assertTrue( Hibernate.isInitialized( baz.getFooComponentToFoo() ) );
+		assertTrue( !Hibernate.isInitialized( baz.getStringSet() ) );
+		assertTrue( Hibernate.isInitialized( baz.getStringDateMap() ) );
+		s.delete(baz);
+		s.getTransaction().commit();
+		s.close();
+
+	}
+
+	public void testReuseDeletedCollection() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Baz baz = new Baz();
+		baz.setDefaults();
+		s.save(baz);
+		s.flush();
+		s.delete(baz);
+		Baz baz2 = new Baz();
+		baz2.setStringArray( new String[] {"x-y-z"} );
+		s.save(baz2);
+		s.getTransaction().commit();
+		s.close();
+
+		baz2.setStringSet( baz.getStringSet() );
+		baz2.setStringArray( baz.getStringArray() );
+		baz2.setFooArray( baz.getFooArray() );
+
+		s = openSession();
+		s.beginTransaction();
+		s.update(baz2);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		baz2 = (Baz) s.load( Baz.class, baz2.getCode() );
+		assertTrue( baz2.getStringArray().length==3 );
+		assertTrue( baz2.getStringSet().size()==3 );
+		s.delete(baz2);
+		s.getTransaction().commit();
+		s.close();
+
+
+	}
+
+	public void testPropertyRef() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Holder h = new Holder();
+		h.setName("foo");
+		Holder h2 = new Holder();
+		h2.setName("bar");
+		h.setOtherHolder(h2);
+		Serializable hid = s.save(h);
+		Qux q = new Qux();
+		q.setHolder(h2);
+		Serializable qid = s.save(q);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		h = (Holder) s.load(Holder.class, hid);
+		assertEquals( h.getName(), "foo");
+		assertEquals( h.getOtherHolder().getName(), "bar");
+		Object[] res = (Object[]) s.createQuery( "from Holder h join h.otherHolder oh where h.otherHolder.name = 'bar'" )
+				.list()
+				.get(0);
+		assertTrue( res[0]==h );
+		q = (Qux) s.get(Qux.class, qid);
+		assertTrue( q.getHolder() == h.getOtherHolder() );
+		s.delete(h);
+		s.delete(q);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testQueryCollectionOfValues() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Baz baz = new Baz();
+		baz.setDefaults();
+		s.save(baz);
+		Glarch g = new Glarch();
+		Serializable gid = s.save(g);
+
+		if ( !(getDialect() instanceof MySQLDialect) && !(getDialect() instanceof HSQLDialect) /*&& !(dialect instanceof MckoiDialect)*/ && !(getDialect() instanceof SAPDBDialect) && !(getDialect() instanceof PointbaseDialect) && !(getDialect() instanceof TimesTenDialect) ) {
+			s.createFilter( baz.getFooArray(), "where size(this.bytes) > 0" ).list();
+			s.createFilter( baz.getFooArray(), "where 0 in elements(this.bytes)" ).list();
+		}
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.createQuery( "from Baz baz join baz.fooSet foo join foo.foo.foo foo2 where foo2.string = 'foo'" ).list();
+		s.createQuery( "from Baz baz join baz.fooArray foo join foo.foo.foo foo2 where foo2.string = 'foo'" ).list();
+		s.createQuery( "from Baz baz join baz.stringDateMap date where index(date) = 'foo'" ).list();
+		s.createQuery( "from Baz baz join baz.topGlarchez g where index(g) = 'A'" ).list();
+		s.createQuery( "select index(g) from Baz baz join baz.topGlarchez g" ).list();
+
+		assertTrue( s.createQuery( "from Baz baz left join baz.stringSet" ).list().size()==3 );
+		baz = (Baz) s.createQuery( "from Baz baz join baz.stringSet str where str='foo'" ).list().get(0);
+		assertTrue( !Hibernate.isInitialized( baz.getStringSet() ) );
+		baz = (Baz) s.createQuery( "from Baz baz left join fetch baz.stringSet" ).list().get(0);
+		assertTrue( Hibernate.isInitialized( baz.getStringSet() ) );
+		assertTrue( s.createQuery( "from Baz baz join baz.stringSet string where string='foo'" ).list().size()==1 );
+		assertTrue( s.createQuery( "from Baz baz inner join baz.components comp where comp.name='foo'" ).list().size()==1 );
+		//List bss = s.find("select baz, ss from Baz baz inner join baz.stringSet ss");
+		s.createQuery( "from Glarch g inner join g.fooComponents comp where comp.fee is not null" ).list();
+		s.createQuery( "from Glarch g inner join g.fooComponents comp join comp.fee fee where fee.count > 0" ).list();
+		s.createQuery( "from Glarch g inner join g.fooComponents comp where comp.fee.count is not null" ).list();
+
+		s.delete(baz);
+		s.delete( s.get(Glarch.class, gid) );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testBatchLoad() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Baz baz = new Baz();
+		SortedSet stringSet = new TreeSet();
+		stringSet.add("foo");
+		stringSet.add("bar");
+		Set fooSet = new HashSet();
+		for (int i=0; i<3; i++) {
+			Foo foo = new Foo();
+			s.save(foo);
+			fooSet.add(foo);
+		}
+		baz.setFooSet(fooSet);
+		baz.setStringSet(stringSet);
+		s.save(baz);
+		Baz baz2 = new Baz();
+		fooSet = new HashSet();
+		for (int i=0; i<2; i++) {
+			Foo foo = new Foo();
+			s.save(foo);
+			fooSet.add(foo);
+		}
+		baz2.setFooSet(fooSet);
+		s.save(baz2);
+		Baz baz3 = new Baz();
+		stringSet = new TreeSet();
+		stringSet.add("foo");
+		stringSet.add("baz");
+		baz3.setStringSet(stringSet);
+		s.save(baz3);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		baz = (Baz) s.load( Baz.class, baz.getCode() );
+		baz2 = (Baz) s.load( Baz.class, baz2.getCode() );
+		baz3 = (Baz) s.load( Baz.class, baz3.getCode() );
+		assertFalse( Hibernate.isInitialized(baz.getFooSet()) || Hibernate.isInitialized(baz2.getFooSet()) || Hibernate.isInitialized(baz3.getFooSet()) );
+		assertFalse( Hibernate.isInitialized(baz.getStringSet()) || Hibernate.isInitialized(baz2.getStringSet()) || Hibernate.isInitialized(baz3.getStringSet()) );
+		assertTrue( baz.getFooSet().size()==3 );
+		assertTrue( Hibernate.isInitialized(baz.getFooSet()) && Hibernate.isInitialized(baz2.getFooSet()) && Hibernate.isInitialized(baz3.getFooSet()));
+		assertTrue( baz2.getFooSet().size()==2 );
+		assertTrue( baz3.getStringSet().contains("baz") );
+		assertTrue( Hibernate.isInitialized(baz.getStringSet()) && Hibernate.isInitialized(baz2.getStringSet()) && Hibernate.isInitialized(baz3.getStringSet()));
+		assertTrue( baz.getStringSet().size()==2 && baz2.getStringSet().size()==0 );
+		s.delete(baz);
+		s.delete(baz2);
+		s.delete(baz3);
+		Iterator iter = new JoinedIterator( new Iterator[] { baz.getFooSet().iterator(), baz2.getFooSet().iterator() } );
+		while ( iter.hasNext() ) s.delete( iter.next() );
+		s.getTransaction().commit();
+		s.close();
+
+	}
+
+	public void testFetchInitializedCollection() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Baz baz = new Baz();
+		Collection fooBag = new ArrayList();
+		fooBag.add( new Foo() );
+		fooBag.add( new Foo() );
+		baz.setFooBag(fooBag);
+		s.save(baz);
+		s.flush();
+		fooBag = baz.getFooBag();
+		s.createQuery( "from Baz baz left join fetch baz.fooBag" ).list();
+		assertTrue( fooBag==baz.getFooBag() );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		baz = (Baz) s.load( Baz.class, baz.getCode() );
+		Object bag = baz.getFooBag();
+		assertFalse( Hibernate.isInitialized(bag) );
+		s.createQuery( "from Baz baz left join fetch baz.fooBag" ).list();
+		assertTrue( bag==baz.getFooBag() );
+		assertTrue( baz.getFooBag().size()==2 );
+		s.delete(baz);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testLateCollectionAdd() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Baz baz = new Baz();
+		List l = new ArrayList();
+		baz.setStringList(l);
+		l.add("foo");
+		Serializable id = s.save(baz);
+		l.add("bar");
+		s.flush();
+		l.add("baz");
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		baz = (Baz) s.load(Baz.class, id);
+		assertTrue( baz.getStringList().size()==3 && baz.getStringList().contains("bar") );
+		s.delete(baz);
+		s.getTransaction().commit();
+		s.close();
+
+	}
+
+	public void testUpdate() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Foo foo = new Foo();
+		s.save(foo);
+		s.getTransaction().commit();
+		s.close();
+
+		foo = (Foo) SerializationHelper.deserialize( SerializationHelper.serialize(foo) );
+
+		s = openSession();
+		s.beginTransaction();
+		FooProxy foo2 = (FooProxy) s.load( Foo.class, foo.getKey() );
+		foo2.setString("dirty");
+		foo2.setBoolean( new Boolean(false) );
+		foo2.setBytes( new byte[] { 1,2,3} );
+		foo2.setDate(null);
+		foo2.setShort( new Short("69") );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		foo2.setString("dirty again");
+		s.update(foo2);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		foo2.setString("dirty again 2");
+		s.update(foo2);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		Foo foo3 = new Foo();
+		s.load( foo3, foo.getKey() );
+		// There is an interbase bug that causes null integers to return as 0, also numeric precision is <= 15
+		assertTrue( "update", foo2.equalsFoo(foo3) );
+		s.delete(foo3);
+		doDelete( s, "from Glarch" );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testListRemove() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Baz b = new Baz();
+		List stringList = new ArrayList();
+		List feeList = new ArrayList();
+		b.setFees(feeList);
+		b.setStringList(stringList);
+		feeList.add( new Fee() );
+		feeList.add( new Fee() );
+		feeList.add( new Fee() );
+		feeList.add( new Fee() );
+		stringList.add("foo");
+		stringList.add("bar");
+		stringList.add("baz");
+		stringList.add("glarch");
+		s.save(b);
+		s.flush();
+		stringList.remove(1);
+		feeList.remove(1);
+		s.flush();
+		s.evict(b);
+		s.refresh(b);
+		assertTrue( b.getFees().size()==3 );
+		stringList = b.getStringList();
+		assertTrue(
+			stringList.size()==3 &&
+			"baz".equals( stringList.get(1) ) &&
+			"foo".equals( stringList.get(0) )
+		);
+		s.delete(b);
+		doDelete( s, "from Fee" );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testFetchInitializedCollectionDupe() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Baz baz = new Baz();
+		Collection fooBag = new ArrayList();
+		fooBag.add( new Foo() );
+		fooBag.add( new Foo() );
+		baz.setFooBag(fooBag);
+		s.save(baz);
+		s.flush();
+		fooBag = baz.getFooBag();
+		s.createQuery( "from Baz baz left join fetch baz.fooBag" ).list();
+		assertTrue( Hibernate.isInitialized(fooBag) );
+		assertTrue( fooBag==baz.getFooBag() );
+		assertTrue( baz.getFooBag().size()==2 );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		baz = (Baz) s.load( Baz.class, baz.getCode() );
+		Object bag = baz.getFooBag();
+		assertFalse( Hibernate.isInitialized(bag) );
+		s.createQuery( "from Baz baz left join fetch baz.fooBag" ).list();
+		assertTrue( Hibernate.isInitialized(bag) );
+		assertTrue( bag==baz.getFooBag() );
+		assertTrue( baz.getFooBag().size()==2 );
+		s.delete(baz);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testSortables() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Baz b = new Baz();
+		b.setName("name");
+		SortedSet ss = new TreeSet();
+		ss.add( new Sortable("foo") );
+		ss.add( new Sortable("bar") );
+		ss.add( new Sortable("baz") );
+		b.setSortablez(ss);
+		s.save(b);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		Criteria cr = s.createCriteria(Baz.class);
+		cr.setFetchMode( "topGlarchez", FetchMode.SELECT );
+		List result = cr
+			.addOrder( Order.asc("name") )
+			.list();
+		assertTrue( result.size()==1 );
+		b = (Baz) result.get(0);
+		assertTrue( b.getSortablez().size()==3 );
+		assertEquals( ( (Sortable) b.getSortablez().iterator().next() ).getName(), "bar" );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		result = s.createQuery("from Baz baz left join fetch baz.sortablez order by baz.name asc")
+			.list();
+		b = (Baz) result.get(0);
+		assertTrue( b.getSortablez().size()==3 );
+		assertEquals( ( (Sortable) b.getSortablez().iterator().next() ).getName(), "bar" );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		result = s.createQuery("from Baz baz order by baz.name asc")
+			.list();
+		b = (Baz) result.get(0);
+		assertTrue( b.getSortablez().size()==3 );
+		assertEquals( ( (Sortable) b.getSortablez().iterator().next() ).getName(), "bar" );
+		s.delete(b);
+		s.getTransaction().commit();
+		s.close();
+
+	}
+
+	public void testFetchList() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Baz baz = new Baz();
+		s.save(baz);
+		Foo foo = new Foo();
+		s.save(foo);
+		Foo foo2 = new Foo();
+		s.save(foo2);
+		s.flush();
+		List list = new ArrayList();
+		for ( int i=0; i<5; i++ ) {
+			Fee fee = new Fee();
+			list.add(fee);
+		}
+		baz.setFees(list);
+		list = s.createQuery( "from Foo foo, Baz baz left join fetch baz.fees" ).list();
+		assertTrue( Hibernate.isInitialized( ( (Baz) ( (Object[]) list.get(0) )[1] ).getFees() ) );
+		s.delete(foo);
+		s.delete(foo2);
+		s.delete(baz);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testBagOneToMany() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Baz baz = new Baz();
+		List list = new ArrayList();
+		baz.setBazez(list);
+		list.add( new Baz() );
+		s.save(baz);
+		s.flush();
+		list.add( new Baz() );
+		s.flush();
+		list.add( 0, new Baz() );
+		s.flush();
+		s.delete( list.remove(1) );
+		s.flush();
+		s.delete(baz);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testQueryLockMode() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Bar bar = new Bar();
+		s.save(bar);
+		s.flush();
+		bar.setString("changed");
+		Baz baz = new Baz();
+		baz.setFoo(bar);
+		s.save(baz);
+		Query q = s.createQuery("from Foo foo, Bar bar");
+		if ( !(getDialect() instanceof DB2Dialect) ) {
+			q.setLockMode("bar", LockMode.UPGRADE);
+		}
+		Object[] result = (Object[]) q.uniqueResult();
+		Object b = result[0];
+		assertTrue( s.getCurrentLockMode(b)==LockMode.WRITE && s.getCurrentLockMode( result[1] )==LockMode.WRITE );
+		tx.commit();
+		s.disconnect();
+
+		s.reconnect();
+		tx = s.beginTransaction();
+		assertTrue( s.getCurrentLockMode(b)==LockMode.NONE );
+		s.createQuery( "from Foo foo" ).list();
+		assertTrue( s.getCurrentLockMode(b)==LockMode.NONE );
+		q = s.createQuery("from Foo foo");
+		q.setLockMode("foo", LockMode.READ);
+		q.list();
+		assertTrue( s.getCurrentLockMode(b)==LockMode.READ);
+		s.evict(baz);
+		tx.commit();
+		s.disconnect();
+		
+		s.reconnect();
+		tx = s.beginTransaction();
+		assertTrue( s.getCurrentLockMode(b)==LockMode.NONE );
+		s.delete( s.load( Baz.class, baz.getCode() ) );
+		assertTrue( s.getCurrentLockMode(b)==LockMode.NONE );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		q = s.createQuery("from Foo foo, Bar bar, Bar bar2");
+		if ( !(getDialect() instanceof DB2Dialect) ) {
+			q.setLockMode("bar", LockMode.UPGRADE);
+		}
+		q.setLockMode("bar2", LockMode.READ);
+		result = (Object[]) q.list().get(0);
+		if ( !(getDialect() instanceof DB2Dialect) ) {
+			assertTrue( s.getCurrentLockMode( result[0] )==LockMode.UPGRADE && s.getCurrentLockMode( result[1] )==LockMode.UPGRADE );
+		}
+		s.delete( result[0] );
+		tx.commit();
+		s.close();
+	}
+
+	public void testManyToManyBag() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Baz baz = new Baz();
+		Serializable id = s.save(baz);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		baz = (Baz) s.load(Baz.class, id);
+		baz.getFooBag().add( new Foo() );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		baz = (Baz) s.load(Baz.class, id);
+		assertTrue( !Hibernate.isInitialized( baz.getFooBag() ) );
+		assertTrue( baz.getFooBag().size()==1 );
+		if ( !(getDialect() instanceof HSQLDialect) ) assertTrue( Hibernate.isInitialized( baz.getFooBag().iterator().next() ) );
+		s.delete(baz);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testIdBag() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Baz baz = new Baz();
+		s.save(baz);
+		List l = new ArrayList();
+		List l2 = new ArrayList();
+		baz.setIdFooBag(l);
+		baz.setByteBag(l2);
+		l.add( new Foo() );
+		l.add( new Bar() );
+		byte[] bytes = "ffo".getBytes();
+		l2.add(bytes);
+		l2.add( "foo".getBytes() );
+		s.flush();
+		l.add( new Foo() );
+		l.add( new Bar() );
+		l2.add( "bar".getBytes() );
+		s.flush();
+		s.delete( l.remove(3) );
+		bytes[1]='o';
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		baz = (Baz) s.load(Baz.class, baz.getCode());
+		assertTrue( baz.getIdFooBag().size()==3 );
+		assertTrue( baz.getByteBag().size()==3 );
+		bytes = "foobar".getBytes();
+		Iterator iter = baz.getIdFooBag().iterator();
+		while ( iter.hasNext() ) s.delete( iter.next() );
+		baz.setIdFooBag(null);
+		baz.getByteBag().add(bytes);
+		baz.getByteBag().add(bytes);
+		assertTrue( baz.getByteBag().size()==5 );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		baz = (Baz) s.load(Baz.class, baz.getCode());
+		assertTrue( baz.getIdFooBag().size()==0 );
+		assertTrue( baz.getByteBag().size()==5 );
+		baz.getIdFooBag().add( new Foo() );
+		iter = baz.getByteBag().iterator();
+		iter.next();
+		iter.remove();
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		baz = (Baz) s.load(Baz.class, baz.getCode());
+		assertTrue( baz.getIdFooBag().size()==1 );
+		assertTrue( baz.getByteBag().size()==4 );
+		s.delete(baz);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	private boolean isOuterJoinFetchingDisabled() {
+		return new Integer(0).equals( ( (SessionFactoryImplementor) getSessions() ).getSettings().getMaximumFetchDepth() );
+	}
+
+	public void testForceOuterJoin() throws Exception {
+		if ( isOuterJoinFetchingDisabled() ) {
+			return;
+		}
+
+		Session s = openSession();
+		s.beginTransaction();
+		Glarch g = new Glarch();
+		FooComponent fc = new FooComponent();
+		fc.setGlarch(g);
+		FooProxy f = new Foo();
+		FooProxy f2 = new Foo();
+		f.setComponent(fc);
+		f.setFoo(f2);
+		s.save(f2);
+		Serializable id = s.save(f);
+		Serializable gid = s.getIdentifier( f.getComponent().getGlarch() );
+		s.getTransaction().commit();
+		s.close();
+
+		getSessions().evict(Foo.class);
+
+		s = openSession();
+		s.beginTransaction();
+		f = (FooProxy) s.load(Foo.class, id);
+		assertFalse( Hibernate.isInitialized(f) );
+		assertTrue( Hibernate.isInitialized( f.getComponent().getGlarch() ) ); //outer-join="true"
+		assertFalse( Hibernate.isInitialized( f.getFoo() ) ); //outer-join="auto"
+		assertEquals( s.getIdentifier( f.getComponent().getGlarch() ), gid );
+		s.delete(f);
+		s.delete( f.getFoo() );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testEmptyCollection() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Serializable id = s.save( new Baz() );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		Baz baz = (Baz) s.load(Baz.class, id);
+		Set foos = baz.getFooSet();
+		assertTrue( foos.size()==0 );
+		Foo foo = new Foo();
+		foos.add(foo);
+		s.save(foo);
+		s.flush();
+		s.delete(foo);
+		s.delete(baz);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testOneToOneGenerator() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		X x = new X();
+		Y y = new Y();
+		x.setY(y);
+		y.setTheX(x);
+		x.getXxs().add( new X.XX(x) );
+		x.getXxs().add( new X.XX(x) );
+		Serializable id = s.save(y);
+		assertEquals( id, s.save(x) );
+		s.flush();
+		assertTrue( s.contains(y) && s.contains(x) );
+		s.getTransaction().commit();
+		s.close();
+		assertEquals( new Long(x.getId()), y.getId() );
+
+		s = openSession();
+		s.beginTransaction();
+		x = new X();
+		y = new Y();
+		x.setY(y);
+		y.setTheX(x);
+		x.getXxs().add( new X.XX(x) );
+		s.save(y);
+		s.flush();
+		assertTrue( s.contains(y) && s.contains(x) );
+		s.getTransaction().commit();
+		s.close();
+		assertEquals( new Long(x.getId()), y.getId() );
+
+		s = openSession();
+		s.beginTransaction();
+		x = new X();
+		y = new Y();
+		x.setY(y);
+		y.setTheX(x);
+		x.getXxs().add( new X.XX(x) );
+		x.getXxs().add( new X.XX(x) );
+		id = s.save(x);
+		assertEquals( id, y.getId() );
+		assertEquals( id, new Long( x.getId() ) );
+		s.flush();
+		assertTrue( s.contains(y) && s.contains(x) );
+		doDelete( s, "from X x" );
+		s.getTransaction().commit();
+		s.close();
+
+	}
+
+	public void testLimit() throws Exception {
+		Session s = openSession();
+		Transaction txn = s.beginTransaction();
+		for ( int i=0; i<10; i++ ) s.save( new Foo() );
+		Iterator iter = s.createQuery("from Foo foo")
+			.setMaxResults(4)
+			.setFirstResult(2)
+			.iterate();
+		int count=0;
+		while ( iter.hasNext() ) {
+			iter.next();
+			count++;
+		}
+		assertTrue(count==4);
+		iter = s.createQuery("select distinct foo from Foo foo")
+			.setMaxResults(2)
+			.setFirstResult(2)
+			.list()
+			.iterator();
+		count=0;
+		while ( iter.hasNext() ) {
+			iter.next();
+			count++;
+		}
+		assertTrue(count==2);
+		iter = s.createQuery("select distinct foo from Foo foo")
+		.setMaxResults(3)
+		.list()
+		.iterator();
+		count=0;
+		while ( iter.hasNext() ) {
+			iter.next();
+			count++;
+		}
+		assertTrue(count==3);
+		assertEquals( 10, doDelete( s, "from Foo foo" ) );
+		txn.commit();
+		s.close();
+	}
+
+	public void testCustom() throws Exception {
+		GlarchProxy g = new Glarch();
+		Multiplicity m = new Multiplicity();
+		m.count = 12;
+		m.glarch = (Glarch) g;
+		g.setMultiple(m);
+
+		Session s = openSession();
+		s.beginTransaction();
+		Serializable gid = s.save(g);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		//g = (Glarch) s.createQuery( "from Glarch g where g.multiple.count=12" ).list().get(0);
+		s.createQuery( "from Glarch g where g.multiple.count=12" ).list().get(0);
+		s.getTransaction().commit();
+		s.close();
+		
+		s = openSession();
+		s.beginTransaction();
+		g = (Glarch) s.createQuery( "from Glarch g where g.multiple.glarch=g and g.multiple.count=12" ).list().get(0);
+		assertTrue( g.getMultiple()!=null );
+		assertEquals( g.getMultiple().count, 12 );
+		assertSame(g.getMultiple().glarch, g);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		g = (GlarchProxy) s.load(Glarch.class, gid);
+		assertTrue( g.getMultiple()!=null );
+		assertEquals( g.getMultiple().count, 12 );
+		assertSame(g.getMultiple().glarch, g);
+		s.delete(g);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testSaveAddDelete() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Baz baz = new Baz();
+		Set bars = new HashSet();
+		baz.setCascadingBars(bars);
+		s.save(baz);
+		s.flush();
+		baz.getCascadingBars().add( new Bar() );
+		s.delete(baz);
+		s.flush();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testNamedParams() throws Exception {
+		Bar bar = new Bar();
+		Bar bar2 = new Bar();
+		bar.setName("Bar");
+		bar2.setName("Bar Two");
+		bar.setX(10);
+		bar2.setX(1000);Baz baz = new Baz();
+		baz.setCascadingBars( new HashSet() );
+		baz.getCascadingBars().add(bar);
+		bar.setBaz(baz);
+
+		Session s = openSession();
+		Transaction txn = s.beginTransaction();
+		s.save(baz);
+		s.save(bar2);
+
+		List list = s.createQuery(
+				"from Bar bar left join bar.baz baz left join baz.cascadingBars b where bar.name like 'Bar %'"
+		).list();
+		Object row = list.iterator().next();
+		assertTrue( row instanceof Object[] && ( (Object[]) row ).length==3 );
+
+		Query q = s.createQuery("select bar, b from Bar bar left join bar.baz baz left join baz.cascadingBars b where bar.name like 'Bar%'");
+		list = q.list();
+		if ( !(getDialect() instanceof SAPDBDialect) ) assertTrue( list.size()==2 );
+
+		q = s.createQuery("select bar, b from Bar bar left join bar.baz baz left join baz.cascadingBars b where ( bar.name in (:nameList) or bar.name in (:nameList) ) and bar.string = :stringVal");
+		HashSet nameList = new HashSet();
+		nameList.add("bar");
+		nameList.add("Bar");
+		nameList.add("Bar Two");
+		q.setParameterList("nameList", nameList);
+		q.setParameter("stringVal", "a string");
+		list = q.list();
+		if ( !(getDialect() instanceof SAPDBDialect) ) assertTrue( list.size()==2 );
+
+		try {
+			q.setParameterList("nameList", (Collection)null);
+			fail("Should throw an queryexception when passing a null!");
+		} catch (QueryException qe) {
+			//should happen
+		}
+
+
+		if (dialectSupportsEmptyInList("HQL 'x in (:name)'  with EMPTY_LIST.")) { 
+				q.setParameterList("nameList", Collections.EMPTY_LIST);
+			list = q.list();
+			assertTrue( list.size()==0 );
+		}
+
+		q = s.createQuery("select bar, b from Bar bar inner join bar.baz baz inner join baz.cascadingBars b where bar.name like 'Bar%'");
+		Object result = q.uniqueResult();
+		assertTrue( result!=null );
+		q = s.createQuery("select bar, b from Bar bar left join bar.baz baz left join baz.cascadingBars b where bar.name like :name and b.name like :name");
+		q.setString("name", "Bar%");
+		list = q.list();
+		assertTrue( list.size()==1 );
+
+
+		// This test added for issue HB-297 - there is an named parameter in the Order By clause
+		q = s.createQuery("select bar from Bar bar order by ((bar.x - :valueX)*(bar.x - :valueX))");
+		q.setInteger("valueX", bar.getX()+1);
+		list = q.list();
+		assertTrue( ((Bar)list.get(0)).getX() == bar.getX());
+		q.setInteger("valueX", bar2.getX()+1);
+		list = q.list();
+		assertTrue( ((Bar)list.get(0)).getX() == bar2.getX());
+
+		s.delete(baz);
+		s.delete(bar2);
+		txn.commit();
+		s.close();
+	}
+
+	public void testParameterCheck() throws HibernateException {
+		Session s = openSession();
+		try {
+			Query q = s.createQuery("select bar from Bar as bar where bar.x > :myX");
+			q.list();
+			fail("Should throw QueryException for missing myX");
+		}
+		catch (QueryException iae) {
+			// should happen
+		}
+		finally {
+			s.close();
+		}
+
+		s = openSession();
+		try {
+			Query q = s.createQuery("select bar from Bar as bar where bar.x > ?");
+			q.list();
+			fail("Should throw QueryException for missing ?");
+		}
+		catch (QueryException iae) {
+			// should happen
+		}
+		finally {
+			s.close();
+		}
+
+		s = openSession();
+		try {
+			Query q = s.createQuery("select bar from Bar as bar where bar.x > ? or bar.short = 1 or bar.string = 'ff ? bb'");
+			q.setInteger(0, 1);
+			q.list();
+		}
+		catch (QueryException iae) {
+			fail("Should not throw QueryException for missing ?");
+		}
+		finally {
+			s.close();
+		}
+
+		s = openSession();
+		try {
+			Query q = s.createQuery("select bar from Bar as bar where bar.string = ' ? ' or bar.string = '?'");
+			q.list();
+		}
+		catch (QueryException iae) {
+			fail("Should not throw QueryException for ? in quotes");
+		}
+		finally {
+			s.close();
+		}
+
+		s = openSession();
+		try {
+			Query q = s.createQuery("select bar from Bar as bar where bar.string = ? or bar.string = ? or bar.string = ?");
+			q.setParameter(0, "bull");
+			q.setParameter(2, "shit");
+			q.list();
+			fail("should throw exception telling me i have not set parameter 1");
+		}
+		catch (QueryException iae) {
+			// should happen!
+		}
+		finally {
+			s.close();
+		}
+	}
+	public void testDyna() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		GlarchProxy g = new Glarch();
+		g.setName("G");
+		Serializable id = s.save(g);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		g = (GlarchProxy) s.load(Glarch.class, id);
+		assertTrue( g.getName().equals("G") );
+		assertTrue( g.getDynaBean().get("foo").equals("foo") && g.getDynaBean().get("bar").equals( new Integer(66) ) );
+		assertTrue( ! (g instanceof Glarch) );
+		g.getDynaBean().put("foo", "bar");
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		g = (GlarchProxy) s.load(Glarch.class, id);
+		assertTrue( g.getDynaBean().get("foo").equals("bar") && g.getDynaBean().get("bar").equals( new Integer(66) ) );
+		g.setDynaBean(null);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		g = (GlarchProxy) s.load(Glarch.class, id);
+		assertTrue( g.getDynaBean()==null );
+		s.delete(g);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testFindByCriteria() throws Exception {
+		if ( getDialect() instanceof DB2Dialect ) {
+			return;
+		}
+
+		Session s = openSession();
+		Transaction txn = s.beginTransaction();
+		Foo f = new Foo();
+		s.save(f);
+		s.flush();
+
+		List list = s.createCriteria(Foo.class)
+			.add( Restrictions.eq( "integer", f.getInteger() ) )
+			.add( Restrictions.eqProperty("integer", "integer") )
+			.add( Restrictions.like( "string", f.getString().toUpperCase() ).ignoreCase() )
+			.add( Restrictions.in( "boolean", new Boolean[] { f.getBoolean(), f.getBoolean() } ) )
+			.setFetchMode("foo", FetchMode.JOIN)
+			.setFetchMode("baz", FetchMode.SELECT)
+			.setFetchMode("abstracts", FetchMode.JOIN)
+			.list();
+		assertTrue( list.size()==1 && list.get(0)==f );
+
+		list = s.createCriteria(Foo.class).add(
+				Restrictions.disjunction()
+					.add( Restrictions.eq( "integer", f.getInteger() ) )
+					.add( Restrictions.like( "string", f.getString() ) )
+					.add( Restrictions.eq( "boolean", f.getBoolean() ) )
+			)
+			.add( Restrictions.isNotNull("boolean") )
+			.list();
+		assertTrue( list.size()==1 && list.get(0)==f );
+
+		Foo example = new Foo();
+		example.setString("a STRing");
+		list = s.createCriteria(Foo.class).add(
+			Example.create(example)
+				.excludeZeroes()
+				.ignoreCase()
+				.excludeProperty("bool")
+				.excludeProperty("char")
+				.excludeProperty("yesno")
+			)
+			.list();
+		assertTrue( "Example API without like did not work correctly, size was " + list.size(), list.size()==1 && list.get(0)==f );
+		example.setString("rin");
+
+		list = s.createCriteria(Foo.class).add(
+			Example.create(example)
+				.excludeZeroes()
+				.enableLike(MatchMode.ANYWHERE)
+				.excludeProperty("bool")
+				.excludeProperty("char")
+				.excludeProperty("yesno")
+			)
+			.list();
+		assertTrue( "Example API without like did not work correctly, size was " + list.size(), list.size()==1 && list.get(0)==f );
+
+		list = s.createCriteria(Foo.class)
+			.add( Restrictions.or(
+					Restrictions.and(
+					Restrictions.eq( "integer", f.getInteger() ),
+					Restrictions.like( "string", f.getString() )
+				),
+				Restrictions.eq( "boolean", f.getBoolean() )
+			) )
+			.list();
+		assertTrue( list.size()==1 && list.get(0)==f );
+		list = s.createCriteria(Foo.class)
+			.setMaxResults(5)
+			.addOrder( Order.asc("date") )
+			.list();
+		assertTrue( list.size()==1 && list.get(0)==f );
+		if(!(getDialect() instanceof TimesTenDialect)) {
+			list = s.createCriteria(Foo.class).setMaxResults(0).list();
+			assertTrue( list.size()==0 );
+		}
+		list = s.createCriteria(Foo.class)
+			.setFirstResult(1)
+			.addOrder( Order.asc("date") )
+			.addOrder( Order.desc("string") )
+			.list();
+		assertTrue( list.size()==0 );
+		list = s.createCriteria(Foo.class)
+			.setFetchMode( "component.importantDates", FetchMode.JOIN )
+			.list();
+		assertTrue( list.size()==3 );
+
+		list = s.createCriteria(Foo.class)
+			.setFetchMode( "component.importantDates", FetchMode.JOIN )
+			.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
+			.list();
+		assertTrue( list.size()==1 );
+
+		f.setFoo( new Foo() );
+		s.save( f.getFoo() );
+		txn.commit();
+		s.close();
+
+		s = openSession();
+		txn = s.beginTransaction();
+		list = s.createCriteria(Foo.class)
+			.add( Restrictions.eq( "integer", f.getInteger() ) )
+			.add( Restrictions.like( "string", f.getString() ) )
+			.add( Restrictions.in( "boolean", new Boolean[] { f.getBoolean(), f.getBoolean() } ) )
+			.add( Restrictions.isNotNull("foo") )
+			.setFetchMode( "foo", FetchMode.JOIN )
+			.setFetchMode( "baz", FetchMode.SELECT )
+			.setFetchMode( "component.glarch", FetchMode.SELECT )
+			.setFetchMode( "foo.baz", FetchMode.SELECT )
+			.setFetchMode( "foo.component.glarch", FetchMode.SELECT )
+			.list();
+		f = (Foo) list.get(0);
+		assertTrue( Hibernate.isInitialized( f.getFoo() ) );
+		assertTrue( !Hibernate.isInitialized( f.getComponent().getGlarch() ) );
+
+		s.save( new Bar() );
+		list = s.createCriteria(Bar.class)
+			.list();
+		assertTrue( list.size()==1 );
+		assertTrue( s.createCriteria(Foo.class).list().size()==3 );
+		s.delete( list.get(0) );
+
+		s.delete( f.getFoo() );
+		s.delete(f);
+		txn.commit();
+		s.close();
+	}
+
+	public void testAfterDelete() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Foo foo = new Foo();
+		s.save(foo);
+		s.flush();
+		s.delete(foo);
+		s.save(foo);
+		s.delete(foo);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testCollectionWhere() throws Exception {
+		Foo foo1 = new Foo();
+		Foo foo2 = new Foo();
+		Baz baz = new Baz();
+		Foo[] arr = new Foo[10];
+		arr[0] = foo1;
+		arr[9] = foo2;
+
+		Session s = openSession();
+		s.beginTransaction();
+		s.save(foo1);
+		s.save(foo2);
+		baz.setFooArray(arr);
+		s.save(baz);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		baz = (Baz) s.load( Baz.class, baz.getCode() );
+		assertTrue( baz.getFooArray().length==1 );
+		assertTrue( s.createQuery( "from Baz baz join baz.fooArray foo" ).list().size()==1 );
+		assertTrue( s.createQuery( "from Foo foo" ).list().size()==2 );
+		assertTrue( s.createFilter( baz.getFooArray(), "" ).list().size()==1 );
+		//assertTrue( s.delete("from java.lang.Object o")==9 );
+		doDelete( s, "from Foo foo" );
+		String bazid = baz.getCode();
+		s.delete(baz);
+		int rows=s.connection().createStatement().executeUpdate(
+			"delete from fooArray where id_='" + bazid + "' and i>=8"
+		);
+		assertTrue(rows==1);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testComponentParent() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		BarProxy bar = new Bar();
+		bar.setBarComponent( new FooComponent() );
+		Baz baz = new Baz();
+		baz.setComponents( new FooComponent[] { new FooComponent(), new FooComponent() } );
+		s.save(bar);
+		s.save(baz);
+		t.commit();
+		s.close();
+		s = openSession();
+		t = s.beginTransaction();
+		bar = (BarProxy) s.load(Bar.class, bar.getKey());
+		s.load(baz, baz.getCode());
+		assertTrue( bar.getBarComponent().getParent()==bar );
+		assertTrue( baz.getComponents()[0].getBaz()==baz && baz.getComponents()[1].getBaz()==baz );
+		s.delete(baz);
+		s.delete(bar);
+		t.commit();
+		s.close();
+	}
+
+	public void testCollectionCache() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Baz baz = new Baz();
+		baz.setDefaults();
+		s.save(baz);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.load( Baz.class, baz.getCode() );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		baz = (Baz) s.load( Baz.class, baz.getCode() );
+		s.delete(baz);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void ntestAssociationId() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Bar bar = new Bar();
+		String id = (String) s.save(bar);
+		MoreStuff more = new MoreStuff();
+		more.setName("More Stuff");
+		more.setIntId(12);
+		more.setStringId("id");
+		Stuff stuf = new Stuff();
+		stuf.setMoreStuff(more);
+		more.setStuffs( new ArrayList() );
+		more.getStuffs().add(stuf);
+		stuf.setFoo(bar);
+		stuf.setId(1234);
+		stuf.setProperty( TimeZone.getDefault() );
+		s.save(more);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		List results = s.createQuery(
+				"from Stuff as s where s.foo.id = ? and s.id.id = ? and s.moreStuff.id.intId = ? and s.moreStuff.id.stringId = ?"
+		)
+				.setParameter( 0, bar, Hibernate.entity(Foo.class) )
+				.setParameter( 1, new Long(1234), Hibernate.LONG )
+				.setParameter( 2, new Integer(12), Hibernate.INTEGER )
+				.setParameter( 3, "id", Hibernate.STRING )
+				.list();
+		assertEquals( 1, results.size() );
+		results = s.createQuery( "from Stuff as s where s.foo.id = ? and s.id.id = ? and s.moreStuff.name = ?" )
+				.setParameter( 0, bar, Hibernate.entity(Foo.class) )
+				.setParameter( 1, new Long(1234), Hibernate.LONG )
+				.setParameter( 2, "More Stuff", Hibernate.STRING )
+				.list();
+		assertEquals( 1, results.size() );
+		s.createQuery( "from Stuff as s where s.foo.string is not null" ).list();
+		assertTrue(
+				s.createQuery( "from Stuff as s where s.foo > '0' order by s.foo" ).list().size()==1
+		);
+		//s.createCriteria(Stuff.class).createCriteria("id.foo").add( Expression.isNull("foo") ).list();
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		FooProxy foo = (FooProxy) s.load(Foo.class, id);
+		s.load(more, more);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Stuff stuff = new Stuff();
+		stuff.setFoo(foo);
+		stuff.setId(1234);
+		stuff.setMoreStuff(more);
+		s.load(stuff, stuff);
+		assertTrue( stuff.getProperty().equals( TimeZone.getDefault() ) );
+		assertTrue( stuff.getMoreStuff().getName().equals("More Stuff") );
+		doDelete( s, "from MoreStuff" );
+		doDelete( s, "from Foo foo" );
+		t.commit();
+		s.close();
+	}
+
+	public void testCascadeSave() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Baz baz = new Baz();
+		List list = new ArrayList();
+		list.add( new Fee() );
+		list.add( new Fee() );
+		baz.setFees(list);
+		s.save(baz);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		baz = (Baz) s.load( Baz.class, baz.getCode() );
+		assertTrue( baz.getFees().size()==2 );
+		s.delete(baz);
+		assertTrue( !s.createQuery( "from Fee fee" ).iterate().hasNext() );
+		t.commit();
+		s.close();
+	}
+
+	public void testCollectionsInSelect() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Foo[] foos = new Foo[] { null, new Foo() };
+		s.save( foos[1] );
+		Baz baz = new Baz();
+		baz.setDefaults();
+		baz.setFooArray(foos);
+		s.save(baz);
+		Baz baz2 = new Baz();
+		baz2.setDefaults();
+		s.save(baz2);
+
+		Bar bar = new Bar();
+		bar.setBaz(baz);
+		s.save(bar);
+
+		List list = s.createQuery( "select new Result(foo.string, foo.long, foo.integer) from Foo foo" ).list();
+		assertTrue( list.size()==2 && ( list.get(0) instanceof Result ) && ( list.get(1) instanceof Result ) );
+		/*list = s.find("select new Result( baz.name, foo.long, count(elements(baz.fooArray)) ) from Baz baz join baz.fooArray foo group by baz.name, foo.long");
+		assertTrue( list.size()==1 && ( list.get(0) instanceof Result ) );
+		Result r = ((Result) list.get(0) );
+		assertEquals( r.getName(), baz.getName() );
+		assertEquals( r.getCount(), 1 );
+		assertEquals( r.getAmount(), foos[1].getLong().longValue() );*/
+		list = s.createQuery(
+				"select new Result( baz.name, max(foo.long), count(foo) ) from Baz baz join baz.fooArray foo group by baz.name"
+		).list();
+		assertTrue( list.size()==1 && ( list.get(0) instanceof Result ) );
+		Result r = ((Result) list.get(0) );
+		assertEquals( r.getName(), baz.getName() );
+		assertEquals( r.getCount(), 1 );
+		assertTrue( r.getAmount() > 696969696969696000l );
+
+
+		//s.find("select max( elements(bar.baz.fooArray) ) from Bar as bar");
+		//The following test is disabled for databases with no subselects...also for Interbase (not sure why).
+		if ( !(getDialect() instanceof MySQLDialect) && !(getDialect() instanceof HSQLDialect) /*&& !(dialect instanceof MckoiDialect)*/ && !(getDialect() instanceof SAPDBDialect) && !(getDialect() instanceof PointbaseDialect) )  {
+			s.createQuery( "select count(*) from Baz as baz where 1 in indices(baz.fooArray)" ).list();
+			s.createQuery( "select count(*) from Bar as bar where 'abc' in elements(bar.baz.fooArray)" ).list();
+			s.createQuery( "select count(*) from Bar as bar where 1 in indices(bar.baz.fooArray)" ).list();
+			if ( !(getDialect() instanceof DB2Dialect) &&  !(getDialect() instanceof Oracle8iDialect ) && !( getDialect() instanceof SybaseDialect ) && !( getDialect() instanceof Sybase11Dialect ) && !( getDialect() instanceof SybaseASE15Dialect ) && !( getDialect() instanceof PostgreSQLDialect )) {
+				// SybaseAnywhereDialect supports implicit conversions from strings to ints
+				s.createQuery(
+						"select count(*) from Bar as bar, bar.component.glarch.proxyArray as g where g.id in indices(bar.baz.fooArray)"
+				).list();
+				s.createQuery(
+						"select max( elements(bar.baz.fooArray) ) from Bar as bar, bar.component.glarch.proxyArray as g where g.id in indices(bar.baz.fooArray)"
+				).list();
+			}
+			s.createQuery(
+					"select count(*) from Bar as bar where '1' in (from bar.component.glarch.proxyArray g where g.name='foo')"
+			).list();
+			s.createQuery(
+					"select count(*) from Bar as bar where '1' in (from bar.component.glarch.proxyArray g where g.name='foo')"
+			).list();
+			s.createQuery(
+					"select count(*) from Bar as bar left outer join bar.component.glarch.proxyArray as pg where '1' in (from bar.component.glarch.proxyArray)"
+			).list();
+		}
+
+		list = s.createQuery(
+				"from Baz baz left join baz.fooToGlarch join fetch baz.fooArray foo left join fetch foo.foo"
+		).list();
+		assertTrue( list.size()==1 && ( (Object[]) list.get(0) ).length==2 );
+
+		s.createQuery(
+				"select baz.name from Bar bar inner join bar.baz baz inner join baz.fooSet foo where baz.name = bar.string"
+		).list();
+		s.createQuery(
+				"SELECT baz.name FROM Bar AS bar INNER JOIN bar.baz AS baz INNER JOIN baz.fooSet AS foo WHERE baz.name = bar.string"
+		).list();
+
+		if ( !( getDialect() instanceof HSQLDialect ) ) s.createQuery(
+				"select baz.name from Bar bar join bar.baz baz left outer join baz.fooSet foo where baz.name = bar.string"
+		).list();
+
+		s.createQuery( "select baz.name from Bar bar join bar.baz baz join baz.fooSet foo where baz.name = bar.string" )
+				.list();
+		s.createQuery(
+				"SELECT baz.name FROM Bar AS bar JOIN bar.baz AS baz JOIN baz.fooSet AS foo WHERE baz.name = bar.string"
+		).list();
+
+		if ( !( getDialect() instanceof HSQLDialect ) ) {
+			s.createQuery(
+					"select baz.name from Bar bar left join bar.baz baz left join baz.fooSet foo where baz.name = bar.string"
+			).list();
+			s.createQuery( "select foo.string from Bar bar left join bar.baz.fooSet foo where bar.string = foo.string" )
+					.list();
+		}
+
+		s.createQuery(
+				"select baz.name from Bar bar left join bar.baz baz left join baz.fooArray foo where baz.name = bar.string"
+		).list();
+		s.createQuery( "select foo.string from Bar bar left join bar.baz.fooArray foo where bar.string = foo.string" )
+				.list();
+
+		s.createQuery(
+				"select bar.string, foo.string from Bar bar inner join bar.baz as baz inner join baz.fooSet as foo where baz.name = 'name'"
+		).list();
+		s.createQuery( "select foo from Bar bar inner join bar.baz as baz inner join baz.fooSet as foo" ).list();
+		s.createQuery( "select foo from Bar bar inner join bar.baz.fooSet as foo" ).list();
+
+		s.createQuery(
+				"select bar.string, foo.string from Bar bar join bar.baz as baz join baz.fooSet as foo where baz.name = 'name'"
+		).list();
+		s.createQuery( "select foo from Bar bar join bar.baz as baz join baz.fooSet as foo" ).list();
+		s.createQuery( "select foo from Bar bar join bar.baz.fooSet as foo" ).list();
+
+		assertTrue( s.createQuery( "from Bar bar join bar.baz.fooArray foo" ).list().size()==1 );
+
+		assertTrue( s.createQuery( "from Bar bar join bar.baz.fooSet foo" ).list().size()==0 );
+		assertTrue( s.createQuery( "from Bar bar join bar.baz.fooArray foo" ).list().size()==1 );
+
+		s.delete(bar);
+
+		if ( getDialect() instanceof DB2Dialect || getDialect() instanceof PostgreSQLDialect ) {
+			s.createQuery( "select one from One one join one.manies many group by one order by count(many)" ).iterate();
+			s.createQuery( "select one from One one join one.manies many group by one having count(many) < 5" )
+					.iterate();
+		}
+
+		s.createQuery( "from One one join one.manies many where one.id = 1 and many.id = 1" ).list();
+		s.createQuery( "select one.id, elements(one.manies) from One one" ).iterate();
+		s.createQuery( "select max( elements(one.manies) ) from One one" ).iterate();
+		s.createQuery( "select one, elements(one.manies) from One one" ).list();
+		Iterator iter = s.createQuery( "select elements(baz.fooArray) from Baz baz where baz.id=?" )
+				.setParameter( 0, baz.getCode(), Hibernate.STRING )
+				.iterate();
+		assertTrue( iter.next()==foos[1] && !iter.hasNext() );
+		list = s.createQuery( "select elements(baz.fooArray) from Baz baz where baz.id=?" )
+				.setParameter( 0, baz.getCode(), Hibernate.STRING )
+				.list();
+		assertEquals( 1, list.size() );
+		iter = s.createQuery( "select indices(baz.fooArray) from Baz baz where baz.id=?" )
+				.setParameter( 0, baz.getCode(), Hibernate.STRING )
+				.iterate();
+		assertTrue( iter.next().equals( new Integer(1) ) && !iter.hasNext() );
+
+		iter = s.createQuery( "select size(baz.stringSet) from Baz baz where baz.id=?" )
+				.setParameter( 0, baz.getCode(), Hibernate.STRING )
+				.iterate();
+		assertEquals( new Integer(3), iter.next() );
+
+		s.createQuery( "from Foo foo where foo.component.glarch.id is not null" ).list();
+
+		iter = s.createQuery(
+				"select baz, size(baz.stringSet), count( distinct elements(baz.stringSet) ), max( elements(baz.stringSet) ) from Baz baz group by baz"
+		).iterate();
+		while ( iter.hasNext() ) {
+			Object[] arr = (Object[]) iter.next();
+			log.info( arr[0] + " " + arr[1] + " " + arr[2] + " " + arr[3] );
+		}
+		
+		s.delete(baz);
+		s.delete(baz2);
+		s.delete( foos[1] );
+		t.commit();
+		s.close();
+	}
+
+	public void testNewFlushing() throws Exception {
+		Session s = openSession();
+		Transaction txn = s.beginTransaction();
+		Baz baz = new Baz();
+		baz.setDefaults();
+		s.save(baz);
+		s.flush();
+		baz.getStringArray()[0] = "a new value";
+		Iterator iter = s.createQuery( "from Baz baz" ).iterate();//no flush
+		assertTrue( iter.next()==baz );
+		iter = s.createQuery( "select elements(baz.stringArray) from Baz baz" ).iterate();
+		boolean found = false;
+		while ( iter.hasNext() ) {
+			if ( iter.next().equals("a new value") ) found = true;
+		}
+		assertTrue(found);
+		baz.setStringArray(null);
+		s.createQuery( "from Baz baz" ).iterate(); //no flush
+		iter = s.createQuery( "select elements(baz.stringArray) from Baz baz" ).iterate();
+		assertTrue( !iter.hasNext() );
+		baz.getStringList().add("1E1");
+		iter = s.createQuery( "from Foo foo" ).iterate();//no flush
+		assertTrue( !iter.hasNext() );
+		iter = s.createQuery( "select elements(baz.stringList) from Baz baz" ).iterate();
+		found = false;
+		while ( iter.hasNext() ) {
+			if ( iter.next().equals("1E1") ) found = true;
+		}
+		assertTrue(found);
+		baz.getStringList().remove("1E1");
+		iter = s.createQuery( "select elements(baz.stringArray) from Baz baz" ).iterate(); //no flush
+		iter = s.createQuery( "select elements(baz.stringList) from Baz baz" ).iterate();
+		found = false;
+		while ( iter.hasNext() ) {
+			if ( iter.next().equals("1E1") ) found = true;
+		}
+		assertTrue(!found);
+
+		List newList = new ArrayList();
+		newList.add("value");
+		baz.setStringList(newList);
+		iter = s.createQuery( "from Foo foo" ).iterate();//no flush
+		baz.setStringList(null);
+		iter = s.createQuery( "select elements(baz.stringList) from Baz baz" ).iterate();
+		assertTrue( !iter.hasNext() );
+
+		baz.setStringList(newList);
+		iter = s.createQuery( "from Foo foo" ).iterate();//no flush
+		iter = s.createQuery( "select elements(baz.stringList) from Baz baz" ).iterate();
+		assertTrue( iter.hasNext() );
+
+		s.delete(baz);
+		txn.commit();
+		s.close();
+	}
+
+	public void testPersistCollections() throws Exception {
+		Session s = openSession();
+		Transaction txn = s.beginTransaction();
+		assertEquals( 0, ( (Long) s.createQuery( "select count(*) from Bar" ).iterate().next() ).longValue() );
+		assertTrue( s.createQuery( "select count(*) from Bar b" ).iterate().next().equals( new Long(0) ) );
+		assertFalse( s.createQuery( "from Glarch g" ).iterate().hasNext() );
+
+		Baz baz = new Baz();
+		s.save(baz);
+		baz.setDefaults();
+		baz.setStringArray( new String[] { "stuff" } );
+		Set bars = new HashSet();
+		bars.add( new Bar() );
+		baz.setCascadingBars(bars);
+		HashMap sgm = new HashMap();
+		sgm.put( "a", new Glarch() );
+		sgm.put( "b", new Glarch() );
+		baz.setStringGlarchMap(sgm);
+		txn.commit();
+		s.close();
+
+		s = openSession();
+		txn = s.beginTransaction();
+		assertTrue( ( (Long) s.createQuery( "select count(*) from Bar" ).iterate().next() ).longValue()==1 );
+		baz = (Baz) ( (Object[]) s.createQuery( "select baz, baz from Baz baz" ).list().get(0) )[1];
+		assertTrue( baz.getCascadingBars().size()==1 );
+		//System.out.println( s.print(baz) );
+		Foo foo = new Foo();
+		s.save(foo);
+		Foo foo2 = new Foo() ;
+		s.save(foo2);
+		baz.setFooArray( new Foo[] { foo, foo, null, foo2 } );
+		baz.getFooSet().add(foo);
+		baz.getCustoms().add( new String[] { "new", "custom" } );
+		baz.setStringArray(null);
+		baz.getStringList().set(0, "new value");
+		baz.setStringSet( new TreeSet() );
+		Time time = new java.sql.Time(12345);
+		baz.getTimeArray()[2] = time;
+		//System.out.println(time);
+
+		assertTrue( baz.getStringGlarchMap().size()==1 );
+
+		//The following test is disabled databases with no subselects
+		if ( !(getDialect() instanceof MySQLDialect) && !(getDialect() instanceof HSQLDialect) && !(getDialect() instanceof PointbaseDialect) )  {
+			List list = s.createQuery(
+					"select foo from Foo foo, Baz baz where foo in elements(baz.fooArray) and 3 = some elements(baz.intArray) and 4 > all indices(baz.intArray)"
+			).list();
+			assertTrue( "collection.elements find", list.size()==2 );
+		}
+		if (!(getDialect() instanceof SAPDBDialect) ) { // SAPDB doesn't like distinct with binary type
+			List list = s.createQuery( "select distinct foo from Baz baz join baz.fooArray foo" ).list();
+			assertTrue( "collection.elements find", list.size()==2 );
+		}
+
+		List list = s.createQuery( "select foo from Baz baz join baz.fooSet foo" ).list();
+		assertTrue( "association.elements find", list.size()==1 );
+		txn.commit();
+		s.close();
+
+		s = openSession();
+		txn = s.beginTransaction();
+		assertTrue( ( (Long) s.createQuery( "select count(*) from Bar" ).iterate().next() ).longValue()==1 );
+		baz = (Baz) s.createQuery( "select baz from Baz baz order by baz" ).list().get(0);
+		assertTrue( "collection of custom types - added element", baz.getCustoms().size()==4 && baz.getCustoms().get(0)!=null );
+		assertTrue ( "component of component in collection", baz.getComponents()[1].getSubcomponent()!=null );
+		assertTrue( baz.getComponents()[1].getBaz()==baz );
+		assertTrue( "set of objects", ( (FooProxy) baz.getFooSet().iterator().next() ).getKey().equals( foo.getKey() ));
+		assertTrue( "collection removed", baz.getStringArray().length==0 );
+		assertTrue( "changed element", baz.getStringList().get(0).equals("new value"));
+		assertTrue( "replaced set", baz.getStringSet().size()==0 );
+		assertTrue( "array element change", baz.getTimeArray()[2]!=null );
+		assertTrue( baz.getCascadingBars().size()==1 );
+		//System.out.println( s.print(baz) );
+		baz.getStringSet().add("two");
+		baz.getStringSet().add("one");
+		baz.getBag().add("three");
+		txn.commit();
+		s.close();
+
+		s = openSession();
+		txn = s.beginTransaction();
+		baz = (Baz) s.createQuery( "select baz from Baz baz order by baz" ).list().get(0);
+		assertTrue( baz.getStringSet().size()==2 );
+		assertTrue( baz.getStringSet().first().equals("one") );
+		assertTrue( baz.getStringSet().last().equals("two") );
+		assertTrue( baz.getBag().size()==5 );
+		baz.getStringSet().remove("two");
+		baz.getBag().remove("duplicate");
+		txn.commit();
+		s.close();
+
+		s = openSession();
+		txn = s.beginTransaction();
+		assertTrue( ( (Long) s.createQuery( "select count(*) from Bar" ).iterate().next() ).longValue()==1 );
+		baz = (Baz) s.load(Baz.class, baz.getCode());
+		assertTrue( baz.getCascadingBars().size()==1 );
+		Bar bar = new Bar();
+		Bar bar2 = new Bar();
+		s.save(bar); s.save(bar2);
+		baz.setTopFoos( new HashSet() );
+		baz.getTopFoos().add(bar);
+		baz.getTopFoos().add(bar2);
+		assertTrue( baz.getCascadingBars().size()==1 );
+		baz.setTopGlarchez( new TreeMap() );
+		GlarchProxy g = new Glarch();
+		s.save(g);
+		baz.getTopGlarchez().put( new Character('G'), g );
+		HashMap map = new HashMap();
+		map.put(bar, g);
+		map.put(bar2, g);
+		baz.setFooToGlarch(map);
+		map = new HashMap();
+		map.put( new FooComponent("name", 123, null, null), bar );
+		map.put( new FooComponent("nameName", 12, null, null), bar );
+		baz.setFooComponentToFoo(map);
+		map = new HashMap();
+		map.put(bar, g);
+		baz.setGlarchToFoo(map);
+		txn.commit();
+		s.close();
+
+		s = openSession();
+		txn = s.beginTransaction();
+		baz = (Baz) s.createQuery( "select baz from Baz baz order by baz" ).list().get(0);
+		assertTrue( baz.getCascadingBars().size()==1 );
+
+		Session s2 = openSession();
+		Transaction txn2 = s2.beginTransaction();
+		assertTrue( ( (Long) s2.createQuery( "select count(*) from Bar" ).iterate().next() ).longValue()==3 );
+		Baz baz2 = (Baz) s2.createQuery( "select baz from Baz baz order by baz" ).list().get(0);
+		Object o = baz2.getFooComponentToFoo().get( new FooComponent("name", 123, null, null) );
+		assertTrue(
+			o==baz2.getFooComponentToFoo().get( new FooComponent("nameName", 12, null, null) ) && o!=null
+		);
+		txn2.commit();
+		s2.close();
+
+		assertTrue( Hibernate.isInitialized( baz.getFooToGlarch() ) );
+		assertTrue( baz.getTopFoos().size()==2 );
+		assertTrue( baz.getTopGlarchez().size()==1 );
+		assertTrue( baz.getTopFoos().iterator().next()!=null );
+		assertTrue( baz.getStringSet().size()==1 );
+		assertTrue( baz.getBag().size()==4 );
+		assertTrue( baz.getFooToGlarch().size()==2 );
+		assertTrue( baz.getFooComponentToFoo().size()==2 );
+		assertTrue( baz.getGlarchToFoo().size()==1 );
+		Iterator iter = baz.getFooToGlarch().keySet().iterator();
+		for (int i=0; i<2; i++ ) assertTrue( iter.next() instanceof BarProxy );
+		FooComponent fooComp = (FooComponent) baz.getFooComponentToFoo().keySet().iterator().next();
+		assertTrue(
+			( (fooComp.getCount()==123 && fooComp.getName().equals("name"))
+			|| (fooComp.getCount()==12 && fooComp.getName().equals("nameName")) )
+			&& ( baz.getFooComponentToFoo().get(fooComp) instanceof BarProxy )
+		);
+		Glarch g2 = new Glarch();
+		s.save(g2);
+		g = (GlarchProxy) baz.getTopGlarchez().get( new Character('G') );
+		baz.getTopGlarchez().put( new Character('H'), g );
+		baz.getTopGlarchez().put( new Character('G'), g2 );
+		txn.commit();
+		s.close();
+
+		s = openSession();
+		txn = s.beginTransaction();
+		baz = (Baz) s.load(Baz.class, baz.getCode());
+		assertTrue( baz.getTopGlarchez().size()==2 );
+		assertTrue( baz.getCascadingBars().size()==1 );
+		txn.commit();
+		s.close();
+
+		s = openSession();
+		txn = s.beginTransaction();
+		assertTrue( ( (Long) s.createQuery( "select count(*) from Bar" ).iterate().next() ).longValue()==3 );
+		baz = (Baz) s.createQuery( "select baz from Baz baz order by baz" ).list().get(0);
+		assertTrue( baz.getTopGlarchez().size()==2 );
+		assertTrue( baz.getCascadingBars().size()==1 );
+		txn.commit();
+
+		s.disconnect();
+
+		s2 = (Session) SerializationHelper.deserialize( SerializationHelper.serialize(s) );
+		s.close();
+
+		s2.reconnect();
+		txn2 = s2.beginTransaction();
+		baz = (Baz) s2.load(Baz.class, baz.getCode());
+		assertTrue( ( (Long) s2.createQuery( "select count(*) from Bar" ).iterate().next() ).longValue()==3 );
+		s2.delete(baz);
+		s2.delete( baz.getTopGlarchez().get( new Character('G') ) );
+		s2.delete( baz.getTopGlarchez().get( new Character('H') ) );
+		int rows = s2.connection().createStatement().executeUpdate("update " + getDialect().openQuote() + "glarchez" + getDialect().closeQuote() + " set baz_map_id=null where baz_map_index='a'");
+		assertTrue(rows==1);
+		assertEquals( 2, doDelete( s2, "from Bar bar" ) );
+		FooProxy[] arr = baz.getFooArray();
+		assertTrue( "new array of objects", arr.length==4 && arr[1].getKey().equals( foo.getKey() ) );
+		for ( int i=1; i<arr.length; i++ ) {
+			if ( arr[i]!=null) s2.delete(arr[i]);
+		}
+
+		s2.load( Qux.class, new Long(666) ); //nonexistent
+
+		assertEquals( 1, doDelete( s2, "from Glarch g" ) );
+		txn2.commit();
+
+		s2.disconnect();
+
+		Session s3 = (Session) SerializationHelper.deserialize( SerializationHelper.serialize(s2) );
+		s2.close();
+		//s3.reconnect();
+		assertTrue( s3.load( Qux.class, new Long(666) )!=null ); //nonexistent
+		//s3.disconnect();
+		s3.close();
+	}
+
+	public void testSaveFlush() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Fee fee = new Fee();
+		s.save( fee, "key" );
+		fee.setFi("blah");
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		fee = (Fee) s.load( Fee.class, fee.getKey() );
+		assertTrue( "blah".equals( fee.getFi() ) );
+		assertTrue( "key".equals( fee.getKey() ) );
+		s.delete(fee);
+		s.getTransaction().commit();
+		s.close();
+
+	}
+
+	public void testCreateUpdate() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Foo foo = new Foo();
+		s.save(foo);
+		foo.setString("dirty");
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		Foo foo2 = new Foo();
+		s.load( foo2, foo.getKey() );
+		// There is an interbase bug that causes null integers to return as 0, also numeric precision is <= 15
+		assertTrue( "create-update", foo.equalsFoo(foo2) );
+		//System.out.println( s.print(foo2) );
+		s.delete(foo2);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		foo = new Foo();
+		s.save(foo, "assignedid");
+		foo.setString("dirty");
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.load(foo2, "assignedid");
+		// There is an interbase bug that causes null integers to return as 0, also numeric precision is <= 15
+		assertTrue( "create-update", foo.equalsFoo(foo2) );
+		//System.out.println( s.print(foo2) );
+		s.delete(foo2);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testUpdateCollections() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Holder baz = new Holder();
+		baz.setName("123");
+		Foo f1 = new Foo();
+		Foo f2 = new Foo();
+		Foo f3 = new Foo();
+		One o = new One();
+		baz.setOnes( new ArrayList() );
+		baz.getOnes().add(o);
+		Foo[] foos = new Foo[] { f1, null, f2 };
+		baz.setFooArray(foos);
+		baz.setFoos( new HashSet() );
+		baz.getFoos().add(f1);
+		s.save(f1);
+		s.save(f2);
+		s.save(f3);
+		s.save(o);
+		s.save(baz);
+		s.getTransaction().commit();
+		s.close();
+
+		baz.getOnes().set(0, null);
+		baz.getOnes().add(o);
+		baz.getFoos().add(f2);
+		foos[0] = f3;
+		foos[1] = f1;
+
+		s = openSession();
+		s.beginTransaction();
+		s.saveOrUpdate(baz);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		Holder h = (Holder) s.load(Holder.class, baz.getId());
+		assertTrue( h.getOnes().get(0)==null );
+		assertTrue( h.getOnes().get(1)!=null );
+		assertTrue( h.getFooArray()[0]!=null);
+		assertTrue( h.getFooArray()[1]!=null);
+		assertTrue( h.getFooArray()[2]!=null);
+		assertTrue( h.getFoos().size()==2 );
+		s.getTransaction().commit();
+		s.close();
+
+		baz.getFoos().remove(f1);
+		baz.getFoos().remove(f2);
+		baz.getFooArray()[0]=null;
+		baz.getFooArray()[0]=null;
+		baz.getFooArray()[0]=null;
+
+		s = openSession();
+		s.beginTransaction();
+		s.saveOrUpdate(baz);
+		doDelete( s, "from Foo" );
+		baz.getOnes().remove(o);
+		doDelete( s, "from One" );
+		s.delete(baz);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testCreate() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Foo foo = new Foo();
+		s.save(foo);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		Foo foo2 = new Foo();
+		s.load( foo2, foo.getKey() );
+		// There is an interbase bug that causes null integers to return as 0, also numeric precision is <= 15
+		assertTrue( "create", foo.equalsFoo(foo2) );
+		s.delete(foo2);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testCallback() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Qux q = new Qux("0");
+		s.save(q);
+		q.setChild( new Qux("1") );
+		s.save( q.getChild() );
+		Qux q2 = new Qux("2");
+		q2.setChild( q.getChild() );
+		Qux q3 = new Qux("3");
+		q.getChild().setChild(q3);
+		s.save(q3);
+		Qux q4 = new Qux("4");
+		q4.setChild(q3);
+		s.save(q4);
+		s.save(q2);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		List l = s.createQuery( "from Qux" ).list();
+		assertTrue( "", l.size()==5);
+		s.delete( l.get(0) );
+		s.delete( l.get(1) );
+		s.delete( l.get(2) );
+		s.delete( l.get(3) );
+		s.delete( l.get(4) );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testPolymorphism() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Bar bar = new Bar();
+		s.save(bar);
+		bar.setBarString("bar bar");
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		FooProxy foo = (FooProxy) s.load( Foo.class, bar.getKey() );
+		assertTrue( "polymorphic", foo instanceof BarProxy );
+		assertTrue( "subclass property", ( (BarProxy) foo ).getBarString().equals( bar.getBarString() ) );
+		//System.out.println( s.print(foo) );
+		s.delete(foo);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testRemoveContains() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Baz baz = new Baz();
+		baz.setDefaults();
+		s.save(baz);
+		s.flush();
+		assertTrue( s.contains(baz) );
+		s.evict(baz);
+		assertFalse( s.contains(baz) );
+		Baz baz2 = (Baz) s.load( Baz.class, baz.getCode() );
+		assertFalse(baz==baz2);
+		s.delete(baz2);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testCollectionOfSelf() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Bar bar = new Bar();
+		s.save(bar);
+		bar.setAbstracts( new HashSet() );
+		bar.getAbstracts().add(bar);
+		Bar bar2 = new Bar();
+		bar.getAbstracts().add(bar2);
+		bar.setFoo(bar);
+		s.save(bar2);
+		s.getTransaction().commit();
+		s.close();
+
+		bar.setAbstracts(null);
+
+		s = openSession();
+		s.beginTransaction();
+		s.load( bar, bar.getKey() );
+		assertTrue( "collection contains self", bar.getAbstracts().size()==2 && bar.getAbstracts().contains(bar) );
+		assertTrue( "association to self", bar.getFoo()==bar );
+		Iterator iter = bar.getAbstracts().iterator();
+		while ( iter.hasNext() ) {
+			s.delete( iter.next() );
+		}
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testFind() throws Exception {
+		Session s = openSession();
+		Transaction txn = s.beginTransaction();
+
+		Bar bar = new Bar();
+		s.save(bar);
+		bar.setBarString("bar bar");
+		bar.setString("xxx");
+		Foo foo = new Foo();
+		s.save(foo);
+		foo.setString("foo bar");
+		s.save( new Foo() );
+		s.save( new Bar() );
+		List list1 = s.createQuery( "select foo from Foo foo where foo.string='foo bar'" ).list();
+		assertTrue( "find size", list1.size()==1 );
+		assertTrue( "find ==", list1.get(0)==foo );
+		List list2 = s.createQuery( "from Foo foo order by foo.string, foo.date" ).list();
+		assertTrue( "find size", list2.size()==4 );
+
+		list1 = s.createQuery( "from Foo foo where foo.class='B'" ).list();
+		assertTrue( "class special property", list1.size()==2);
+		list1 = s.createQuery( "from Foo foo where foo.class=Bar" ).list();
+		assertTrue( "class special property", list1.size()==2);
+		list1 = s.createQuery( "from Foo foo where foo.class=Bar" ).list();
+		list2 = s.createQuery( "select bar from Bar bar, Foo foo where bar.string = foo.string and not bar=foo" ).list();
+		assertTrue( "class special property", list1.size()==2);
+		assertTrue( "select from a subclass", list2.size()==1);
+		Trivial t = new Trivial();
+		s.save(t);
+		txn.commit();
+		s.close();
+
+		s = openSession();
+		txn = s.beginTransaction();
+		list1 = s.createQuery( "from Foo foo where foo.string='foo bar'" ).list();
+		assertTrue( "find size", list1.size()==1 );
+		// There is an interbase bug that causes null integers to return as 0, also numeric precision is <= 15
+		assertTrue( "find equals", ( (Foo) list1.get(0) ).equalsFoo(foo) );
+		list2 = s.createQuery( "select foo from Foo foo" ).list();
+		assertTrue( "find size", list2.size()==5 );
+		List list3 = s.createQuery( "from Bar bar where bar.barString='bar bar'" ).list();
+		assertTrue( "find size", list3.size()==1 );
+		assertTrue( "find same instance", list2.contains( list1.get(0) ) && list2.contains( list2.get(0) ) );
+		assertTrue( s.createQuery( "from Trivial" ).list().size()==1 );
+		doDelete( s, "from Trivial" );
+
+		list2 = s.createQuery( "from Foo foo where foo.date = ?" )
+				.setParameter( 0, new java.sql.Date(123), Hibernate.DATE )
+				.list();
+		assertTrue ( "find by date", list2.size()==4 );
+		Iterator iter = list2.iterator();
+		while ( iter.hasNext() ) {
+			s.delete( iter.next() );
+		}
+		list2 = s.createQuery( "from Foo foo" ).list();
+		assertTrue( "find deleted", list2.size()==0);
+		txn.commit();
+		s.close();
+	}
+
+	public void testDeleteRecursive() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Foo x = new Foo();
+		Foo y = new Foo();
+		x.setFoo(y);
+		y.setFoo(x);
+		s.save(x);
+		s.save(y);
+		s.flush();
+		s.delete(y);
+		s.delete(x);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testReachability() throws Exception {
+		//first for unkeyed collections
+		Session s = openSession();
+		s.beginTransaction();
+		Baz baz1 = new Baz();
+		s.save(baz1);
+		Baz baz2 = new Baz();
+		s.save(baz2);
+		baz1.setIntArray( new int[] {1 ,2, 3, 4} );
+		baz1.setFooSet( new HashSet() );
+		Foo foo = new Foo();
+		s.save(foo);
+		baz1.getFooSet().add(foo);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		baz2 = (Baz) s.load( Baz.class, baz2.getCode() );
+		baz1 = (Baz) s.load( Baz.class, baz1.getCode() );
+		baz2.setFooSet( baz1.getFooSet() ); baz1.setFooSet(null);
+		baz2.setIntArray( baz1.getIntArray() ); baz1.setIntArray(null);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		baz2 = (Baz) s.load( Baz.class, baz2.getCode() );
+		baz1 = (Baz) s.load( Baz.class, baz1.getCode() );
+		assertTrue( "unkeyed reachability", baz2.getIntArray().length==4 );
+		assertTrue( "unkeyed reachability", baz2.getFooSet().size()==1 );
+		assertTrue( "unkeyed reachability", baz1.getIntArray().length==0 );
+		assertTrue( "unkeyed reachability", baz1.getFooSet().size()==0 );
+		//System.out.println( s.print(baz1) + s.print(baz2) );
+		FooProxy fp = (FooProxy) baz2.getFooSet().iterator().next();
+		s.delete(fp);
+		s.delete(baz1);
+		s.delete(baz2);
+		s.getTransaction().commit();
+		s.close();
+
+		//now for collections of collections
+		s = openSession();
+		s.beginTransaction();
+		baz1 = new Baz();
+		s.save(baz1);
+		baz2 = new Baz();
+		s.save(baz2);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		baz2 = (Baz) s.load( Baz.class, baz2.getCode() );
+		baz1 = (Baz) s.load( Baz.class, baz1.getCode() );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		baz2 = (Baz) s.load( Baz.class, baz2.getCode() );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		baz2 = (Baz) s.load( Baz.class, baz2.getCode() );
+		baz1 = (Baz) s.load( Baz.class, baz1.getCode() );
+		s.delete(baz1);
+		s.delete(baz2);
+		s.getTransaction().commit();
+		s.close();
+
+		//now for keyed collections
+		s = openSession();
+		s.beginTransaction();
+		baz1 = new Baz();
+		s.save(baz1);
+		baz2 = new Baz();
+		s.save(baz2);
+		Foo foo1 = new Foo();
+		Foo foo2 = new Foo();
+		s.save(foo1); s.save(foo2);
+		baz1.setFooArray( new Foo[] { foo1, null, foo2 } );
+		baz1.setStringDateMap( new TreeMap() );
+		baz1.getStringDateMap().put("today", new Date( System.currentTimeMillis() ) );
+		baz1.getStringDateMap().put("tomorrow", new Date( System.currentTimeMillis() + 86400000 ) );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		baz2 = (Baz) s.load( Baz.class, baz2.getCode() );
+		baz1 = (Baz) s.load( Baz.class, baz1.getCode() );
+		baz2.setFooArray( baz1.getFooArray() ); baz1.setFooArray(null);
+		baz2.setStringDateMap( baz1.getStringDateMap() ); baz1.setStringDateMap(null);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		baz2 = (Baz) s.load( Baz.class, baz2.getCode() );
+		baz1 = (Baz) s.load( Baz.class, baz1.getCode() );
+		assertTrue( "reachability", baz2.getStringDateMap().size()==2 );
+		assertTrue( "reachability", baz2.getFooArray().length==3 );
+		assertTrue( "reachability", baz1.getStringDateMap().size()==0 );
+		assertTrue( "reachability", baz1.getFooArray().length==0 );
+		assertTrue( "null element", baz2.getFooArray()[1]==null );
+		assertTrue( "non-null element", baz2.getStringDateMap().get("today")!=null );
+		assertTrue( "non-null element", baz2.getStringDateMap().get("tomorrow")!=null );
+		assertTrue( "null element", baz2.getStringDateMap().get("foo")==null );
+		s.delete( baz2.getFooArray()[0] );
+		s.delete( baz2.getFooArray()[2] );
+		s.delete(baz1);
+		s.delete(baz2);
+		s.flush();
+		assertTrue( s.createQuery( "from java.lang.Object" ).list().size()==0 );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testPersistentLifecycle() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Qux q = new Qux();
+		s.save(q);
+		q.setStuff("foo bar baz qux");
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		q = (Qux) s.load( Qux.class, q.getKey() );
+		assertTrue( "lifecycle create", q.getCreated() );
+		assertTrue( "lifecycle load", q.getLoaded() );
+		assertTrue( "lifecycle subobject", q.getFoo()!=null );
+		s.delete(q);
+		assertTrue( "lifecycle delete", q.getDeleted() );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		assertTrue( "subdeletion", s.createQuery( "from Foo foo" ).list().size()==0);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testIterators() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		for ( int i=0; i<10; i++ ) {
+			Qux q = new Qux();
+			Object qid = s.save(q);
+			assertTrue("not null", qid!=null);
+		}
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		Iterator iter = s.createQuery( "from Qux q where q.stuff is null" ).iterate();
+		int count=0;
+		while ( iter.hasNext() ) {
+			Qux q = (Qux) iter.next();
+			q.setStuff("foo");
+			if (count==0 || count==5) iter.remove();
+			count++;
+		}
+		assertTrue("iterate", count==10);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		assertEquals( 8, doDelete( s, "from Qux q where q.stuff=?", "foo", Hibernate.STRING ) );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		iter = s.createQuery( "from Qux q" ).iterate();
+		assertTrue( "empty iterator", !iter.hasNext() );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testVersioning() throws Exception {
+		Session s = openSession();
+		Transaction txn = s.beginTransaction();
+		GlarchProxy g = new Glarch();
+		s.save(g);
+		GlarchProxy g2 = new Glarch();
+		s.save(g2);
+		Serializable gid = s.getIdentifier(g);
+		Serializable g2id = s.getIdentifier(g2);
+		g.setName("glarch");
+		txn.commit();
+		s.close();
+
+		getSessions().evict(Glarch.class);
+
+		s = openSession();
+		txn = s.beginTransaction();
+		g = (GlarchProxy) s.load( Glarch.class, gid );
+		s.lock(g, LockMode.UPGRADE);
+		g2 = (GlarchProxy) s.load( Glarch.class, g2id );
+		assertTrue( "version", g.getVersion()==1 );
+		assertTrue( "version", g.getDerivedVersion()==1 );
+		assertTrue( "version", g2.getVersion()==0 );
+		g.setName("foo");
+		assertTrue(
+			"find by version",
+				s.createQuery( "from Glarch g where g.version=2" ).list().size()==1
+		);
+		g.setName("bar");
+		txn.commit();
+		s.close();
+
+		getSessions().evict(Glarch.class);
+
+		s = openSession();
+		txn = s.beginTransaction();
+		g = (GlarchProxy) s.load( Glarch.class, gid );
+		g2 = (GlarchProxy) s.load( Glarch.class, g2id );
+		assertTrue( "version", g.getVersion()==3 );
+		assertTrue( "version", g.getDerivedVersion()==3 );
+		assertTrue( "version", g2.getVersion()==0 );
+		g.setNext(null);
+		g2.setNext(g);
+		s.delete(g2);
+		s.delete(g);
+		txn.commit();
+		s.close();
+	}
+
+	public void testVersionedCollections() throws Exception {
+		Session s = openSession();
+		GlarchProxy g = new Glarch();
+		s.save(g);
+		g.setProxyArray( new GlarchProxy[] { g } );
+		String gid = (String) s.getIdentifier(g);
+		ArrayList list = new ArrayList();
+		list.add("foo");
+		g.setStrings(list);
+		HashSet set = new HashSet();
+		set.add(g);
+		g.setProxySet(set);
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		s = openSession();
+		g = (GlarchProxy) s.load(Glarch.class, gid);
+		assertTrue( g.getStrings().size()==1 );
+		assertTrue( g.getProxyArray().length==1 );
+		assertTrue( g.getProxySet().size()==1 );
+		assertTrue( "versioned collection before", g.getVersion()==1 );
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		s = openSession();
+		g = (GlarchProxy) s.load(Glarch.class, gid);
+		assertTrue( g.getStrings().get(0).equals("foo") );
+		assertTrue( g.getProxyArray()[0]==g );
+		assertTrue( g.getProxySet().iterator().next()==g );
+		assertTrue( "versioned collection before", g.getVersion()==1 );
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		s = openSession();
+		g = (GlarchProxy) s.load(Glarch.class, gid);
+		assertTrue( "versioned collection before", g.getVersion()==1 );
+		g.getStrings().add("bar");
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		s = openSession();
+		g = (GlarchProxy) s.load(Glarch.class, gid);
+		assertTrue( "versioned collection after", g.getVersion()==2 );
+		assertTrue( "versioned collection after", g.getStrings().size()==2 );
+		g.setProxyArray(null);
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		s = openSession();
+		g = (GlarchProxy) s.load(Glarch.class, gid);
+		assertTrue( "versioned collection after", g.getVersion()==3 );
+		assertTrue( "versioned collection after", g.getProxyArray().length==0 );
+		g.setFooComponents( new ArrayList() );
+		g.setProxyArray(null);
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		s = openSession();
+		g = (GlarchProxy) s.load(Glarch.class, gid);
+		assertTrue( "versioned collection after", g.getVersion()==4 );
+		s.delete(g);
+		s.flush();
+		assertTrue( s.createQuery( "from java.lang.Object" ).list().size()==0 );
+		s.connection().commit();
+		s.close();
+	}
+
+	/*public void testVersionedSubcollections() throws Exception {
+		Session s = sessionsopenSession();
+
+		assertTrue( !s.iterate("from Fee fee").hasNext() );
+
+		GlarchProxy g = new Glarch();
+		s.save(g);
+		String gid = (String) s.getIdentifier(g);
+		HashMap map = new HashMap();
+		HashSet subSet  = new HashSet();
+		map.put("xxx", subSet);
+		subSet.add("foo"); subSet.add("bar");
+		g.setStringSets(map);
+		s.flush();
+		s.connection().commit();
+		s.close();
+		s = sessionsopenSession();
+		g = (GlarchProxy) s.load(Glarch.class, gid);
+		assertTrue( g.getVersion()==1, "versioned collection before" );
+		//System.out.println( g.getStringSets().get("xxx") );
+		assertTrue( ( (Set) g.getStringSets().get("xxx") ).size()==2, "versioned collection before" );
+		( (Set) g.getStringSets().get("xxx") ).add("baz");
+		s.flush();
+		s.connection().commit();
+		s.close();
+		s = sessionsopenSession();
+		g = (GlarchProxy) s.load(Glarch.class, gid);
+		assertTrue( g.getVersion()==2, "versioned collection after" );
+		//System.out.println( g.getStringSets().get("xxx") );
+		assertTrue( ( (Set) g.getStringSets().get("xxx") ).size()==3, "versioned collection after" );
+		s.delete(g);
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		//with components! (note: this also tests some stuff testPersistCollections misses)
+		s = sessionsopenSession();
+		g = new Glarch(); //(GlarchProxy) s.create(Glarch.class);
+		List list = new ArrayList();
+		Date[] dates = new Date[] { null, null, new Date(), new Date(0) };
+		list.add(null);
+		list.add( new FooComponent("foo", 69, dates, new FooComponent("bar", 96, null, null, new Fee() ) ) );
+		g.setFooComponents(list);
+		String EIGHT_CHARS = "abcdefgh";
+		s.save(g, EIGHT_CHARS + EIGHT_CHARS + EIGHT_CHARS + EIGHT_CHARS);
+		gid = (String) s.getIdentifier(g);
+		assertTrue( s.iterate("from Fee fee").hasNext() );
+		g.getFooComponents().add( new FooComponent("bar", 96, null, null) );
+		s.flush();
+		s.connection().commit();
+		s.close();
+		s = sessionsopenSession();
+		g = (GlarchProxy) s.load(Glarch.class, gid);
+		assertTrue( g.getVersion()==2, "versioned collection before" );
+		( (FooComponent) g.getFooComponents().get(1) ).getImportantDates()[0] = new Date(123567890);
+		s.flush();
+		s.connection().commit();
+		s.close();
+		s = sessionsopenSession();
+		g = (GlarchProxy) s.load(Glarch.class, gid);
+		assertTrue( g.getVersion()==3, "versioned collection after" );
+		( (FooComponent) g.getFooComponents().get(1) ).getSubcomponent().setName("new name");
+		assertTrue( ( (FooComponent) g.getFooComponents().get(1) ).getImportantDates()[0]!=null, "versioned collection after" );
+		s.flush();
+		s.connection().commit();
+		s.close();
+		s = sessionsopenSession();
+		g = (GlarchProxy) s.load(Glarch.class, gid);
+		assertTrue( ( (FooComponent) g.getFooComponents().get(1) ).getSubcomponent().getName().equals("new name"), "versioned collection after" );
+		assertTrue( g.getVersion()==4, "versioned collection after" );
+		s.delete(g);
+		assertTrue( !s.iterate("from Fee fee").hasNext() );
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+
+	}*/
+
+	public void testRecursiveLoad() throws Exception {
+		//Non polymorphic class (there is an implementation optimization
+		//being tested here)
+		Session s = openSession();
+		Transaction txn = s.beginTransaction();
+		GlarchProxy last = new Glarch();
+		s.save(last);
+		last.setOrder( (short) 0 );
+		for (int i=0; i<5; i++) {
+			GlarchProxy next = new Glarch();
+			s.save(next);
+			last.setNext(next);
+			last = next;
+			last.setOrder( (short) (i+1) );
+		}
+		Iterator iter = s.createQuery( "from Glarch g" ).iterate();
+		while ( iter.hasNext() ) {
+			iter.next();
+		}
+		List list = s.createQuery( "from Glarch g" ).list();
+		assertTrue( "recursive find", list.size()==6 );
+		txn.commit();
+		s.close();
+
+		s = openSession();
+		txn = s.beginTransaction();
+		list = s.createQuery( "from Glarch g" ).list();
+		assertTrue( "recursive iter", list.size()==6 );
+		list = s.createQuery( "from Glarch g where g.next is not null" ).list();
+		assertTrue( "recursive iter", list.size()==5 );
+		txn.commit();
+		s.close();
+
+		s = openSession();
+		txn = s.beginTransaction();
+		iter = s.createQuery( "from Glarch g order by g.order asc" ).iterate();
+		while ( iter.hasNext() ) {
+			GlarchProxy g = (GlarchProxy) iter.next();
+			assertTrue( "not null", g!=null );
+			iter.remove();
+		}
+		txn.commit();
+		s.close();
+
+		//Same thing but using polymorphic class (no optimisation possible):
+		s = openSession();
+		txn = s.beginTransaction();
+		FooProxy flast = new Bar();
+		s.save(flast);
+		flast.setString( "foo0" );
+		for (int i=0; i<5; i++) {
+			FooProxy foo = new Bar();
+			s.save(foo);
+			flast.setFoo(foo);
+			flast = flast.getFoo();
+			flast.setString( "foo" + (i+1) );
+		}
+		iter = s.createQuery( "from Foo foo" ).iterate();
+		while ( iter.hasNext() ) {
+			iter.next();
+		}
+		list = s.createQuery( "from Foo foo" ).list();
+		assertTrue( "recursive find", list.size()==6 );
+		txn.commit();
+		s.close();
+
+		s = openSession();
+		txn = s.beginTransaction();
+		list = s.createQuery( "from Foo foo" ).list();
+		assertTrue( "recursive iter", list.size()==6 );
+		iter = list.iterator();
+		while ( iter.hasNext() ) {
+			assertTrue( "polymorphic recursive load", iter.next() instanceof BarProxy );
+		}
+		txn.commit();
+		s.close();
+
+		s = openSession();
+		txn = s.beginTransaction();
+		iter = s.createQuery( "from Foo foo order by foo.string asc" ).iterate();
+		while ( iter.hasNext() ) {
+			BarProxy bar = (BarProxy) iter.next();
+			assertTrue( "not null", bar!=null );
+			iter.remove();
+		}
+		txn.commit();
+		s.close();
+	}
+
+	public void testScrollableIterator() throws Exception {
+		// skip if not one of these named dialects
+		boolean match = getDialect() instanceof DB2Dialect
+				|| getDialect() instanceof SybaseDialect
+				|| getDialect() instanceof HSQLDialect
+				|| getDialect() instanceof Oracle8iDialect // 9i/10g too because of inheritence...
+				;
+		if ( ! match ) {
+			return;
+		}
+
+		Session s = openSession();
+		Transaction txn = s.beginTransaction();
+		s.save( new Foo() );
+		s.save( new Foo() );
+		s.save( new Foo() );
+		s.save( new Bar() );
+		Query query = s.createQuery("select f, f.integer from Foo f");
+		assertTrue( query.getReturnTypes().length==2 );
+		ScrollableResults iter = query.scroll();
+		assertTrue( iter.next() );
+		assertTrue( iter.scroll(1) );
+		FooProxy f2 = (FooProxy) iter.get()[0];
+		assertTrue( f2!=null );
+		assertTrue( iter.scroll(-1) );
+		Object f1 = iter.get(0);
+		iter.next();
+		assertTrue( f1!=null && iter.get(0)==f2 );
+		iter.getInteger(1);
+
+		assertTrue( !iter.scroll(100) );
+		assertTrue( iter.first() );
+		assertTrue( iter.scroll(3) );
+		Object f4 = iter.get(0);
+		assertTrue( f4!=null );
+		assertTrue( !iter.next() );
+		assertTrue( iter.first() );
+		assertTrue( iter.get(0)==f1 );
+		assertTrue( iter.last() );
+		assertTrue( iter.get(0)==f4 );
+		assertTrue( iter.previous() );
+		txn.commit();
+		s.close();
+
+		s = openSession();
+		txn = s.beginTransaction();
+		query = s.createQuery("select f, f.integer from Foo f");
+		assertTrue( query.getReturnTypes().length==2 );
+		iter = query.scroll();
+		assertTrue( iter.next() );
+		assertTrue( iter.scroll(1) );
+		f2 = (FooProxy) iter.get()[0];
+		assertTrue( f2!=null );
+		assertTrue( f2.getString()!=null  && f2.getComponent().getImportantDates().length > 0 );
+		assertTrue( iter.scroll(-1) );
+		f1 = iter.get(0);
+		iter.next();
+		assertTrue( f1!=null && iter.get(0)==f2 );
+		iter.getInteger(1);
+
+		assertTrue( !iter.scroll(100) );
+		assertTrue( iter.first() );
+		assertTrue( iter.scroll(3) );
+		f4 = iter.get(0);
+		assertTrue( f4!=null );
+		assertTrue( !iter.next() );
+		assertTrue( iter.first() );
+		assertTrue( iter.get(0)==f1 );
+		assertTrue( iter.last() );
+		assertTrue( iter.get(0)==f4 );
+		assertTrue( iter.previous() );
+		assertTrue( s.delete("from Foo")==4 );
+		s.flush();
+		assertTrue( s.createQuery( "from java.lang.Object" ).list().size()==0 );
+		txn.commit();
+		s.close();
+	}
+
+	public void testMultiColumnQueries() throws Exception {
+		Session s = openSession();
+		Transaction txn = s.beginTransaction();
+		Foo foo = new Foo();
+		s.save(foo);
+		Foo foo1 = new Foo();
+		s.save(foo1);
+		foo.setFoo(foo1);
+		List l = s.createQuery( "select parent, child from Foo parent, Foo child where parent.foo = child" ).list();
+		assertTrue( "multi-column find", l.size()==1 );
+
+		Iterator rs = s.createQuery(
+				"select count(distinct child.id), count(distinct parent.id) from Foo parent, Foo child where parent.foo = child"
+		).iterate();
+		Object[] row = (Object[]) rs.next();
+		assertTrue( "multi-column count", ( (Long) row[0] ).intValue()==1 );
+		assertTrue( "multi-column count", ( (Long) row[1] ).intValue()==1 );
+		assertTrue( !rs.hasNext() );
+
+		rs = s.createQuery( "select child.id, parent.id, child.long from Foo parent, Foo child where parent.foo = child" )
+				.iterate();
+		row = (Object[]) rs.next();
+		assertTrue( "multi-column id", row[0].equals( foo.getFoo().getKey() ) );
+		assertTrue( "multi-column id", row[1].equals( foo.getKey() ) );
+		assertTrue( "multi-column property", row[2].equals( foo.getFoo().getLong() ) );
+		assertTrue( !rs.hasNext() );
+
+		rs = s.createQuery(
+				"select child.id, parent.id, child.long, child, parent.foo from Foo parent, Foo child where parent.foo = child"
+		).iterate();
+		row = (Object[]) rs.next();
+		assertTrue(
+			foo.getFoo().getKey().equals( row[0] ) &&
+			foo.getKey().equals( row[1] ) &&
+			foo.getFoo().getLong().equals( row[2] ) &&
+			row[3] == foo.getFoo() &&
+			row[3]==row[4]
+		);
+		assertTrue( !rs.hasNext() );
+
+		row = (Object[]) l.get(0);
+		assertTrue( "multi-column find", row[0]==foo && row[1]==foo.getFoo() );
+		txn.commit();
+		s.close();
+		
+		s = openSession();
+		txn = s.beginTransaction();
+		Iterator iter = s.createQuery(
+				"select parent, child from Foo parent, Foo child where parent.foo = child and parent.string='a string'"
+		).iterate();
+		int deletions=0;
+		while ( iter.hasNext() ) {
+			Object[] pnc = (Object[]) iter.next();
+			s.delete( pnc[0] );
+			s.delete( pnc[1] );
+			deletions++;
+		}
+		assertTrue("multi-column iterate", deletions==1);
+		txn.commit();
+		s.close();
+	}
+
+	public void testDeleteTransient() throws Exception {
+		Fee fee = new Fee();
+		Fee fee2 = new Fee();
+		fee2.setAnotherFee(fee);
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		s.save(fee);
+		s.save(fee2);
+		s.flush();
+		fee.setCount(123);
+		tx.commit();
+		s.close();
+		s = openSession();
+		tx = s.beginTransaction();
+		s.delete(fee);
+		s.delete(fee2);
+		//foo.setAnotherFee(null);
+		tx.commit();
+		s.close();
+		s = openSession();
+		tx = s.beginTransaction();
+		assertTrue( s.createQuery( "from Fee fee" ).list().size()==0 );
+		tx.commit();
+		s.close();
+	}
+
+	public void testDeleteUpdatedTransient() throws Exception {
+		Fee fee = new Fee();
+		Fee fee2 = new Fee();
+		fee2.setAnotherFee(fee);
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		s.save(fee);
+		s.save(fee2);
+		s.flush();
+		fee.setCount(123);
+		tx.commit();
+		s.close();
+		s = openSession();
+		tx = s.beginTransaction();
+		s.update(fee);
+		//fee2.setAnotherFee(null);
+		s.update(fee2);
+		s.delete(fee);
+		s.delete(fee2);
+		tx.commit();
+		s.close();
+		s = openSession();
+		tx = s.beginTransaction();
+		assertTrue( s.createQuery( "from Fee fee" ).list().size()==0 );
+		tx.commit();
+		s.close();
+	}
+
+	public void testUpdateOrder() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Fee fee1 = new Fee();
+		s.save(fee1);
+		Fee fee2 = new Fee();
+		fee1.setFee(fee2);
+		fee2.setFee(fee1);
+		fee2.setFees( new HashSet() );
+		Fee fee3 = new Fee();
+		fee3.setFee(fee1);
+		fee3.setAnotherFee(fee2);
+		fee2.setAnotherFee(fee3);
+		s.save(fee3);
+		s.save(fee2);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		fee1.setCount(10);
+		fee2.setCount(20);
+		fee3.setCount(30);
+		s.update(fee1);
+		s.update(fee2);
+		s.update(fee3);
+		s.flush();
+		s.delete(fee1);
+		s.delete(fee2);
+		s.delete(fee3);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		assertTrue( s.createQuery( "from Fee fee" ).list().size()==0 );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testUpdateFromTransient() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Fee fee1 = new Fee();
+		s.save(fee1);
+		Fee fee2 = new Fee();
+		fee1.setFee(fee2);
+		fee2.setFee(fee1);
+		fee2.setFees( new HashSet() );
+		Fee fee3 = new Fee();
+		fee3.setFee(fee1);
+		fee3.setAnotherFee(fee2);
+		fee2.setAnotherFee(fee3);
+		s.save(fee3);
+		s.save(fee2);
+		s.getTransaction().commit();
+		s.close();
+
+		fee1.setFi("changed");
+
+		s = openSession();
+		s.beginTransaction();
+		s.saveOrUpdate(fee1);
+		s.getTransaction().commit();
+		s.close();
+
+		Qux q = new Qux("quxxy");
+		q.setTheKey(0);
+		fee1.setQux(q);
+
+		s = openSession();
+		s.beginTransaction();
+		s.saveOrUpdate(fee1);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		fee1 = (Fee) s.load( Fee.class, fee1.getKey() );
+		assertTrue( "updated from transient", fee1.getFi().equals("changed") );
+		assertTrue( "unsaved value", fee1.getQux()!=null );
+		s.delete( fee1.getQux() );
+		fee1.setQux(null);
+		s.getTransaction().commit();
+		s.close();
+
+		fee2.setFi("CHANGED");
+		fee2.getFees().add("an element");
+		fee1.setFi("changed again");
+
+		s = openSession();
+		s.beginTransaction();
+		s.saveOrUpdate(fee2);
+		s.update( fee1, fee1.getKey() );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		Fee fee = new Fee();
+		s.load( fee, fee2.getKey() );
+		fee1 = (Fee) s.load( Fee.class, fee1.getKey() );
+		assertTrue( "updated from transient", fee1.getFi().equals("changed again") );
+		assertTrue( "updated from transient", fee.getFi().equals("CHANGED") );
+		assertTrue( "updated collection", fee.getFees().contains("an element") );
+		s.getTransaction().commit();
+		s.close();
+
+		fee.getFees().clear();
+		fee.getFees().add("new element");
+		fee1.setFee(null);
+
+		s = openSession();
+		s.beginTransaction();
+		s.saveOrUpdate(fee);
+		s.saveOrUpdate(fee1);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.load( fee, fee.getKey() );
+		assertTrue( "update", fee.getAnotherFee()!=null );
+		assertTrue( "update", fee.getFee()!=null );
+		assertTrue( "update", fee.getAnotherFee().getFee()==fee.getFee() );
+		assertTrue( "updated collection", fee.getFees().contains("new element") );
+		assertTrue( "updated collection", !fee.getFees().contains("an element") );
+		s.getTransaction().commit();
+		s.close();
+
+		fee.setQux( new Qux("quxy") );
+
+		s = openSession();
+		s.beginTransaction();
+		s.saveOrUpdate(fee);
+		s.getTransaction().commit();
+		s.close();
+
+		fee.getQux().setStuff("xxx");
+
+		s = openSession();
+		s.beginTransaction();
+		s.saveOrUpdate(fee);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.load( fee, fee.getKey() );
+		assertTrue( "cascade update", fee.getQux()!=null );
+		assertTrue( "cascade update", fee.getQux().getStuff().equals("xxx") );
+		assertTrue( "update", fee.getAnotherFee()!=null );
+		assertTrue( "update", fee.getFee()!=null );
+		assertTrue( "update", fee.getAnotherFee().getFee()==fee.getFee() );
+		fee.getAnotherFee().setAnotherFee(null);
+		s.delete(fee);
+		doDelete( s, "from Fee fee" );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		assertTrue( s.createQuery( "from Fee fee" ).list().size()==0 );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testArraysOfTimes() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Baz baz = new Baz() ;
+		s.save(baz);
+		baz.setDefaults();
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		baz.getTimeArray()[2] = new Date(123);
+		baz.getTimeArray()[3] = new java.sql.Time(1234);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		baz = (Baz) s.load( Baz.class, baz.getCode() );
+		s.delete(baz);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testComponents() throws Exception {
+		Session s = openSession();
+		Transaction txn = s.beginTransaction();
+		Foo foo = new Foo();
+		foo.setComponent( new FooComponent("foo", 69, null, new FooComponent("bar", 96, null, null) ) );
+		s.save(foo);
+		foo.getComponent().setName("IFA");
+		txn.commit();
+		s.close();
+
+		foo.setComponent(null);
+
+		s = openSession();
+		txn = s.beginTransaction();
+		s.load( foo, foo.getKey() );
+		assertTrue(
+			"save components",
+			foo.getComponent().getName().equals("IFA") &&
+			foo.getComponent().getSubcomponent().getName().equals("bar")
+		);
+		assertTrue( "cascade save via component", foo.getComponent().getGlarch()!=null);
+		foo.getComponent().getSubcomponent().setName("baz");
+		txn.commit();
+		s.close();
+
+		foo.setComponent(null);
+
+		s = openSession();
+		txn = s.beginTransaction();
+		s.load( foo, foo.getKey() );
+		assertTrue(
+			"update components",
+			foo.getComponent().getName().equals("IFA") &&
+			foo.getComponent().getSubcomponent().getName().equals("baz")
+		);
+		s.delete(foo);
+		txn.commit();
+		s.close();
+
+		s = openSession();
+		txn = s.beginTransaction();
+		foo = new Foo();
+		s.save(foo);
+		foo.setCustom( new String[] { "one", "two" } );
+		assertTrue( s.createQuery( "from Foo foo where foo.custom.s1 = 'one'" ).list().get(0)==foo );
+		s.delete(foo);
+		txn.commit();
+		s.close();
+
+	}
+
+	public void testNoForeignKeyViolations() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Glarch g1 = new Glarch();
+		Glarch g2 = new Glarch();
+		g1.setNext(g2);
+		g2.setNext(g1);
+		s.save(g1);
+		s.save(g2);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		List l = s.createQuery( "from Glarch g where g.next is not null" ).list();
+		s.delete( l.get(0) );
+		s.delete( l.get(1) );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testLazyCollections() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Qux q = new Qux();
+		s.save(q);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		q = (Qux) s.load( Qux.class, q.getKey() );
+		s.getTransaction().commit();
+		s.close();
+
+		System.out.println("Two exceptions are supposed to occur:");
+		boolean ok = false;
+		try {
+			q.getMoreFums().isEmpty();
+		}
+		catch (LazyInitializationException e) {
+			ok = true;
+		}
+		assertTrue( "lazy collection with one-to-many", ok );
+
+		ok = false;
+		try {
+			q.getFums().isEmpty();
+		}
+		catch (LazyInitializationException e) {
+			ok = true;
+		}
+		assertTrue( "lazy collection with many-to-many", ok );
+
+		s = openSession();
+		s.beginTransaction();
+		q = (Qux) s.load( Qux.class, q.getKey() );
+		s.delete(q);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testNewSessionLifecycle() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Serializable fid = null;
+		try {
+			Foo f = new Foo();
+			s.save(f);
+			fid = s.getIdentifier(f);
+			s.getTransaction().commit();
+		}
+		catch (Exception e) {
+			s.getTransaction().rollback();
+			throw e;
+		}
+		finally {
+			s.close();
+		}
+
+		s = openSession();
+		s.beginTransaction();
+		try {
+			Foo f = new Foo();
+			s.delete(f);
+			s.getTransaction().commit();
+		}
+		catch (Exception e) {
+			s.getTransaction().rollback();
+		}
+		finally {
+			s.close();
+		}
+
+		s = openSession();
+		s.beginTransaction();
+		try {
+			Foo f = (Foo) s.load(Foo.class, fid, LockMode.UPGRADE);
+			s.delete(f);
+			s.flush();
+			s.getTransaction().commit();
+		}
+		catch (Exception e) {
+			s.getTransaction().rollback();
+			throw e;
+		}
+		finally {
+			assertTrue( s.close()==null );
+		}
+	}
+
+	public void testDisconnect() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Foo foo = new Foo();
+		Foo foo2 = new Foo();
+		s.save(foo);
+		s.save(foo2);
+		foo2.setFoo(foo);
+		s.getTransaction().commit();
+
+		s.disconnect();
+		s.reconnect();
+
+		s.beginTransaction();
+		s.delete(foo);
+		foo2.setFoo(null);
+		s.getTransaction().commit();
+
+		s.disconnect();
+		s.reconnect();
+
+		s.beginTransaction();
+		s.delete(foo2);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+
+
+	public void testOrderBy() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Foo foo = new Foo();
+		s.save(foo);
+		List list = s.createQuery(
+				"select foo from Foo foo, Fee fee where foo.dependent = fee order by foo.string desc, foo.component.count asc, fee.id"
+		).list();
+		assertTrue( "order by", list.size()==1 );
+		Foo foo2 = new Foo();
+		s.save(foo2);
+		foo.setFoo(foo2);
+		list = s.createQuery(
+				"select foo.foo, foo.dependent from Foo foo order by foo.foo.string desc, foo.component.count asc, foo.dependent.id"
+		).list();
+		assertTrue( "order by", list.size()==1 );
+		list = s.createQuery( "select foo from Foo foo order by foo.dependent.id, foo.dependent.fi" ).list();
+		assertTrue( "order by", list.size()==2 );
+		s.delete(foo);
+		s.delete(foo2);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		Many manyB = new Many();
+		s.save(manyB);
+		One oneB = new One();
+		s.save(oneB);
+		oneB.setValue("b");
+		manyB.setOne(oneB);
+		Many manyA = new Many();
+		s.save(manyA);
+		One oneA = new One();
+		s.save(oneA);
+		oneA.setValue("a");
+		manyA.setOne(oneA);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		List results = s.createQuery( "SELECT one FROM " + One.class.getName() + " one ORDER BY one.value ASC" ).list();
+		assertEquals( 2, results.size() );
+		assertEquals( "'a' isn't first element", "a", ( (One) results.get(0) ).getValue() );
+		assertEquals( "'b' isn't second element", "b", ( (One) results.get(1) ).getValue() );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		results = s.createQuery( "SELECT many.one FROM " + Many.class.getName() + " many ORDER BY many.one.value ASC, many.one.id" )
+				.list();
+		assertEquals( 2, results.size() );
+		assertEquals( 2, results.size() );
+		assertEquals( "'a' isn't first element", "a", ( (One) results.get(0) ).getValue() );
+		assertEquals( "'b' isn't second element", "b", ( (One) results.get(1) ).getValue() );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		oneA = (One)s.load(One.class, oneA.getKey());
+		manyA = (Many)s.load(Many.class, manyA.getKey());
+		oneB = (One)s.load(One.class, oneB.getKey());
+		manyB = (Many)s.load(Many.class, manyB.getKey());
+		s.delete(manyA);
+		s.delete(oneA);
+		s.delete(manyB);
+		s.delete(oneB);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testManyToOne() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		One one = new One();
+		s.save(one);
+		one.setValue("yada");
+		Many many = new Many();
+		many.setOne(one);
+		s.save(many);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		one = (One) s.load( One.class, one.getKey() );
+		one.getManies().size();
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		many = (Many) s.load( Many.class, many.getKey() );
+		assertTrue( "many-to-one assoc", many.getOne()!=null );
+		s.delete( many.getOne() );
+		s.delete(many);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testSaveDelete() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Foo f = new Foo();
+		s.save(f);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.delete( s.load( Foo.class, f.getKey() ) );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testProxyArray() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		GlarchProxy g = new Glarch();
+		Glarch g1 = new Glarch();
+		Glarch g2 = new Glarch();
+		g.setProxyArray( new GlarchProxy[] { g1, g2 } );
+		Glarch g3 = new Glarch();
+		s.save(g3);
+		g2.setProxyArray( new GlarchProxy[] {null, g3, g} );
+		Set set = new HashSet();
+		set.add(g1);
+		set.add(g2);
+		g.setProxySet(set);
+		s.save(g);
+		s.save(g1);
+		s.save(g2);
+		Serializable id = s.getIdentifier(g);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		g = (GlarchProxy) s.load(Glarch.class, id);
+		assertTrue( "array of proxies", g.getProxyArray().length==2 );
+		assertTrue( "array of proxies", g.getProxyArray()[0]!=null );
+		assertTrue("deferred load test",g.getProxyArray()[1].getProxyArray()[0]==null );
+		assertTrue("deferred load test",g.getProxyArray()[1].getProxyArray()[2]==g );
+		assertTrue( "set of proxies", g.getProxySet().size()==2 );
+		Iterator iter = s.createQuery( "from Glarch g" ).iterate();
+		while ( iter.hasNext() ) {
+			iter.next();
+			iter.remove();
+		}
+		s.getTransaction().commit();
+		s.disconnect();
+		SerializationHelper.deserialize( SerializationHelper.serialize(s) );
+		s.close();
+	}
+
+	public void testCache() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Immutable im = new Immutable();
+		s.save(im);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.load( im, im.getId() );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.load( im, im.getId() );
+		assertEquals(
+				"cached object identity",
+				im,
+				s.createQuery( "from Immutable im where im = ?" ).setParameter( 0, im, Hibernate.entity(Immutable.class) ).uniqueResult()
+		);
+		s.connection().createStatement().executeUpdate("delete from immut");
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testFindLoad() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		FooProxy foo = new Foo();
+		s.save(foo);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		foo = (FooProxy) s.createQuery( "from Foo foo" ).list().get(0);
+		FooProxy foo2 = (FooProxy) s.load( Foo.class, foo.getKey() );
+		assertTrue("find returns same object as load", foo==foo2);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		foo2 = (FooProxy) s.load( Foo.class, foo.getKey() );
+		foo = (FooProxy) s.createQuery( "from Foo foo" ).list().get(0);
+		assertTrue("find returns same object as load", foo==foo2);
+		doDelete( s, "from Foo foo" );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testRefresh() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Foo foo = new Foo();
+		s.save(foo);
+		s.flush();
+		s.connection().createStatement().executeUpdate("update "+getDialect().openQuote()+"foos"+getDialect().closeQuote()+" set long_ = -3");
+		s.refresh(foo);
+		assertTrue( foo.getLong().longValue()==-3l );
+		assertTrue( s.getCurrentLockMode(foo)==LockMode.READ );
+		s.refresh(foo, LockMode.UPGRADE);
+		if ( getDialect().supportsOuterJoinForUpdate() ) {
+			assertTrue( s.getCurrentLockMode(foo)==LockMode.UPGRADE );
+		}
+		s.delete(foo);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testAutoFlush() throws Exception {
+		Session s = openSession();
+		Transaction txn = s.beginTransaction();
+		FooProxy foo = new Foo();
+		s.save(foo);
+		assertTrue( "autoflush create", s.createQuery( "from Foo foo" ).list().size()==1 );
+		foo.setChar( new Character('X') );
+		assertTrue( "autoflush update", s.createQuery( "from Foo foo where foo.char='X'" ).list().size()==1 );
+		txn.commit();
+		s.close();
+
+		s = openSession();
+		txn = s.beginTransaction();
+		foo = (FooProxy) s.load( Foo.class, foo.getKey() );
+		//s.update( new Foo(), foo.getKey() );
+		//assertTrue( s.find("from Foo foo where not foo.char='X'").size()==1, "autoflush update" );
+		if ( !(getDialect() instanceof MySQLDialect) && !(getDialect() instanceof HSQLDialect) && !(getDialect() instanceof PointbaseDialect) )  {
+			foo.setBytes( "osama".getBytes() );
+			assertTrue( "autoflush collection update",
+					s.createQuery( "from Foo foo where 111 in elements(foo.bytes)" ).list().size()==1 );
+			foo.getBytes()[0] = 69;
+			assertTrue( "autoflush collection update",
+					s.createQuery( "from Foo foo where 69 in elements(foo.bytes)" ).list()
+							.size()==1 );
+		}
+		s.delete(foo);
+		assertTrue( "autoflush delete", s.createQuery( "from Foo foo" ).list().size()==0 );
+		txn.commit();
+		s.close();
+	}
+
+	public void testVeto() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Vetoer v = new Vetoer();
+		s.save(v); Serializable id = s.save(v);
+		s.getTransaction().commit();
+		s.close();
+		s = openSession();
+		s.beginTransaction();
+		s.update(v, id);
+		s.update(v, id);
+		s.delete(v);
+		s.delete(v);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testSerializableType() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Vetoer v = new Vetoer();
+		v.setStrings( new String[] { "foo", "bar", "baz" } );
+		s.save(v); Serializable id = s.save(v);
+		v.getStrings()[1] = "osama";
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		v = (Vetoer) s.load(Vetoer.class, id);
+		assertTrue( "serializable type", v.getStrings()[1].equals("osama") );
+		s.delete(v); s.delete(v);
+		s.flush();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testAutoFlushCollections() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Baz baz = new Baz();
+		baz.setDefaults();
+		s.save(baz);
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		baz = (Baz) s.load(Baz.class, baz.getCode());
+		baz.getStringArray()[0] = "bark";
+		Iterator i = s.createQuery( "select elements(baz.stringArray) from Baz baz" ).iterate();
+		boolean found = false;
+		while ( i.hasNext() ) {
+			if ( "bark".equals( i.next() ) ) found = true;
+		}
+		assertTrue(found);
+		baz.setStringArray(null);
+		i = s.createQuery( "select distinct elements(baz.stringArray) from Baz baz" ).iterate();
+		assertTrue( !i.hasNext() );
+		baz.setStringArray( new String[] { "foo", "bar" } );
+		i = s.createQuery( "select elements(baz.stringArray) from Baz baz" ).iterate();
+		assertTrue( i.hasNext() );
+
+		Foo foo = new Foo();
+		s.save(foo);
+		s.flush();
+		baz.setFooArray( new Foo[] {foo} );
+
+		i = s.createQuery( "select foo from Baz baz join baz.fooArray foo" ).iterate();
+		found = false;
+		while ( i.hasNext() ) {
+			if ( foo==i.next() ) found = true;
+		}
+		assertTrue(found);
+
+		baz.getFooArray()[0] = null;
+		i = s.createQuery( "select foo from Baz baz join baz.fooArray foo" ).iterate();
+		assertTrue( !i.hasNext() );
+		baz.getFooArray()[0] = foo;
+		i = s.createQuery( "select elements(baz.fooArray) from Baz baz" ).iterate();
+		assertTrue( i.hasNext() );
+
+		if ( !(getDialect() instanceof MySQLDialect)
+				&& !(getDialect() instanceof HSQLDialect)
+				&& !(getDialect() instanceof InterbaseDialect)
+				&& !(getDialect() instanceof PointbaseDialect)
+				&& !(getDialect() instanceof SAPDBDialect) )  {
+			baz.getFooArray()[0] = null;
+			i = s.createQuery( "from Baz baz where ? in elements(baz.fooArray)" )
+					.setParameter( 0, foo, Hibernate.entity( Foo.class ) )
+					.iterate();
+			assertTrue( !i.hasNext() );
+			baz.getFooArray()[0] = foo;
+			i = s.createQuery( "select foo from Foo foo where foo in (select elt from Baz baz join baz.fooArray elt)" )
+					.iterate();
+			assertTrue( i.hasNext() );
+		}
+		s.delete(foo);
+		s.delete(baz);
+		tx.commit();
+		s.close();
+	}
+
+	public void testUserProvidedConnection() throws Exception {
+		ConnectionProvider dcp = new DriverManagerConnectionProvider();
+		dcp.configure( Environment.getProperties() );
+		Session s = getSessions().openSession( dcp.getConnection() );
+		Transaction tx = s.beginTransaction();
+		s.createQuery( "from Fo" ).list();
+		tx.commit();
+		Connection c = s.disconnect();
+		assertTrue( c!=null );
+		s.reconnect(c);
+		tx = s.beginTransaction();
+		s.createQuery( "from Fo" ).list();
+		tx.commit();
+		assertTrue( s.close()==c );
+		c.close();
+	}
+
+	public void testCachedCollection() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Baz baz = new Baz();
+		baz.setDefaults();
+		s.save(baz);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		baz = (Baz) s.load( Baz.class, baz.getCode() );
+		( (FooComponent) baz.getTopComponents().get(0) ).setCount(99);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		baz = (Baz) s.load( Baz.class, baz.getCode() );
+		assertTrue( ( (FooComponent) baz.getTopComponents().get(0) ).getCount()==99 );
+		s.delete(baz);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testComplicatedQuery() throws Exception {
+		Session s = openSession();
+		Transaction txn = s.beginTransaction();
+		Foo foo = new Foo();
+		Serializable id = s.save(foo);
+		assertTrue(id!=null);
+		Qux q = new Qux("q");
+		foo.getDependent().setQux(q);
+		s.save(q);
+		q.getFoo().setString("foo2");
+		//s.flush();
+		//s.connection().commit();
+		assertTrue(
+				s.createQuery( "from Foo foo where foo.dependent.qux.foo.string = 'foo2'" ).iterate().hasNext()
+		);
+		s.delete(foo);
+		txn.commit();
+		s.close();
+	}
+
+	public void testLoadAfterDelete() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Foo foo = new Foo();
+		Serializable id = s.save(foo);
+		s.flush();
+		s.delete(foo);
+		boolean err=false;
+		try {
+			s.load(Foo.class, id);
+		}
+		catch (ObjectNotFoundException ode) {
+			err=true;
+		}
+		assertTrue(err);
+		s.flush();
+		err=false;
+		try {
+			( (FooProxy) s.load(Foo.class, id) ).getBool();
+		}
+		catch (ObjectNotFoundException onfe) {
+			err=true;
+		}
+		assertTrue(err);
+		Fo fo = Fo.newFo();
+		id = new FumTest("").fumKey("abc"); //yuck!!
+		s.save(fo, id);
+		s.flush();
+		s.delete(fo);
+		err=false;
+		try {
+			s.load(Fo.class, id);
+		}
+		catch (ObjectNotFoundException ode) {
+			err=true;
+		}
+		assertTrue(err);
+		s.flush();
+		err=false;
+		try {
+			s.load(Fo.class, id);
+		}
+		catch (ObjectNotFoundException onfe) {
+			err=true;
+		}
+		assertTrue(err);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testObjectType() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		GlarchProxy g = new Glarch();
+		Foo foo = new Foo();
+		g.setAny(foo);
+		Serializable gid = s.save(g);
+		s.save(foo);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		g = (GlarchProxy) s.load(Glarch.class, gid);
+		assertTrue( g.getAny()!=null && g.getAny() instanceof FooProxy );
+		s.delete( g.getAny() );
+		s.delete(g);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+
+	public void testAny() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		One one = new One();
+		BarProxy foo = new Bar();
+		foo.setObject(one);
+		Serializable fid = s.save(foo);
+		Serializable oid = one.getKey();
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		List results = s.createQuery( "from Bar bar where bar.object.id = ? and bar.object.class = ?" )
+				.setParameter( 0, oid, Hibernate.LONG )
+				.setParameter( 1, new Character('O'), Hibernate.CHARACTER )
+				.list();
+		assertEquals( 1, results.size() );
+		results = s.createQuery( "select one from One one, Bar bar where bar.object.id = one.id and bar.object.class = 'O'" )
+				.list();
+		assertEquals( 1, results.size() );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		foo = (BarProxy) s.load(Foo.class, fid);
+		assertTrue( foo.getObject()!=null && foo.getObject() instanceof One && s.getIdentifier( foo.getObject() ).equals(oid) );
+		//s.delete( foo.getObject() );
+		s.delete(foo);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testEmbeddedCompositeID() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Location l = new Location();
+		l.setCountryCode("AU");
+		l.setDescription("foo bar");
+		l.setLocale( Locale.getDefault() );
+		l.setStreetName("Brunswick Rd");
+		l.setStreetNumber(300);
+		l.setCity("Melbourne");
+		s.save(l);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.setFlushMode(FlushMode.MANUAL);
+		l = (Location) s.createQuery( "from Location l where l.countryCode = 'AU' and l.description='foo bar'" )
+				.list()
+				.get(0);
+		assertTrue( l.getCountryCode().equals("AU") );
+		assertTrue( l.getCity().equals("Melbourne") );
+		assertTrue( l.getLocale().equals( Locale.getDefault() ) );
+		assertTrue( s.createCriteria(Location.class).add( Restrictions.eq( "streetNumber", new Integer(300) ) ).list().size()==1 );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		l.setDescription("sick're");
+		s.update(l);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		l = new Location();
+		l.setCountryCode("AU");
+		l.setDescription("foo bar");
+		l.setLocale(Locale.ENGLISH);
+		l.setStreetName("Brunswick Rd");
+		l.setStreetNumber(300);
+		l.setCity("Melbourne");
+		assertTrue( l==s.load(Location.class, l) );
+		assertTrue( l.getLocale().equals( Locale.getDefault() ) );
+		s.delete(l);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testAutosaveChildren() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Baz baz = new Baz();
+		Set bars = new HashSet();
+		baz.setCascadingBars(bars);
+		s.save(baz);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		baz = (Baz) s.load( Baz.class, baz.getCode() );
+		baz.getCascadingBars().add( new Bar() );
+		baz.getCascadingBars().add( new Bar() );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		baz = (Baz) s.load( Baz.class, baz.getCode() );
+		assertTrue( baz.getCascadingBars().size()==2 );
+		assertTrue( baz.getCascadingBars().iterator().next()!=null );
+		baz.getCascadingBars().clear(); //test all-delete-orphan;
+		s.flush();
+		assertTrue( s.createQuery( "from Bar bar" ).list().size()==0 );
+		s.delete(baz);
+		t.commit();
+		s.close();
+	}
+
+	public void testOrphanDelete() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Baz baz = new Baz();
+		Set bars = new HashSet();
+		baz.setCascadingBars(bars);
+		bars.add( new Bar() );
+		bars.add( new Bar() );
+		bars.add( new Bar() );
+		bars.add( new Bar() );
+		s.save(baz);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		baz = (Baz) s.load( Baz.class, baz.getCode() );
+		bars = baz.getCascadingBars();
+		assertEquals( 4, bars.size() );
+		bars.remove( bars.iterator().next() );
+		assertEquals( 3, s.createQuery( "From Bar bar" ).list().size() );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		baz = (Baz) s.load( Baz.class, baz.getCode() );
+		bars = baz.getCascadingBars();
+		assertEquals( 3, bars.size() );
+		bars.remove( bars.iterator().next() );
+		s.delete(baz);
+		bars.remove( bars.iterator().next() );
+		assertEquals( 0, s.createQuery( "From Bar bar" ).list().size() );
+		t.commit();
+		s.close();
+
+	}
+
+	public void testTransientOrphanDelete() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Baz baz = new Baz();
+		Set bars = new HashSet();
+		baz.setCascadingBars(bars);
+		bars.add( new Bar() );
+		bars.add( new Bar() );
+		bars.add( new Bar() );
+		List foos = new ArrayList();
+		foos.add( new Foo() );
+		foos.add( new Foo() );
+		baz.setFooBag(foos);
+		s.save(baz);
+		Iterator i = new JoinedIterator( new Iterator[] {foos.iterator(), bars.iterator()} );
+		while ( i.hasNext() ) {
+			FooComponent cmp = ( (Foo) i.next() ).getComponent();
+			s.delete( cmp.getGlarch() );
+			cmp.setGlarch(null);
+		}
+		t.commit();
+		s.close();
+
+		bars.remove( bars.iterator().next() );
+		foos.remove(1);
+		s = openSession();
+		t = s.beginTransaction();
+		s.update(baz);
+		assertEquals( 2, s.createQuery( "From Bar bar" ).list().size() );
+		assertEquals( 3, s.createQuery( "From Foo foo" ).list().size() );
+		t.commit();
+		s.close();
+
+		foos.remove(0);
+		s = openSession();
+		t = s.beginTransaction();
+		s.update(baz);
+		bars.remove( bars.iterator().next() );
+		assertEquals( 1, s.createQuery( "From Foo foo" ).list().size() );
+		s.delete(baz);
+		//s.flush();
+		assertEquals( 0, s.createQuery( "From Foo foo" ).list().size() );
+		t.commit();
+		s.close();
+
+	}
+
+	public void testProxiesInCollections() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Baz baz = new Baz();
+		Bar bar = new Bar();
+		Bar bar2 = new Bar();
+		s.save(bar);
+		Serializable bar2id = s.save(bar2);
+		baz.setFooArray( new Foo[] { bar, bar2 } );
+		HashSet set = new HashSet();
+		bar = new Bar();
+		s.save(bar);
+		set.add(bar);
+		baz.setFooSet(set);
+		set = new HashSet();
+		set.add( new Bar() );
+		set.add( new Bar() );
+		baz.setCascadingBars(set);
+		ArrayList list = new ArrayList();
+		list.add( new Foo() );
+		baz.setFooBag(list);
+		Serializable id = s.save(baz);
+		Serializable bid = ( (Bar) baz.getCascadingBars().iterator().next() ).getKey();
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		BarProxy barprox = (BarProxy) s.load(Bar.class, bid);
+		BarProxy bar2prox = (BarProxy) s.load(Bar.class, bar2id);
+		assertTrue(bar2prox instanceof HibernateProxy);
+		assertTrue(barprox instanceof HibernateProxy);
+		baz = (Baz) s.load(Baz.class, id);
+		Iterator i = baz.getCascadingBars().iterator();
+		BarProxy b1 = (BarProxy) i.next();
+		BarProxy b2 = (BarProxy) i.next();
+		assertTrue( ( b1==barprox && !(b2 instanceof HibernateProxy) ) || ( b2==barprox && !(b1 instanceof HibernateProxy) ) ); //one-to-many
+		assertTrue( baz.getFooArray()[0] instanceof HibernateProxy ); //many-to-many
+		assertTrue( baz.getFooArray()[1]==bar2prox );
+		if ( !isOuterJoinFetchingDisabled() ) assertTrue( !(baz.getFooBag().iterator().next() instanceof HibernateProxy) ); //many-to-many outer-join="true"
+		assertTrue( !(baz.getFooSet().iterator().next() instanceof HibernateProxy) ); //one-to-many
+		doDelete( s, "from Baz" );
+		doDelete( s, "from Foo" );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testPSCache() throws Exception {
+		Session s = openSession();
+		Transaction txn = s.beginTransaction();
+		for ( int i=0; i<10; i++ ) s.save( new Foo() );
+		Query q = s.createQuery("from Foo");
+		q.setMaxResults(2);
+		q.setFirstResult(5);
+		assertTrue( q.list().size()==2 );
+		q = s.createQuery("from Foo");
+		assertTrue( q.list().size()==10 );
+		assertTrue( q.list().size()==10 );
+		q.setMaxResults(3);
+		q.setFirstResult(3);
+		assertTrue( q.list().size()==3 );
+		q = s.createQuery("from Foo");
+		assertTrue( q.list().size()==10 );
+		txn.commit();
+		s.close();
+
+		s = openSession();
+		txn = s.beginTransaction();
+		q = s.createQuery("from Foo");
+		assertTrue( q.list().size()==10 );
+		q.setMaxResults(5);
+		assertTrue( q.list().size()==5 );
+		doDelete( s, "from Foo" );
+		txn.commit();
+		s.close();
+
+	}
+
+	public void testForCertain() throws Exception {
+		Glarch g = new Glarch();
+		Glarch g2 = new Glarch();
+		List set = new ArrayList();
+		set.add("foo");
+		g2.setStrings(set);
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Serializable gid = (Serializable) s.save(g);
+		Serializable g2id = (Serializable) s.save(g2);
+		t.commit();
+		assertTrue( g.getVersion()==0 );
+		assertTrue( g2.getVersion()==0 );
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		g = (Glarch) s.get(Glarch.class, gid);
+		g2 = (Glarch) s.get(Glarch.class, g2id);
+		assertTrue( g2.getStrings().size()==1 );
+		s.delete(g);
+		s.delete(g2);
+		t.commit();
+		s.close();
+
+	}
+
+	public void testBagMultipleElements() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Baz baz = new Baz();
+		baz.setBag( new ArrayList() );
+		baz.setByteBag( new ArrayList() );
+		s.save(baz);
+		baz.getBag().add("foo");
+		baz.getBag().add("bar");
+		baz.getByteBag().add( "foo".getBytes() );
+		baz.getByteBag().add( "bar".getBytes() );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		//put in cache
+		baz = (Baz) s.get( Baz.class, baz.getCode() );
+		assertTrue( baz.getBag().size()==2 );
+		assertTrue( baz.getByteBag().size()==2 );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		baz = (Baz) s.get( Baz.class, baz.getCode() );
+		assertTrue( baz.getBag().size()==2 );
+		assertTrue( baz.getByteBag().size()==2 );
+		baz.getBag().remove("bar");
+ 		baz.getBag().add("foo");
+ 		baz.getByteBag().add( "bar".getBytes() );
+		t.commit();
+		s.close();
+
+ 		s = openSession();
+ 		t = s.beginTransaction();
+ 		baz = (Baz) s.get( Baz.class, baz.getCode() );
+ 		assertTrue( baz.getBag().size()==2 );
+ 		assertTrue( baz.getByteBag().size()==3 );
+ 		s.delete(baz);
+ 		t.commit();
+ 		s.close();
+ 	}
+
+	public void testWierdSession() throws Exception {
+ 		Session s = openSession();
+ 		Transaction t = s.beginTransaction();
+ 		Serializable id =  s.save( new Foo() );
+ 		t.commit();
+ 		s.close();
+
+ 		s = openSession();
+ 		s.setFlushMode(FlushMode.MANUAL);
+		t = s.beginTransaction();
+		Foo foo = (Foo) s.get(Foo.class, id);
+		t.commit();
+		s.disconnect();
+
+		s.reconnect();
+		t = s.beginTransaction();
+		s.flush();
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		foo = (Foo) s.get(Foo.class, id);
+		s.delete(foo);
+		t.commit();
+		s.close();
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/FooBarTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/FooComponent.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/FooComponent.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/FooComponent.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,133 @@
+//$Id: FooComponent.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+import java.util.Date;
+
+public class FooComponent implements Serializable {
+	
+	int count;
+	String name;
+	Date[] importantDates;
+	FooComponent subcomponent;
+	Fee fee = new Fee();
+	GlarchProxy glarch;
+	private FooProxy parent;
+	private Baz baz;
+	
+	public boolean equals(Object that) {
+		FooComponent fc = (FooComponent) that;
+		return count==fc.count;
+	}
+	
+	public int hashCode() {
+		return count;
+	}
+	
+	public String toString() {
+		String result = "FooComponent: " + name + "=" + count;
+		result+="; dates=[";
+		if ( importantDates!=null) {
+			for ( int i=0; i<importantDates.length; i++ ) {
+				result+=(i==0 ?"":", ") + importantDates[i];
+			}
+		}
+		result+="]";
+		if ( subcomponent!=null ) {
+			result+= " (" + subcomponent + ")";
+		}
+		return result;
+	}
+	
+	public FooComponent() {}
+	
+	FooComponent(String name, int count, Date[] dates, FooComponent subcomponent) {
+		this.name = name;
+		this.count = count;
+		this.importantDates = dates;
+		this.subcomponent = subcomponent;
+	}
+	
+	FooComponent(String name, int count, Date[] dates, FooComponent subcomponent, Fee fee) {
+		this.name = name;
+		this.count = count;
+		this.importantDates = dates;
+		this.subcomponent = subcomponent;
+		this.fee = fee;
+	}
+	
+	public int getCount() {
+		return count;
+	}
+	public void setCount(int count) {
+		this.count = count;
+	}
+	
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	public Date[] getImportantDates() {
+		return importantDates;
+	}
+	public void setImportantDates(Date[] importantDates) {
+		this.importantDates = importantDates;
+	}
+	
+	public FooComponent getSubcomponent() {
+		return subcomponent;
+	}
+	public void setSubcomponent(FooComponent subcomponent) {
+		this.subcomponent = subcomponent;
+	}
+	
+	private String getNull() {
+		return null;
+	}
+	private void setNull(String str) throws Exception {
+		if (str!=null) throw new Exception("null component property");
+	}
+	public Fee getFee() {
+		return fee;
+	}
+	
+	public void setFee(Fee fee) {
+		this.fee = fee;
+	}
+	
+	public GlarchProxy getGlarch() {
+		return glarch;
+	}
+	
+	public void setGlarch(GlarchProxy glarch) {
+		this.glarch = glarch;
+	}
+	
+	public FooProxy getParent() {
+		return parent;
+	}
+	
+	public void setParent(FooProxy parent) {
+		//if (parent==null) throw new RuntimeException("null parent set");
+		this.parent = parent;
+	}
+	
+	public Baz getBaz() {
+		return baz;
+	}
+	
+	public void setBaz(Baz baz) {
+		this.baz = baz;
+	}
+	
+}
+
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/FooComponent.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/FooProxy.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/FooProxy.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/FooProxy.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,64 @@
+package org.hibernate.test.legacy;
+
+public interface FooProxy {
+	public void setNullComponent(FooComponent arg0) throws Exception;
+	public FooComponent getNullComponent();
+	public void setComponent(FooComponent arg0);
+	public FooComponent getComponent();
+	public void setCustom(String[] arg0);
+	public String[] getCustom();
+	public void setBinary(byte[] arg0);
+	public byte[] getBinary();
+	public void setNullBlob(java.io.Serializable arg0);
+	public java.io.Serializable getNullBlob();
+	public void setBlob(java.io.Serializable arg0);
+	public java.io.Serializable getBlob();
+	public void setYesno(boolean arg0);
+	public boolean getYesno();
+	public boolean equalsFoo(Foo arg0);
+	public void disconnect();
+	public String toString();
+	public void setByte(Byte arg0);
+	public Byte getByte();
+	public void setNull(Integer arg0);
+	public Integer getNull();
+	public void setInt(int arg0);
+	public int getInt();
+	public void setBool(boolean arg0);
+	public boolean getBool();
+	public void setZero(float arg0);
+	public float getZero();
+	public void setBytes(byte[] arg0);
+	public byte[] getBytes();
+	public void setBoolean(Boolean arg0);
+	public Boolean getBoolean();
+	public void setDouble(Double arg0);
+	public Double getDouble();
+	public void setFloat(Float arg0);
+	public Float getFloat();
+	public void setShort(Short arg0);
+	public Short getShort();
+	public Character getChar();
+	public void setChar(Character _char);
+	public Long getLong();
+	public void setInteger(Integer arg0);
+	public Integer getInteger();
+	public void setTimestamp(java.util.Date arg0);
+	public java.util.Date getTimestamp();
+	public void setDate(java.util.Date arg0);
+	public java.util.Date getDate();
+	public void setString(String arg0);
+	public String getString();
+	public void setFoo(FooProxy arg0);
+	public FooProxy getFoo();
+	public void setKey(String arg0);
+	public String getKey();
+	public Fee getDependent();
+	public float getFormula();
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/FooProxy.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fum.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fum.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fum.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,71 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-lazy="false">
+
+	<class name="org.hibernate.test.legacy.Fum" dynamic-update="true">
+		<!--cache-->
+		<composite-id name="id" unsaved-value="any">
+			<meta attribute="fum">fum</meta>
+			<key-property name="string">
+				<column name="string_" length="10"/>
+			</key-property>
+			<key-property name="short" column="short_"/>
+			<key-property name="date" column="date_" type="date"/>
+		</composite-id>
+		<version name="vid" type="short" access="field"/>
+		<!--version name="lastUpdated" type="calendar"/-->
+		<property name="fum" not-null="true"/>
+		<property name="TString"/>
+		<many-to-one name="fo">
+			<column name="fo_string" length="10"/>
+			<column name="fo_short"/>
+			<column name="fo_date"/>
+		</many-to-one>
+		<set name="friends">
+			<key>
+				<column name="fr_string_" length="10"/>
+				<column name="fr_short_"/>
+				<column name="fr_date_"/>
+			</key>
+			<one-to-many class="org.hibernate.test.legacy.Fum"/>
+		</set>
+		<array name="quxArray">
+			<key>
+				<column name="fum_str_" length="10"/>
+				<column name="fum_sho_"/>
+				<column name="fum_dat_"/>
+			</key>
+			<index column="i"/>
+			<one-to-many class="org.hibernate.test.legacy.Qux"/>
+		</array>
+		<property name="dupe" 
+			column="short_" 
+			insert="false" 
+			update="false" 
+			not-null="true"/>
+		<component name="mapComponent">
+			<property name="count" column="count_"/>
+			<map name="fummap" lazy="true">
+				<key>
+					<column name="fum_str_" length="10"/>
+					<column name="fum_sho_"/>
+					<column name="fum_dat_"/>
+				</key>
+				<index column="fummapindex" type="string"/>
+				<one-to-many class="org.hibernate.test.legacy.Fum"/>
+			</map>
+			<map name="stringmap" outer-join="true">
+				<key>
+					<column name="fum_str_" length="10"/>
+					<column name="fum_sho_"/>
+					<column name="fum_dat_"/>
+				</key>
+				<index column="mapindex" type="string"/>
+				<element column="mapelement" type="string"/>
+			</map>
+		</component>
+	</class>
+	
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fum.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fum.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fum.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fum.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,187 @@
+//$Id: Fum.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+import java.sql.SQLException;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import org.hibernate.CallbackException;
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
+import org.hibernate.classic.Lifecycle;
+
+public class Fum implements Lifecycle, Serializable {
+	private String fum;
+	private FumCompositeID id;
+	private Fum fo;
+	private Qux[] quxArray;
+	private Set friends;
+	private Calendar lastUpdated;
+	private String tString;
+	private short vid;
+	private short dupe;
+	private MapComponent mapComponent = new MapComponent();
+
+	public Fum() {}
+	public Fum(FumCompositeID id) throws SQLException, HibernateException {
+		this.id = id;
+		friends = new HashSet();
+		FumCompositeID fid = new FumCompositeID();
+		fid.setDate( new Date() );
+		fid.setShort( (short) ( id.short_ + 33 ) );
+		fid.setString( id.string_ + "dd" );
+		Fum f = new Fum();
+		f.id = fid;
+		f.fum="FRIEND";
+		friends.add(f);
+	}
+	public String getFum() {
+		return fum;
+	}
+	public void setFum(String fum) {
+		this.fum = fum;
+	}
+
+	public FumCompositeID getId() {
+		return id;
+	}
+	private void setId(FumCompositeID id) {
+		this.id = id;
+	}
+	public Fum getFo() {
+		return fo;
+	}
+	public void setFo(Fum fo) {
+		this.fo = fo;
+	}
+
+	public Qux[] getQuxArray() {
+		return quxArray;
+	}
+	public void setQuxArray(Qux[] quxArray) {
+		this.quxArray = quxArray;
+	}
+
+	public Set getFriends() {
+		return friends;
+	}
+
+	public void setFriends(Set friends) {
+		this.friends = friends;
+	}
+
+
+	public boolean onDelete(Session s) throws CallbackException {
+		if (friends==null) return false;
+		try {
+			Iterator iter = friends.iterator();
+			while ( iter.hasNext() ) {
+				s.delete( iter.next() );
+			}
+		}
+		catch (Exception e) {
+			throw new CallbackException(e);
+		}
+		return false;
+	}
+
+
+	public void onLoad(Session s, Serializable id) {
+	}
+
+
+	public boolean onSave(Session s) throws CallbackException {
+		if (friends==null) return false;
+		try {
+			Iterator iter = friends.iterator();
+			while ( iter.hasNext() ) {
+				s.save( iter.next() );
+			}
+		}
+		catch (Exception e) {
+			throw new CallbackException(e);
+		}
+		return false;
+	}
+
+
+	public boolean onUpdate(Session s) throws CallbackException {
+		return false;
+	}
+
+	public Calendar getLastUpdated() {
+		return lastUpdated;
+	}
+
+	public void setLastUpdated(Calendar calendar) {
+		lastUpdated = calendar;
+	}
+
+	public String getTString() {
+		return tString;
+	}
+
+	public void setTString(String string) {
+		tString = string;
+	}
+
+	public short getDupe() {
+		return dupe;
+	}
+
+	public void setDupe(short s) {
+		dupe = s;
+	}
+
+	public static final class MapComponent implements Serializable {
+		private Map fummap = new HashMap();
+		private Map stringmap = new HashMap();
+		private int count;
+		public Map getFummap() {
+			return fummap;
+		}
+
+		public void setFummap(Map mapcomponent) {
+			this.fummap = mapcomponent;
+		}
+
+		public int getCount() {
+			return count;
+		}
+
+		public void setCount(int count) {
+			this.count = count;
+		}
+
+		public Map getStringmap() {
+			return stringmap;
+		}
+
+		public void setStringmap(Map stringmap) {
+			this.stringmap = stringmap;
+		}
+
+	}
+
+	public MapComponent getMapComponent() {
+		return mapComponent;
+	}
+
+	public void setMapComponent(MapComponent mapComponent) {
+		this.mapComponent = mapComponent;
+	}
+
+}
+
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fum.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/FumCompositeID.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/FumCompositeID.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/FumCompositeID.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,40 @@
+//$Id: FumCompositeID.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+public class FumCompositeID implements java.io.Serializable {
+	String string_;
+	java.util.Date date_;
+	short short_;
+	public boolean equals(Object other) {
+		FumCompositeID that = (FumCompositeID) other;
+		return this.string_.equals(that.string_) && this.short_==that.short_;
+	}
+	public int hashCode() {
+		return string_.hashCode();
+	}
+	public String getString() {
+		return string_;
+	}
+	public void setString(String string_) {
+		this.string_ = string_;
+	}
+	public java.util.Date getDate() {
+		return date_;
+	}
+	public void setDate(java.util.Date date_) {
+		this.date_ = date_;
+	}
+	public short getShort() {
+		return short_;
+	}
+	public void setShort(short short_) {
+		this.short_ = short_;
+	}
+}
+
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/FumCompositeID.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/FumTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/FumTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/FumTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,896 @@
+//$Id: FumTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.legacy;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+import junit.framework.Test;
+import junit.textui.TestRunner;
+
+import org.hibernate.Criteria;
+import org.hibernate.FetchMode;
+import org.hibernate.FlushMode;
+import org.hibernate.Hibernate;
+import org.hibernate.HibernateException;
+import org.hibernate.LockMode;
+import org.hibernate.Query;
+import org.hibernate.Transaction;
+import org.hibernate.classic.Session;
+import org.hibernate.criterion.MatchMode;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.dialect.HSQLDialect;
+import org.hibernate.dialect.MckoiDialect;
+import org.hibernate.dialect.MySQLDialect;
+import org.hibernate.dialect.PointbaseDialect;
+import org.hibernate.dialect.TimesTenDialect;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.transform.Transformers;
+import org.hibernate.type.DateType;
+import org.hibernate.type.EntityType;
+import org.hibernate.type.StringType;
+import org.hibernate.type.Type;
+
+public class FumTest extends LegacyTestCase {
+
+	private static short fumKeyShort = 1;
+
+	public FumTest(String arg) {
+		super(arg);
+	}
+
+	public String[] getMappings() {
+		return new String[] {
+			"legacy/FooBar.hbm.xml",
+			"legacy/Baz.hbm.xml",
+			"legacy/Qux.hbm.xml",
+			"legacy/Glarch.hbm.xml",
+			"legacy/Fum.hbm.xml",
+			"legacy/Fumm.hbm.xml",
+			"legacy/Fo.hbm.xml",
+			"legacy/One.hbm.xml",
+			"legacy/Many.hbm.xml",
+			"legacy/Immutable.hbm.xml",
+			"legacy/Fee.hbm.xml",
+			"legacy/Vetoer.hbm.xml",
+			"legacy/Holder.hbm.xml",
+			"legacy/Location.hbm.xml",
+			"legacy/Stuff.hbm.xml",
+			"legacy/Container.hbm.xml",
+			"legacy/Simple.hbm.xml",
+			"legacy/Middle.hbm.xml"
+		};
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( FumTest.class );
+	}
+
+	public static void main(String[] args) throws Exception {
+		TestRunner.run( suite() );
+	}
+	
+	public void testQuery() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.createQuery("from Fum fum where fum.fo.id.string = 'x'").list();
+		t.commit();
+		s.close();
+	}
+
+	public void testCriteriaCollection() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Fum fum = new Fum( fumKey("fum") );
+		fum.setFum("a value");
+		fum.getMapComponent().getFummap().put("self", fum);
+		fum.getMapComponent().getStringmap().put("string", "a staring");
+		fum.getMapComponent().getStringmap().put("string2", "a notha staring");
+		fum.getMapComponent().setCount(1);
+		s.save(fum);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		Fum b = (Fum) s.createCriteria(Fum.class).add(
+			Restrictions.in("fum", new String[] { "a value", "no value" } )
+		)
+		.uniqueResult();
+		assertTrue( Hibernate.isInitialized( b.getMapComponent().getStringmap() ) );
+		assertTrue( b.getMapComponent().getFummap().size()==1 );
+		assertTrue( b.getMapComponent().getStringmap().size()==2 );
+		s.delete(b);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testCriteria() throws Exception {
+		Session s = openSession();
+		Transaction txn = s.beginTransaction();
+		Fum fum = new Fum( fumKey("fum") );
+		fum.setFo( new Fum( fumKey("fo") ) );
+		fum.setFum("fo fee fi");
+		fum.getFo().setFum("stuff");
+		Fum fr = new Fum( fumKey("fr") );
+		fr.setFum("goo");
+		Fum fr2 = new Fum( fumKey("fr2") );
+		fr2.setFum("soo");
+		fum.setFriends( new HashSet() );
+		fum.getFriends().add(fr);
+		fum.getFriends().add(fr2);
+		s.save(fr);
+		s.save(fr2);
+		s.save( fum.getFo() );
+		s.save(fum);
+
+		Criteria base = s.createCriteria(Fum.class)
+			.add( Restrictions.like("fum", "f", MatchMode.START) );
+		base.createCriteria("fo")
+			.add( Restrictions.isNotNull("fum") );
+		base.createCriteria("friends")
+			.add( Restrictions.like("fum", "g%") );
+		List list = base.list();
+		assertTrue( list.size()==1 && list.get(0)==fum );
+
+		base = s.createCriteria(Fum.class)
+			.add( Restrictions.like("fum", "f%") )
+			.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
+		base.createCriteria("fo", "fo")
+			.add( Restrictions.isNotNull("fum") );
+		base.createCriteria("friends", "fum")
+			.add( Restrictions.like("fum", "g", MatchMode.START) );
+		Map map = (Map) base.uniqueResult();
+
+		assertTrue(
+			map.get("this")==fum &&
+			map.get("fo")==fum.getFo() &&
+			fum.getFriends().contains( map.get("fum") ) &&
+			map.size()==3
+		);
+
+		base = s.createCriteria(Fum.class)
+			.add( Restrictions.like("fum", "f%") )
+			.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP)
+			.setFetchMode( "friends", FetchMode.JOIN );
+		base.createCriteria("fo", "fo")
+			.add( Restrictions.eq( "fum", fum.getFo().getFum() ) );
+		map = (Map) base.list().get(0);
+
+		assertTrue(
+			map.get("this")==fum &&
+			map.get("fo")==fum.getFo() &&
+			map.size()==2
+		);
+
+		list = s.createCriteria(Fum.class)
+			.createAlias("friends", "fr")
+			.createAlias("fo", "fo")
+			.add( Restrictions.like("fum", "f%") )
+			.add( Restrictions.isNotNull("fo") )
+			.add( Restrictions.isNotNull("fo.fum") )
+			.add( Restrictions.like("fr.fum", "g%") )
+			.add( Restrictions.eqProperty("fr.id.short", "id.short") )
+			.list();
+		assertTrue( list.size()==1 && list.get(0)==fum );
+		txn.commit();
+		s.close();
+
+		s = openSession();
+		txn = s.beginTransaction();
+		base = s.createCriteria(Fum.class)
+			.add( Restrictions.like("fum", "f%") );
+		base.createCriteria("fo")
+			.add( Restrictions.isNotNull("fum") );
+		base.createCriteria("friends")
+			.add( Restrictions.like("fum", "g%") );
+		fum = (Fum) base.list().get(0);
+		assertTrue(  fum.getFriends().size()==2 );
+		s.delete(fum);
+		s.delete( fum.getFo() );
+		Iterator iter = fum.getFriends().iterator();
+		while ( iter.hasNext() ) {
+			s.delete( iter.next() );
+		}
+		txn.commit();
+		s.close();
+	}
+
+	static public class ABean {
+		public Fum fum;
+		public Fum fo;
+		public Fum getFo() {
+			return fo;
+		}
+		public void setFo(Fum fo) {
+			this.fo = fo;
+		}
+		public Fum getFum() {
+			return fum;
+		}
+		public void setFum(Fum fum) {
+			this.fum = fum;
+		}
+	}
+	
+	public void testBeanResultTransformer() throws HibernateException, SQLException {
+		Session s = openSession();
+		Transaction transaction = s.beginTransaction();
+		Fum fum = new Fum( fumKey("fum") );
+		fum.setFo( new Fum( fumKey("fo") ) );
+		fum.setFum("fo fee fi");
+		fum.getFo().setFum("stuff");
+		Fum fr = new Fum( fumKey("fr") );
+		fr.setFum("goo");
+		Fum fr2 = new Fum( fumKey("fr2") );
+		fr2.setFum("soo");
+		fum.setFriends( new HashSet() );
+		fum.getFriends().add(fr);
+		fum.getFriends().add(fr2);
+		s.save(fr);
+		s.save(fr2);
+		s.save( fum.getFo() );
+		s.save(fum);
+		
+		Criteria test = s.createCriteria(Fum.class, "xam")
+			.createCriteria("fo", "fo")
+			.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
+		
+		Map fc = (Map) test.list().get(0);
+		assertNotNull(fc.get("xam"));
+		
+		Criteria base = s.createCriteria(Fum.class, "fum")
+		.add( Restrictions.like("fum", "f%") )
+		.setResultTransformer(Transformers.aliasToBean(ABean.class))
+		.setFetchMode("friends", FetchMode.JOIN);
+		base.createCriteria("fo", "fo")
+		.add( Restrictions.eq( "fum", fum.getFo().getFum() ) );
+		ABean map = (ABean) base.list().get(0);
+
+		assertTrue(
+				map.getFum()==fum &&
+				map.getFo()==fum.getFo() );
+		
+		s.delete(fr);
+		s.delete(fr2);
+		s.delete(fum);
+		s.delete(fum.getFo());
+		s.flush();
+		transaction.commit();
+		s.close();
+	}
+	
+	
+	public void testListIdentifiers() throws Exception {
+		Session s = openSession();
+		Transaction txn = s.beginTransaction();
+		Fum fum = new Fum( fumKey("fum") );
+		fum.setFum("fo fee fi");
+		s.save(fum);
+		fum = new Fum( fumKey("fi") );
+		fum.setFum("fee fi fo");
+		s.save(fum);
+		List list = s.createQuery( "select fum.id from Fum as fum where not fum.fum='FRIEND'" ).list();
+		assertTrue( "list identifiers", list.size()==2);
+		Iterator iter = s.createQuery( "select fum.id from Fum fum where not fum.fum='FRIEND'" ).iterate();
+		int i=0;
+		while ( iter.hasNext() ) {
+			assertTrue( "iterate identifiers",  iter.next() instanceof FumCompositeID);
+			i++;
+		}
+		assertTrue(i==2);
+
+		s.delete( s.load(Fum.class, (Serializable) list.get(0) ) );
+		s.delete( s.load(Fum.class, (Serializable) list.get(1) ) );
+		txn.commit();
+		s.close();
+	}
+
+
+	public FumCompositeID fumKey(String str) {
+		return fumKey(str,false);
+	}
+
+	private FumCompositeID fumKey(String str, boolean aCompositeQueryTest) {
+		FumCompositeID id = new FumCompositeID();
+		if ( Dialect.getDialect() instanceof MckoiDialect ) {
+			GregorianCalendar now = new GregorianCalendar();
+			GregorianCalendar cal = new GregorianCalendar(
+				now.get(java.util.Calendar.YEAR),
+				now.get(java.util.Calendar.MONTH),
+				now.get(java.util.Calendar.DATE)
+			);
+			id.setDate( cal.getTime() );
+		}
+		else {
+			id.setDate( new Date() );
+		}
+		id.setString( str );
+
+		if (aCompositeQueryTest) {
+			id.setShort( fumKeyShort++ );
+		}
+		else {
+			id.setShort( (short) 12 );
+		}
+
+		return id;
+	}
+
+	public void testCompositeID() throws Exception {
+		Session s = openSession();
+		Transaction txn = s.beginTransaction();
+		Fum fum = new Fum( fumKey("fum") );
+		fum.setFum("fee fi fo");
+		s.save(fum);
+		assertTrue( "load by composite key", fum==s.load( Fum.class, fumKey("fum") ) );
+		txn.commit();
+		s.close();
+
+		s = openSession();
+		txn = s.beginTransaction();
+		fum = (Fum) s.load( Fum.class, fumKey("fum"), LockMode.UPGRADE );
+		assertTrue( "load by composite key", fum!=null );
+
+		Fum fum2 = new Fum( fumKey("fi") );
+		fum2.setFum("fee fo fi");
+		fum.setFo(fum2);
+		s.save(fum2);
+		assertTrue(
+			"find composite keyed objects",
+				s.createQuery( "from Fum fum where not fum.fum='FRIEND'" ).list().size()==2
+		);
+		assertTrue(
+			"find composite keyed object",
+				s.createQuery( "select fum from Fum fum where fum.fum='fee fi fo'" ).list().get(0)==fum
+		);
+		fum.setFo(null);
+		txn.commit();
+		s.close();
+
+		s = openSession();
+		txn = s.beginTransaction();
+		Iterator iter = s.createQuery( "from Fum fum where not fum.fum='FRIEND'" ).iterate();
+		int i = 0;
+		while ( iter.hasNext() ) {
+			fum = (Fum) iter.next();
+			//iter.remove();
+			s.delete(fum);
+			i++;
+		}
+		assertTrue( "iterate on composite key", i==2 );
+		txn.commit();
+		s.close();
+	}
+
+	public void testCompositeIDOneToOne() throws Exception {
+		Session s = openSession();
+		Transaction txn = s.beginTransaction();
+		Fum fum = new Fum( fumKey("fum") );
+		fum.setFum("fee fi fo");
+		//s.save(fum);
+		Fumm fumm = new Fumm();
+		fumm.setFum(fum);
+		s.save(fumm);
+		txn.commit();
+		s.close();
+
+		s = openSession();
+		txn = s.beginTransaction();
+		fumm = (Fumm) s.load( Fumm.class, fumKey("fum") );
+		//s.delete( fumm.getFum() );
+		s.delete(fumm);
+		txn.commit();
+		s.close();
+	}
+
+	public void testCompositeIDQuery() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Fum fee = new Fum( fumKey("fee",true) );
+		fee.setFum("fee");
+		s.save(fee);
+		Fum fi = new Fum( fumKey("fi",true) );
+		fi.setFum("fi");
+		short fiShort = fi.getId().getShort();
+		s.save(fi);
+		Fum fo = new Fum( fumKey("fo",true) );
+		fo.setFum("fo");
+		s.save(fo);
+		Fum fum = new Fum( fumKey("fum",true) );
+		fum.setFum("fum");
+		s.save(fum);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		// Try to find the Fum object "fo" that we inserted searching by the string in the id
+		List vList = s.createQuery( "from Fum fum where fum.id.string='fo'" ).list();
+		assertTrue( "find by composite key query (find fo object)", vList.size() == 1 );
+		fum = (Fum)vList.get(0);
+		assertTrue( "find by composite key query (check fo object)", fum.getId().getString().equals("fo") );
+
+		// Try to find the Fum object "fi" that we inserted searching by the date in the id
+		vList = s.createQuery( "from Fum fum where fum.id.short = ?" )
+				.setParameter( 0, new Short(fiShort), Hibernate.SHORT )
+				.list();
+		assertEquals( "find by composite key query (find fi object)", 1, vList.size() );
+		fi = (Fum)vList.get(0);
+		assertEquals( "find by composite key query (check fi object)", "fi", fi.getId().getString() );
+
+		// Make sure we can return all of the objects by searching by the date id
+		vList = s.createQuery( "from Fum fum where fum.id.date <= ? and not fum.fum='FRIEND'" )
+				.setParameter( 0, new Date(), Hibernate.DATE )
+				.list();
+		assertEquals( "find by composite key query with arguments", 4, vList.size() );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		assertTrue(
+				s.createQuery( "select fum.id.short, fum.id.date, fum.id.string from Fum fum" ).iterate().hasNext()
+		);
+		assertTrue(
+				s.createQuery( "select fum.id from Fum fum" ).iterate().hasNext()
+		);
+		Query qu = s.createQuery("select fum.fum, fum , fum.fum, fum.id.date from Fum fum");
+		Type[] types = qu.getReturnTypes();
+		assertTrue(types.length==4);
+		for ( int k=0; k<types.length; k++) {
+			assertTrue( types[k]!=null );
+		}
+		assertTrue(types[0] instanceof StringType);
+		assertTrue(types[1] instanceof EntityType);
+		assertTrue(types[2] instanceof StringType);
+		assertTrue(types[3] instanceof DateType);
+		Iterator iter = qu.iterate();
+		int j = 0;
+		while ( iter.hasNext() ) {
+			j++;
+			assertTrue( ( (Object[]) iter.next() )[1] instanceof Fum );
+		}
+		assertTrue( "iterate on composite key", j==8 );
+
+		fum = (Fum) s.load( Fum.class, fum.getId() );
+		s.createFilter( fum.getQuxArray(), "where this.foo is null" ).list();
+		s.createFilter( fum.getQuxArray(), "where this.foo.id = ?" )
+				.setParameter( 0, "fooid", Hibernate.STRING )
+				.list();
+		Query f = s.createFilter( fum.getQuxArray(), "where this.foo.id = :fooId" );
+		f.setString("fooId", "abc");
+		assertFalse( f.iterate().hasNext() );
+
+		iter = s.createQuery( "from Fum fum where not fum.fum='FRIEND'" ).iterate();
+		int i = 0;
+		while ( iter.hasNext() ) {
+			fum = (Fum) iter.next();
+			s.delete(fum);
+			i++;
+		}
+		assertTrue( "iterate on composite key", i==4 );
+		s.flush();
+
+		s.createQuery( "from Fum fu, Fum fo where fu.fo.id.string = fo.id.string and fo.fum is not null" ).iterate();
+
+		s.createQuery( "from Fumm f1 inner join f1.fum f2" ).list();
+
+		s.getTransaction().commit();
+		s.close();
+	}
+
+
+	public void testCompositeIDCollections() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Fum fum1 = new Fum( fumKey("fum1") );
+		Fum fum2 = new Fum( fumKey("fum2") );
+		fum1.setFum("fee fo fi");
+		fum2.setFum("fee fo fi");
+		s.save(fum1);
+		s.save(fum2);
+		Qux q = new Qux();
+		s.save(q);
+		Set set = new HashSet();
+		List list = new ArrayList();
+		set.add(fum1); set.add(fum2);
+		list.add(fum1);
+		q.setFums(set);
+		q.setMoreFums(list);
+		fum1.setQuxArray( new Qux[] {q} );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		q = (Qux) s.load( Qux.class, q.getKey() );
+		assertTrue( "collection of fums", q.getFums().size()==2 );
+		assertTrue( "collection of fums", q.getMoreFums().size()==1 );
+		assertTrue( "unkeyed composite id collection", ( (Fum) q.getMoreFums().get(0) ).getQuxArray()[0]==q );
+		Iterator iter = q.getFums().iterator();
+		iter.hasNext();
+		Fum f = (Fum) iter.next();
+		s.delete(f);
+		iter.hasNext();
+		f = (Fum) iter.next();
+		s.delete(f);
+		s.delete(q);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+
+	public void testDeleteOwner() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Qux q = new Qux();
+		s.save(q);
+		Fum f1 = new Fum( fumKey("f1") );
+		Fum f2 = new Fum( fumKey("f2") );
+		Set set = new HashSet();
+		set.add(f1);
+		set.add(f2);
+		List list = new LinkedList();
+		list.add(f1);
+		list.add(f2);
+		f1.setFum("f1");
+		f2.setFum("f2");
+		q.setFums(set);
+		q.setMoreFums(list);
+		s.save(f1);
+		s.save(f2);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		q = (Qux) s.load( Qux.class, q.getKey(), LockMode.UPGRADE );
+		s.lock( q, LockMode.UPGRADE );
+		s.delete(q);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		list = s.createQuery( "from Fum fum where not fum.fum='FRIEND'" ).list();
+		assertTrue( "deleted owner", list.size()==2 );
+		s.lock( list.get(0), LockMode.UPGRADE );
+		s.lock( list.get(1), LockMode.UPGRADE );
+		Iterator iter = list.iterator();
+		while ( iter.hasNext() ) {
+			s.delete( iter.next() );
+		}
+		s.getTransaction().commit();
+		s.close();
+	}
+
+
+	public void testCompositeIDs() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Fo fo = Fo.newFo();
+		Properties props = new Properties();
+		props.setProperty("foo", "bar");
+		props.setProperty("bar", "foo");
+		fo.setSerial(props);
+		fo.setBuf( "abcdefghij1`23%$*^*$*\n\t".getBytes() );
+		s.save( fo, fumKey("an instance of fo") );
+		s.flush();
+		props.setProperty("x", "y");
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		fo = (Fo) s.load( Fo.class, fumKey("an instance of fo") );
+		props = (Properties) fo.getSerial();
+		assertTrue( props.getProperty("foo").equals("bar") );
+		//assertTrue( props.contains("x") );
+		assertTrue( props.getProperty("x").equals("y") );
+		assertTrue( fo.getBuf()[0]=='a' );
+		fo.getBuf()[1]=(byte)126;
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		fo = (Fo) s.load( Fo.class, fumKey("an instance of fo") );
+		assertTrue( fo.getBuf()[1]==126 );
+		assertTrue(
+				s.createQuery( "from Fo fo where fo.id.string like 'an instance of fo'" ).iterate().next()==fo
+		);
+		s.delete(fo);
+		s.flush();
+		try {
+			s.save( Fo.newFo() );
+			assertTrue(false);
+		}
+		catch (Exception e) {
+			//System.out.println( e.getMessage() );
+		}
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testKeyManyToOne() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Inner sup = new Inner();
+		InnerKey sid = new InnerKey();
+		sup.setDudu("dudu");
+		sid.setAkey("a");
+		sid.setBkey("b");
+		sup.setId(sid);
+		Middle m = new Middle();
+		MiddleKey mid = new MiddleKey();
+		mid.setOne("one");
+		mid.setTwo("two");
+		mid.setSup(sup);
+		m.setId(mid);
+		m.setBla("bla");
+		Outer d = new Outer();
+		OuterKey did = new OuterKey();
+		did.setMaster(m);
+		did.setDetailId("detail");
+		d.setId(did);
+		d.setBubu("bubu");
+		s.save(sup);
+		s.save(m);
+		s.save(d);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		Inner in = (Inner) s.createQuery( "from Inner" ).list().get(0);
+		assertTrue( in.getMiddles().size()==1 );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		assertTrue( s.createQuery( "from Inner _inner join _inner.middles middle" ).list().size()==1 );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		d = (Outer) s.load(Outer.class, did);
+		assertTrue( d.getId().getMaster().getId().getSup().getDudu().equals("dudu") );
+		s.delete(d);
+		s.delete( d.getId().getMaster() );
+		s.save( d.getId().getMaster() );
+		s.save(d);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		d = (Outer) s.createQuery( "from Outer o where o.id.detailId = ?" )
+				.setParameter( 0, d.getId().getDetailId(), Hibernate.STRING )
+				.list()
+				.get(0);
+		s.createQuery( "from Outer o where o.id.master.id.sup.dudu is not null" ).list();
+		s.createQuery( "from Outer o where o.id.master.id.sup.id.akey is not null" ).list();
+		s.createQuery( "from Inner i where i.backOut.id.master.id.sup.id.akey = i.id.bkey" ).list();
+		List l = s.createQuery( "select o.id.master.id.sup.dudu from Outer o where o.id.master.id.sup.dudu is not null" )
+				.list();
+		assertTrue(l.size()==1);
+		l = s.createQuery( "select o.id.master.id.sup.id.akey from Outer o where o.id.master.id.sup.id.akey is not null" )
+				.list();
+		assertTrue(l.size()==1);
+		s.createQuery(
+				"select i.backOut.id.master.id.sup.id.akey from Inner i where i.backOut.id.master.id.sup.id.akey = i.id.bkey"
+		).list();
+		s.createQuery( "from Outer o where o.id.master.bla = ''" ).list();
+		s.createQuery( "from Outer o where o.id.master.id.one = ''" ).list();
+		s.createQuery( "from Inner inn where inn.id.bkey is not null and inn.backOut.id.master.id.sup.id.akey > 'a'" )
+				.list();
+		s.createQuery( "from Outer as o left join o.id.master m left join m.id.sup where o.bubu is not null" ).list();
+		s.createQuery( "from Outer as o left join o.id.master.id.sup s where o.bubu is not null" ).list();
+		s.createQuery( "from Outer as o left join o.id.master m left join o.id.master.id.sup s where o.bubu is not null" )
+				.list();
+		s.delete(d);
+		s.delete( d.getId().getMaster() );
+		s.delete( d.getId().getMaster().getId().getSup() );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testCompositeKeyPathExpressions() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		s.createQuery( "select fum1.fo from Fum fum1 where fum1.fo.fum is not null" ).list();
+		s.createQuery( "from Fum fum1 where fum1.fo.fum is not null order by fum1.fo.fum" ).list();
+		if ( !(getDialect() instanceof MySQLDialect) && !(getDialect() instanceof HSQLDialect) && !(getDialect() instanceof MckoiDialect) && !(getDialect() instanceof PointbaseDialect) ) {
+			s.createQuery( "from Fum fum1 where exists elements(fum1.friends)" ).list();
+			if(!(getDialect() instanceof TimesTenDialect)) { // can't execute because TimesTen can't do subqueries combined with aggreations
+				s.createQuery( "from Fum fum1 where size(fum1.friends) = 0" ).list();
+			}
+		}
+		s.createQuery( "select elements(fum1.friends) from Fum fum1" ).list();
+		s.createQuery( "from Fum fum1, fr in elements( fum1.friends )" ).list();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testUnflushedSessionSerialization() throws Exception {
+		///////////////////////////////////////////////////////////////////////////
+		// Test insertions across serializations
+		Session s = getSessions().openSession();
+		s.setFlushMode(FlushMode.MANUAL);
+
+		Simple simple = new Simple();
+		simple.setAddress("123 Main St. Anytown USA");
+		simple.setCount(1);
+		simple.setDate( new Date() );
+		simple.setName("My UnflushedSessionSerialization Simple");
+		simple.setPay( new Float(5000) );
+		s.save( simple, new Long(10) );
+
+		// Now, try to serialize session without flushing...
+		s.disconnect();
+		Session s2 = spoofSerialization(s);
+		s.close();
+		s = s2;
+		s.reconnect();
+
+		simple = (Simple) s.load( Simple.class, new Long(10) );
+		Simple other = new Simple();
+		other.init();
+		s.save( other, new Long(11) );
+
+		simple.setOther(other);
+		s.flush();
+
+		s.connection().commit();
+		s.close();
+		Simple check = simple;
+
+		///////////////////////////////////////////////////////////////////////////
+		// Test updates across serializations
+		s = getSessions().openSession();
+		s.setFlushMode(FlushMode.MANUAL);
+
+		simple = (Simple) s.get( Simple.class, new Long(10) );
+		assertTrue("Not same parent instances", check.getName().equals( simple.getName() ) );
+		assertTrue("Not same child instances", check.getOther().getName().equals( other.getName() ) );
+
+		simple.setName("My updated name");
+
+		s.disconnect();
+		s2 = spoofSerialization(s);
+		s.close();
+		s = s2;
+		s.reconnect();
+		s.flush();
+
+		s.connection().commit();
+		s.close();
+		check = simple;
+
+		///////////////////////////////////////////////////////////////////////////
+		// Test deletions across serializations
+		s = getSessions().openSession();
+		s.setFlushMode(FlushMode.MANUAL);
+
+		simple = (Simple) s.get( Simple.class, new Long(10) );
+		assertTrue("Not same parent instances", check.getName().equals( simple.getName() ) );
+		assertTrue("Not same child instances", check.getOther().getName().equals( other.getName() ) );
+
+		// Now, lets delete across serialization...
+		s.delete(simple);
+
+		s.disconnect();
+		s2 = spoofSerialization(s);
+		s.close();
+		s = s2;
+		s.reconnect();
+		s.flush();
+
+		s.connection().commit();
+		s.close();
+
+		///////////////////////////////////////////////////////////////////////////
+		// Test collection actions across serializations
+		s = getSessions().openSession();
+		s.setFlushMode(FlushMode.MANUAL);
+
+		Fum fum = new Fum( fumKey("uss-fum") );
+		fum.setFo( new Fum( fumKey("uss-fo") ) );
+		fum.setFum("fo fee fi");
+		fum.getFo().setFum("stuff");
+		Fum fr = new Fum( fumKey("uss-fr") );
+		fr.setFum("goo");
+		Fum fr2 = new Fum( fumKey("uss-fr2") );
+		fr2.setFum("soo");
+		fum.setFriends( new HashSet() );
+		fum.getFriends().add(fr);
+		fum.getFriends().add(fr2);
+		s.save(fr);
+		s.save(fr2);
+		s.save( fum.getFo() );
+		s.save(fum);
+
+		s.disconnect();
+		s2 = spoofSerialization(s);
+		s.close();
+		s = s2;
+		s.reconnect();
+		s.flush();
+
+		s.connection().commit();
+		s.close();
+
+		s = getSessions().openSession();
+		s.setFlushMode(FlushMode.MANUAL);
+		fum = (Fum) s.load( Fum.class, fum.getId() );
+
+		assertTrue("the Fum.friends did not get saved", fum.getFriends().size() == 2);
+
+		fum.setFriends(null);
+		s.disconnect();
+		s2 = spoofSerialization(s);
+		s.close();
+		
+		s = s2;
+		s.reconnect();
+		s.flush();
+
+		s.connection().commit();
+		s.close();
+
+		s = getSessions().openSession();
+		s.setFlushMode(FlushMode.MANUAL);
+		fum = (Fum) s.load( Fum.class, fum.getId() );
+		assertTrue("the Fum.friends is not empty", fum.getFriends() == null || fum.getFriends().size() == 0);
+		s.connection().commit();
+		s.close();
+	}
+
+	private Session spoofSerialization(Session session) throws IOException {
+		try {
+			// Serialize the incoming out to memory
+			ByteArrayOutputStream serBaOut = new ByteArrayOutputStream();
+			ObjectOutputStream serOut = new ObjectOutputStream(serBaOut);
+
+			serOut.writeObject(session);
+
+			// Now, re-constitute the model from memory
+			ByteArrayInputStream serBaIn =
+			        new ByteArrayInputStream(serBaOut.toByteArray());
+			ObjectInputStream serIn = new ObjectInputStream(serBaIn);
+
+			Session outgoing = (Session) serIn.readObject();
+
+			return outgoing;
+		}
+		catch (ClassNotFoundException cnfe) {
+			throw new IOException("Unable to locate class on reconstruction");
+		}
+	}
+
+}
+
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/FumTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fumm.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fumm.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fumm.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-lazy="false">
+
+	<class name="org.hibernate.test.legacy.Fumm">
+		<composite-id name="id">
+			<key-property name="string">
+				<column name="string_" length="10"/>
+			</key-property>
+			<key-property name="short" column="short_"/>
+			<key-property name="date" column="date_" type="date"/>
+		</composite-id>
+		<property name="locale"/>
+		<one-to-one name="fum" cascade="all" constrained="true"/>
+	</class>
+	
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fumm.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fumm.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fumm.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fumm.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,59 @@
+//$Id: Fumm.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.util.Locale;
+
+public class Fumm {
+	
+	private Locale locale;
+	private Fum fum;
+	
+	public FumCompositeID getId() {
+		return fum.getId();
+	}
+	public void setId(FumCompositeID id) {
+	}
+	
+	public Fumm() {
+		super();
+	}
+	
+	/**
+	 * Returns the fum.
+	 * @return Fum
+	 */
+	public Fum getFum() {
+		return fum;
+	}
+	
+	/**
+	 * Returns the locale.
+	 * @return Locale
+	 */
+	public Locale getLocale() {
+		return locale;
+	}
+	
+	/**
+	 * Sets the fum.
+	 * @param fum The fum to set
+	 */
+	public void setFum(Fum fum) {
+		this.fum = fum;
+	}
+	
+	/**
+	 * Sets the locale.
+	 * @param locale The locale to set
+	 */
+	public void setLocale(Locale locale) {
+		this.locale = locale;
+	}
+	
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Fumm.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Glarch.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Glarch.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Glarch.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,65 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-lazy="false" package="org.hibernate.test.legacy">
+
+    <class name="Glarch"
+    	table="`glarchez`"
+    	proxy="GlarchProxy"
+    	dynamic-update="true">
+
+        <!--cache-->
+        <id type="string" column="tha_key" length="32">
+            <generator class="uuid"/>
+        </id>
+        <version name="version"/>
+        <property name="name" column="namecvbnmasdf"/>
+        <!-- <property name="currency"/> -->
+        <many-to-one name="next" column="next_" class="Glarch"/>
+        <property name="order" column="order_"/>
+        <dynamic-component name="dynaBean">
+        	<property name="foo" type="string"/>
+        	<property name="bar" type="integer"/>
+        </dynamic-component>
+        <property name="x"/>
+        <list name="strings">
+            <key column="glarch_key"/>
+            <index column="`indx_`"/>
+            <element type="string" column="`tha_stryng`"/>
+        </list>
+        <list name="fooComponents" lazy="true" cascade="all">
+            <key column="glarch_key"/>
+            <index column="tha_indecks"/>
+            <composite-element class="FooComponent">
+                <property name="name" column="name_"/>
+                <property name="count" column="count_"/>
+                <nested-composite-element name="subcomponent" class="FooComponent">
+                    <property name="name" column="x_"/>
+                    <property name="count" column="y_"/>
+                </nested-composite-element>
+                <many-to-one name="fee" cascade="all" outer-join="true"/>
+            </composite-element>
+        </list>
+        <array name="proxyArray" element-class="GlarchProxy">
+        	<key column="array_key"/>
+        	<index column="array_indecks"/>
+        	<one-to-many class="org.hibernate.test.legacy.Glarch"/>
+        </array>
+        <set name="proxySet">
+        	<key column="set_key"/>
+        	<one-to-many class="Glarch"/>
+        </set>
+        <property name="immutable" update="false" not-null="true"/>
+        <property name="derivedVersion" insert="false" update="false" column="version"/>
+        <property name="any" type="object">
+        	<column name="`any_id_of_object`"/>
+        	<column name="`any_class_of_object`"/>
+        </property>
+        <property name="multiple" type="org.hibernate.test.legacy.MultiplicityType">
+        	<column name="count_"/>
+        	<column name="glarch_"/>
+        </property>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Glarch.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Glarch.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Glarch.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Glarch.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,216 @@
+//$Id: Glarch.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.hibernate.CallbackException;
+import org.hibernate.Session;
+import org.hibernate.classic.Lifecycle;
+
+public class Glarch extends Super implements GlarchProxy, Lifecycle, Named, Serializable {
+
+	private int version;
+	private GlarchProxy next;
+	private short order;
+	private List strings;
+	private Map stringSets;
+	private List fooComponents;
+	private GlarchProxy[] proxyArray;
+	private Set proxySet;
+	//private Currency currency = Currency.getInstance( Locale.getDefault() );
+	private transient Map dynaBean;
+	private String immutable;
+	private int derivedVersion;
+	private Object any;
+	private int x;
+	private Multiplicity multiple;
+
+	public int getX() {
+		return x;
+	}
+	public void setX(int x) {
+		this.x = x;
+	}
+
+	public int getVersion() {
+		return version;
+	}
+
+	public void setVersion(int version) {
+		this.version = version;
+	}
+
+	public GlarchProxy getNext() {
+		return next;
+	}
+	public void setNext(GlarchProxy next) {
+		this.next = next;
+	}
+
+	public short getOrder() {
+		return order;
+	}
+	public void setOrder(short order) {
+		this.order = order;
+	}
+
+	public List getStrings() {
+		return strings;
+	}
+
+	public void setStrings(List strings) {
+		this.strings = strings;
+	}
+
+	public Map getStringSets() {
+		return stringSets;
+	}
+
+	public void setStringSets(Map stringSets) {
+		this.stringSets = stringSets;
+	}
+
+	public List getFooComponents() {
+		return fooComponents;
+	}
+
+	public void setFooComponents(List fooComponents) {
+		this.fooComponents = fooComponents;
+	}
+
+	public GlarchProxy[] getProxyArray() {
+		return proxyArray;
+	}
+	public void setProxyArray(GlarchProxy[] proxyArray) {
+		this.proxyArray = proxyArray;
+	}
+	public Set getProxySet() {
+		return proxySet;
+	}
+
+	public void setProxySet(Set proxySet) {
+		this.proxySet = proxySet;
+	}
+
+	public boolean onDelete(Session s) throws CallbackException {
+		return NO_VETO;
+	}
+
+	public void onLoad(Session s, Serializable id) {
+		if ( ! ( ( (String) id ).length()==32 ) ) throw new RuntimeException("id problem");
+	}
+
+	public boolean onSave(Session s) throws CallbackException {
+		dynaBean = new HashMap();
+		dynaBean.put("foo", "foo");
+		dynaBean.put("bar", new Integer(66));
+		immutable="never changes!";
+		return NO_VETO;
+	}
+
+	public boolean onUpdate(Session s) throws CallbackException {
+		return NO_VETO;
+	}
+
+	/*public Currency getCurrency() {
+		return currency;
+	}
+
+	public void setCurrency(Currency currency) {
+		this.currency = currency;
+	}*/
+
+	/**
+	 * Returns the dynaBean.
+	 * @return DynaBean
+	 */
+	public Map getDynaBean() {
+		return dynaBean;
+	}
+
+	/**
+	 * Sets the dynaBean.
+	 * @param dynaBean The dynaBean to set
+	 */
+	public void setDynaBean(Map dynaBean) {
+		this.dynaBean = dynaBean;
+	}
+
+	/**
+	 * Returns the immutable.
+	 * @return String
+	 */
+	public String getImmutable() {
+		return immutable;
+	}
+
+	/**
+	 * Sets the immutable.
+	 * @param immutable The immutable to set
+	 */
+	public void setImmutable(String immutable) {
+		this.immutable = immutable;
+	}
+
+	/**
+	 * Returns the derivedVersion.
+	 * @return int
+	 */
+	public int getDerivedVersion() {
+		return derivedVersion;
+	}
+
+	/**
+	 * Sets the derivedVersion.
+	 * @param derivedVersion The derivedVersion to set
+	 */
+	public void setDerivedVersion(int derivedVersion) {
+		this.derivedVersion = derivedVersion;
+	}
+
+	/**
+	 * Returns the any.
+	 * @return Object
+	 */
+	public Object getAny() {
+		return any;
+	}
+
+	/**
+	 * Sets the any.
+	 * @param any The any to set
+	 */
+	public void setAny(Object any) {
+		this.any = any;
+	}
+
+	/**
+	 * @return
+	 */
+	public Multiplicity getMultiple() {
+		return multiple;
+	}
+
+	/**
+	 * @param multiplicity
+	 */
+	public void setMultiple(Multiplicity multiplicity) {
+		multiple = multiplicity;
+	}
+
+	public String getName() {
+		return super.getName();
+	}
+
+}
+
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Glarch.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/GlarchProxy.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/GlarchProxy.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/GlarchProxy.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,52 @@
+package org.hibernate.test.legacy;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public interface GlarchProxy {
+	
+	public int getVersion();
+	public int getDerivedVersion();
+	public void setVersion(int version);
+	
+	public String getName();
+	public void setName(String name);
+	
+	public GlarchProxy getNext();
+	public void setNext(GlarchProxy next);
+	
+	public short getOrder();
+	public void setOrder(short order);
+	
+	public List getStrings();
+	public void setStrings(List strings);
+	
+	public Map getDynaBean();
+	public void setDynaBean(Map bean);
+	
+	public Map getStringSets();
+	public void setStringSets(Map stringSets);
+	
+	public List getFooComponents();
+	public void setFooComponents(List fooComponents);
+	
+	public GlarchProxy[] getProxyArray();
+	public void setProxyArray(GlarchProxy[] proxyArray);
+	
+	public Set getProxySet();
+	public void setProxySet(Set proxySet);
+	
+	public Multiplicity getMultiple();
+	public void setMultiple(Multiplicity m);
+	
+	public Object getAny();
+	public void setAny(Object any);
+}
+
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/GlarchProxy.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Holder.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Holder.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Holder.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-lazy="false">
+	<class name="org.hibernate.test.legacy.Holder">
+		<id name="id" column="id_" type="string" length="32" unsaved-value="null">
+			<generator class="uuid.hex"/>
+		</id>
+		<property name="name" unique="true" not-null="true" length="36"/>
+		<list name="ones">
+			<key column="holder"/>
+			<index column="i"/>
+			<one-to-many class="org.hibernate.test.legacy.One"/>
+		</list>
+		<array name="fooArray">
+			<key column="holder1"/>
+			<index column="j1"/>
+			<one-to-many class="org.hibernate.test.legacy.Foo"/>
+		</array>
+		<set name="foos">
+			<key column="holder2"/>
+			<one-to-many class="org.hibernate.test.legacy.Foo"/>
+		</set>
+		<many-to-one name="otherHolder" property-ref="name" cascade="all"/>
+	</class>
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Holder.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Holder.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Holder.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Holder.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,115 @@
+//$Id: Holder.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.util.List;
+import java.util.Set;
+
+public class Holder implements Named {
+	private String id;
+	private List ones;
+	private Foo[] fooArray;
+	private Set foos;
+	private String name;
+	private Holder otherHolder;
+	
+	public Holder() {
+	}
+	public Holder(String name) {
+		this.name=name;
+	}
+	
+	/**
+	 * Returns the fooArray.
+	 * @return Foo[]
+	 */
+	public Foo[] getFooArray() {
+		return fooArray;
+	}
+	
+	/**
+	 * Returns the foos.
+	 * @return Set
+	 */
+	public Set getFoos() {
+		return foos;
+	}
+	
+	/**
+	 * Sets the fooArray.
+	 * @param fooArray The fooArray to set
+	 */
+	public void setFooArray(Foo[] fooArray) {
+		this.fooArray = fooArray;
+	}
+	
+	/**
+	 * Sets the foos.
+	 * @param foos The foos to set
+	 */
+	public void setFoos(Set foos) {
+		this.foos = foos;
+	}
+	
+	/**
+	 * Returns the id.
+	 * @return String
+	 */
+	public String getId() {
+		return id;
+	}
+	
+	/**
+	 * Sets the id.
+	 * @param id The id to set
+	 */
+	public void setId(String id) {
+		this.id = id;
+	}
+	
+	/**
+	 * Returns the name.
+	 * @return String
+	 */
+	public String getName() {
+		return name;
+	}
+	
+	/**
+	 * Sets the name.
+	 * @param name The name to set
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	/**
+	 * Returns the ones.
+	 * @return List
+	 */
+	public List getOnes() {
+		return ones;
+	}
+	
+	/**
+	 * Sets the ones.
+	 * @param ones The ones to set
+	 */
+	public void setOnes(List ones) {
+		this.ones = ones;
+	}
+	
+	public Holder getOtherHolder() {
+		return otherHolder;
+	}
+
+	public void setOtherHolder(Holder holder) {
+		otherHolder = holder;
+	}
+
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Holder.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/I.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/I.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/I.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,36 @@
+//$Id: I.java 7203 2005-06-19 02:01:05Z oneovthafew $
+package org.hibernate.test.legacy;
+
+/**
+ * @author Gavin King
+ */
+public class I {
+	private Long id;
+	private String name;
+	private char type;
+	private K parent;
+	
+	public K getParent() {
+		return parent;
+	}
+	
+	public void setParent(K parent) {
+		this.parent = parent;
+	}
+
+	void setType(char type) {
+		this.type = type;
+	}
+
+	char getType() {
+		return type;
+	}
+
+	void setName(String name) {
+		this.name = name;
+	}
+
+	String getName() {
+		return name;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/I.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/IJ.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/IJ.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/IJ.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-lazy="false" 
+	package="org.hibernate.test.legacy" 
+	default-access="field">
+
+	<class name="I" discriminator-value="0">
+		<id name="id">
+			<generator class="increment"/>
+		</id>
+		
+		<discriminator formula="case when type_ in ('a', 'b', 'c') then 0 else 1 end" type="integer"/>
+		
+		<property name="name" unique="true" not-null="true"/>
+		<property name="type" column="type_" not-null="true"/>
+		
+		<subclass name="J" discriminator-value="1">
+			<property name="amount"/>
+		</subclass>
+	</class>
+	
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/IJ.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/IJ2.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/IJ2.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/IJ2.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-lazy="false" 
+	package="org.hibernate.test.legacy" 
+	default-access="field">
+
+	<class name="I">
+		<id name="id">
+			<generator class="hilo"/>
+		</id>
+		<property name="name" unique="true" not-null="true"/>
+		<property name="type" column="type_"/>
+		<many-to-one name="parent" cascade="save-update"/>
+		<union-subclass name="J">
+			<property name="amount"/>
+		</union-subclass>
+	</class>
+	
+	<class name="K">
+		<id name="id">
+			<generator class="hilo"/>
+		</id>
+		<set name="is" inverse="true">
+			<key column="parent"/>
+			<one-to-many class="I"/>
+		</set>
+	</class>
+	
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/IJ2.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/IJ2Test.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/IJ2Test.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/IJ2Test.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,129 @@
+//$Id: IJ2Test.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+
+import junit.framework.Test;
+
+import org.hibernate.LockMode;
+import org.hibernate.classic.Session;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class IJ2Test extends LegacyTestCase {
+
+	public IJ2Test(String x) {
+		super(x);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "legacy/IJ2.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( IJ2Test.class );
+	}
+
+	public void testUnionSubclass() throws Exception {
+		Session s = getSessions().openSession();
+		I i = new I();
+		i.setName( "i" );
+		i.setType( 'a' );
+		J j = new J();
+		j.setName( "j" );
+		j.setType( 'x' );
+		j.setAmount( 1.0f );
+		Serializable iid = s.save(i);
+		Serializable jid = s.save(j);
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		getSessions().evict(I.class);
+
+		s = getSessions().openSession();
+		j = (J) s.get(I.class, jid);
+		j = (J) s.get(J.class, jid);
+		i = (I) s.get(I.class, iid);
+		assertTrue( i.getClass()==I.class );
+		j.setAmount( 0.5f );
+		s.lock(i, LockMode.UPGRADE);
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		getSessions().evict(I.class);
+
+		s = getSessions().openSession();
+		j = (J) s.get(J.class, jid);
+		j = (J) s.get(I.class, jid);
+		i = (I) s.get(I.class, iid);
+		assertTrue( i.getClass()==I.class );
+		j.setAmount( 0.5f );
+		s.lock(i, LockMode.UPGRADE);
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		getSessions().evict(I.class);
+
+		s = getSessions().openSession();
+		assertTrue( s.createQuery( "from I" ).list().size()==2 );
+		assertTrue( s.createQuery( "from J" ).list().size()==1 );
+		assertTrue( s.createQuery( "from J j where j.amount > 0 and j.name is not null" ).list().size()==1 );
+		assertTrue( s.createQuery( "from I i where i.class = org.hibernate.test.legacy.I" ).list().size()==1 );
+		assertTrue( s.createQuery( "from I i where i.class = J" ).list().size()==1 );
+		s.connection().commit();
+		s.close();
+
+		getSessions().evict(I.class);
+
+		s = getSessions().openSession();
+		j = (J) s.get(J.class, jid);
+		i = (I) s.get(I.class, iid);
+		K k = new K();
+		Serializable kid = s.save(k);
+		i.setParent(k);
+		j.setParent(k);
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		getSessions().evict(I.class);
+
+		s = getSessions().openSession();
+		j = (J) s.get(J.class, jid);
+		i = (I) s.get(I.class, iid);
+		k = (K) s.get(K.class, kid);
+		System.out.println(k + "=" + i.getParent());
+		assertTrue( i.getParent()==k );
+		assertTrue( j.getParent()==k );
+		assertTrue( k.getIs().size()==2 );
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		getSessions().evict(I.class);
+
+		s = getSessions().openSession();
+		assertTrue( s.createQuery( "from K k inner join k.is i where i.name = 'j'" ).list().size()==1 );
+		assertTrue( s.createQuery( "from K k inner join k.is i where i.name = 'i'" ).list().size()==1 );
+		assertTrue( s.createQuery( "from K k left join fetch k.is" ).list().size()==2 );
+		s.connection().commit();
+		s.close();
+
+		s = getSessions().openSession();
+		j = (J) s.get(J.class, jid);
+		i = (I) s.get(I.class, iid);
+		k = (K) s.get(K.class, kid);
+		s.delete(k);
+		s.delete(j);
+		s.delete(i);
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/IJ2Test.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/IJTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/IJTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/IJTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,83 @@
+//$Id: IJTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+
+import junit.framework.Test;
+
+import org.hibernate.LockMode;
+import org.hibernate.classic.Session;
+import org.hibernate.dialect.HSQLDialect;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class IJTest extends LegacyTestCase {
+
+	public IJTest(String x) {
+		super(x);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "legacy/IJ.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( IJTest.class );
+	}
+
+	public void testFormulaDiscriminator() throws Exception {
+		if ( getDialect() instanceof HSQLDialect ) return;
+		Session s = getSessions().openSession();
+		I i = new I();
+		i.setName( "i" );
+		i.setType( 'a' );
+		J j = new J();
+		j.setName( "j" );
+		j.setType( 'x' );
+		j.setAmount( 1.0f );
+		Serializable iid = s.save(i);
+		Serializable jid = s.save(j);
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		getSessions().evict(I.class);
+
+		s = getSessions().openSession();
+		j = (J) s.get(I.class, jid);
+		i = (I) s.get(I.class, iid);
+		assertTrue( i.getClass()==I.class );
+		j.setAmount( 0.5f );
+		s.lock(i, LockMode.UPGRADE);
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		s = getSessions().openSession();
+		j = (J) s.get(I.class, jid, LockMode.UPGRADE);
+		i = (I) s.get(I.class, iid, LockMode.UPGRADE);
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		s = getSessions().openSession();
+		assertTrue( s.createQuery( "from I" ).list().size()==2 );
+		assertTrue( s.createQuery( "from J" ).list().size()==1 );
+		assertTrue( s.createQuery( "from I i where i.class = 0" ).list().size()==1 );
+		assertTrue( s.createQuery( "from I i where i.class = 1" ).list().size()==1 );
+		s.connection().commit();
+		s.close();
+
+		s = getSessions().openSession();
+		j = (J) s.get(J.class, jid);
+		i = (I) s.get(I.class, iid);
+		s.delete(j);
+		s.delete(i);
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/IJTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Immutable.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Immutable.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Immutable.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-lazy="false">
+	
+	<class name="org.hibernate.test.legacy.Immutable" table="immut" mutable="false">
+		<!--cache-->
+		<id name="id" column="id_" length="64">
+			<generator class="uuid"/>
+		</id>
+		<property name="foo"/>
+		<property name="bar"/>
+	</class>
+	
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Immutable.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Immutable.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Immutable.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Immutable.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,39 @@
+//$Id: Immutable.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+public class Immutable {
+	private String foo;
+	private String bar;
+	private String id;
+	
+	public String getFoo() {
+		return foo;
+	}
+	
+	public void setFoo(String foo) {
+		this.foo = foo;
+	}
+	
+	public String getBar() {
+		return bar;
+	}
+	
+	public void setBar(String bar) {
+		this.bar = bar;
+	}
+	
+	public String getId() {
+		return id;
+	}
+	
+	public void setId(String id) {
+		this.id = id;
+	}
+	
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Immutable.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Inner.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Inner.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Inner.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,61 @@
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author Stefano Travelli
+ */
+public class Inner implements Serializable {
+	private InnerKey id;
+	private String dudu;
+	private List middles;
+	private Outer backOut;
+
+	public InnerKey getId() {
+		return id;
+	}
+
+	public void setId(InnerKey id) {
+		this.id = id;
+	}
+
+	public String getDudu() {
+		return dudu;
+	}
+
+	public void setDudu(String dudu) {
+		this.dudu = dudu;
+	}
+
+	public boolean equals(Object o) {
+		if (this == o) return true;
+		if (!(o instanceof Inner)) return false;
+
+		final Inner cidSuper = (Inner) o;
+
+		if (id != null ? !id.equals(cidSuper.id) : cidSuper.id != null) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		return (id != null ? id.hashCode() : 0);
+	}
+	public List getMiddles() {
+		return middles;
+	}
+
+	public void setMiddles(List list) {
+		middles = list;
+	}
+
+	public Outer getBackOut() {
+		return backOut;
+	}
+
+	public void setBackOut(Outer outer) {
+		backOut = outer;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Inner.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/InnerKey.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/InnerKey.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/InnerKey.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,46 @@
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+
+/**
+ * @author Stefano Travelli
+ */
+public class InnerKey implements Serializable {
+	private String akey;
+	private String bkey;
+
+	public String getAkey() {
+		return akey;
+	}
+
+	public void setAkey(String akey) {
+		this.akey = akey;
+	}
+
+	public String getBkey() {
+		return bkey;
+	}
+
+	public void setBkey(String bkey) {
+		this.bkey = bkey;
+	}
+
+	public boolean equals(Object o) {
+		if (this == o) return true;
+		if (!(o instanceof InnerKey)) return false;
+
+		final InnerKey cidSuperID = (InnerKey) o;
+
+		if (akey != null ? !akey.equals(cidSuperID.akey) : cidSuperID.akey != null) return false;
+		if (bkey != null ? !bkey.equals(cidSuperID.bkey) : cidSuperID.bkey != null) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		int result;
+		result = (akey != null ? akey.hashCode() : 0);
+		result = 29 * result + (bkey != null ? bkey.hashCode() : 0);
+		return result;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/InnerKey.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Intervention.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Intervention.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Intervention.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,36 @@
+package org.hibernate.test.legacy;
+
+/**
+ * @author hbm2java
+ */
+public class Intervention {
+
+   java.lang.String id;
+   long version;
+
+   String description;
+
+  java.lang.String getId() {
+    return id;
+  }
+
+  void  setId(java.lang.String newValue) {
+    id = newValue;
+  }
+
+  long getVersion() {
+    return version;
+  }
+
+  void  setVersion(long newValue) {
+    version = newValue;
+  }
+
+
+public String getDescription() {
+	return description;
+}
+public void setDescription(String description) {
+	this.description = description;
+}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Intervention.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/J.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/J.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/J.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,17 @@
+//$Id: J.java 7203 2005-06-19 02:01:05Z oneovthafew $
+package org.hibernate.test.legacy;
+
+/**
+ * @author Gavin King
+ */
+public class J extends I {
+	private float amount;
+
+	void setAmount(float amount) {
+		this.amount = amount;
+	}
+
+	float getAmount() {
+		return amount;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/J.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Jay.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Jay.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Jay.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,45 @@
+//$Id: Jay.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+/**
+ * @author Gavin King
+ */
+public class Jay {
+	private long id;
+	private Eye eye;
+	/**
+	 * @return Returns the eye.
+	 */
+	public Eye getEye() {
+		return eye;
+	}
+
+	/**
+	 * @param eye The eye to set.
+	 */
+	public void setEye(Eye eye) {
+		this.eye = eye;
+	}
+
+	/**
+	 * @return Returns the id.
+	 */
+	public long getId() {
+		return id;
+	}
+
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(long id) {
+		this.id = id;
+	}
+	
+	public Jay() {}
+	
+	public Jay(Eye eye) {
+		eye.getJays().add(this);
+		this.eye = eye;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Jay.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/K.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/K.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/K.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,18 @@
+//$Id: K.java 7203 2005-06-19 02:01:05Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.util.Set;
+
+/**
+ * @author Gavin King
+ */
+public class K {
+	private Long id;
+	private Set is;
+	void setIs(Set is) {
+		this.is = is;
+	}
+	Set getIs() {
+		return is;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/K.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/LegacyTestCase.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/LegacyTestCase.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/LegacyTestCase.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,92 @@
+package org.hibernate.test.legacy;
+
+import java.util.Iterator;
+
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.hql.classic.ClassicQueryTranslatorFactory;
+import org.hibernate.util.StringHelper;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.classic.Session;
+import org.hibernate.type.Type;
+import org.hibernate.Query;
+
+/**
+ * @author Steve Ebersole
+ */
+public abstract class LegacyTestCase extends FunctionalTestCase {
+
+	public static final String USE_ANTLR_PARSER_PROP = "legacy.use_antlr_hql_parser";
+	private final boolean useAntlrParser;
+
+	public LegacyTestCase(String x) {
+		super( x );
+		useAntlrParser = Boolean.valueOf( extractFromSystem( USE_ANTLR_PARSER_PROP ) ).booleanValue();
+	}
+
+	protected static String extractFromSystem(String systemPropertyName) {
+		try {
+			return System.getProperty( systemPropertyName );
+		}
+		catch( Throwable t ) {
+			return null;
+		}
+	}
+
+	public void configure(Configuration cfg) {
+		super.configure( cfg );
+		if ( !useAntlrParser ) {
+			cfg.setProperty( Environment.QUERY_TRANSLATOR, ClassicQueryTranslatorFactory.class.getName() );
+			try {
+				String dialectTrueRepresentation = Dialect.getDialect().toBooleanValueString( true );
+				// if this call succeeds, then the dialect is saying to represent true/false as int values...
+				Integer.parseInt( dialectTrueRepresentation );
+				String subs = cfg.getProperties().getProperty( Environment.QUERY_SUBSTITUTIONS );
+				if ( subs == null ) {
+					subs = "";
+				}
+				if ( StringHelper.isEmpty( subs ) ) {
+					subs = "true=1, false=0";
+				}
+				else {
+					subs += ", true=1, false=0";
+				}
+				cfg.getProperties().setProperty( Environment.QUERY_SUBSTITUTIONS, subs );
+			}
+			catch( NumberFormatException nfe ) {
+				// the Integer#parseInt call failed...
+			}
+		}
+	}
+
+	protected int doDelete(Session session, String queryString) {
+		return doDelete( session, session.createQuery( queryString ) );
+	}
+
+	protected int doDelete(Session session, String queryString, Object param, Type paramType) {
+		Query query = session.createQuery( queryString )
+				.setParameter( 0, param, paramType );
+		return doDelete( session, query );
+	}
+
+	protected int doDelete(Session session, String queryString, Object[] params, Type[] paramTypes) {
+		Query query = session.createQuery( queryString );
+		if ( params != null ) {
+			for ( int i = 0; i < params.length; i++ ) {
+				query.setParameter( i, params[i], paramTypes[i] );
+			}
+		}
+		return doDelete( session, query );
+	}
+
+	protected int doDelete(Session session, Query selectQuery) {
+		int count = 0;
+		Iterator itr = selectQuery.list().iterator();
+		while ( itr.hasNext() ) {
+			session.delete( itr.next() );
+			count++;
+		}
+		return count;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/LegacyTestCase.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Location.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Location.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Location.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-lazy="false">
+
+	<class name="org.hibernate.test.legacy.Location">
+		<composite-id>
+			<key-property name="streetNumber"/>
+			<key-property name="streetName" length="20"/>
+			<key-property name="city" length="20"/>
+			<key-property name="countryCode" length="2"/>
+		</composite-id>
+		<property name="locale"/>
+		<property name="description"/>
+	</class>
+	
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Location.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Location.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Location.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Location.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,125 @@
+//$Id: Location.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+import java.util.Locale;
+
+public class Location implements Serializable {
+	private int streetNumber;
+	private String city;
+	private String streetName;
+	private String countryCode;
+	private Locale locale;
+	private String description;
+	
+	/**
+	 * Returns the countryCode.
+	 * @return String
+	 */
+	public String getCountryCode() {
+		return countryCode;
+	}
+	
+	/**
+	 * Returns the description.
+	 * @return String
+	 */
+	public String getDescription() {
+		return description;
+	}
+	
+	/**
+	 * Returns the locale.
+	 * @return Locale
+	 */
+	public Locale getLocale() {
+		return locale;
+	}
+	
+	/**
+	 * Returns the streetName.
+	 * @return String
+	 */
+	public String getStreetName() {
+		return streetName;
+	}
+	
+	/**
+	 * Returns the streetNumber.
+	 * @return int
+	 */
+	public int getStreetNumber() {
+		return streetNumber;
+	}
+	
+	/**
+	 * Sets the countryCode.
+	 * @param countryCode The countryCode to set
+	 */
+	public void setCountryCode(String countryCode) {
+		this.countryCode = countryCode;
+	}
+	
+	/**
+	 * Sets the description.
+	 * @param description The description to set
+	 */
+	public void setDescription(String description) {
+		this.description = description;
+	}
+	
+	/**
+	 * Sets the locale.
+	 * @param locale The locale to set
+	 */
+	public void setLocale(Locale locale) {
+		this.locale = locale;
+	}
+	
+	/**
+	 * Sets the streetName.
+	 * @param streetName The streetName to set
+	 */
+	public void setStreetName(String streetName) {
+		this.streetName = streetName;
+	}
+	
+	/**
+	 * Sets the streetNumber.
+	 * @param streetNumber The streetNumber to set
+	 */
+	public void setStreetNumber(int streetNumber) {
+		this.streetNumber = streetNumber;
+	}
+	
+	/**
+	 * Returns the city.
+	 * @return String
+	 */
+	public String getCity() {
+		return city;
+	}
+	
+	/**
+	 * Sets the city.
+	 * @param city The city to set
+	 */
+	public void setCity(String city) {
+		this.city = city;
+	}
+	
+	public boolean equals(Object other) {
+		Location l = (Location) other;
+		return l.getCity().equals(city) && l.getStreetName().equals(streetName) && l.getCountryCode().equals(countryCode) && l.getStreetNumber()==streetNumber;
+	}
+	public int hashCode() {
+		return streetName.hashCode();
+	}
+	
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Location.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Lower.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Lower.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Lower.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,134 @@
+//$Id: Lower.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.util.List;
+import java.util.Set;
+
+
+public class Lower extends Top {
+	private int intprop;
+	private String foo;
+	private Set set;
+	private List bag;
+	private Top another;
+	private Lower yetanother;
+	private Po mypo;
+	/**
+	 * Returns the intprop.
+	 * @return int
+	 */
+	public int getIntprop() {
+		return intprop;
+	}
+	
+	/**
+	 * Sets the intprop.
+	 * @param intprop The intprop to set
+	 */
+	public void setIntprop(int intprop) {
+		this.intprop = intprop;
+	}
+	
+	/**
+	 * Returns the foo.
+	 * @return String
+	 */
+	public String getFoo() {
+		return foo;
+	}
+	
+	/**
+	 * Sets the foo.
+	 * @param foo The foo to set
+	 */
+	public void setFoo(String foo) {
+		this.foo = foo;
+	}
+	
+	/**
+	 * Returns the set.
+	 * @return Set
+	 */
+	public Set getSet() {
+		return set;
+	}
+	
+	/**
+	 * Sets the set.
+	 * @param set The set to set
+	 */
+	public void setSet(Set set) {
+		this.set = set;
+	}
+	
+	/**
+	 * Returns the another.
+	 * @return Simple
+	 */
+	public Top getAnother() {
+		return another;
+	}
+	
+	/**
+	 * Returns the yetanother.
+	 * @return LessSimple
+	 */
+	public Lower getYetanother() {
+		return yetanother;
+	}
+	
+	/**
+	 * Sets the another.
+	 * @param another The another to set
+	 */
+	public void setAnother(Top another) {
+		this.another = another;
+	}
+	
+	/**
+	 * Sets the yetanother.
+	 * @param yetanother The yetanother to set
+	 */
+	public void setYetanother(Lower yetanother) {
+		this.yetanother = yetanother;
+	}
+	
+	/**
+	 * Returns the bag.
+	 * @return List
+	 */
+	public List getBag() {
+		return bag;
+	}
+	
+	/**
+	 * Sets the bag.
+	 * @param bag The bag to set
+	 */
+	public void setBag(List bag) {
+		this.bag = bag;
+	}
+	
+	/**
+	 * Returns the mypo.
+	 * @return Po
+	 */
+	public Po getMypo() {
+		return mypo;
+	}
+	
+	/**
+	 * Sets the mypo.
+	 * @param mypo The mypo to set
+	 */
+	public void setMypo(Po mypo) {
+		this.mypo = mypo;
+	}
+	
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Lower.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MainObject.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MainObject.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MainObject.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,50 @@
+<?xml version="1.0"?>
+
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping default-lazy="false">
+    <class
+        name="org.hibernate.test.legacy.MainObject"
+        table="mainobject"
+        dynamic-update="false"
+        dynamic-insert="false"
+    >
+        <cache usage="read-write" />
+
+        <id
+            name="id"
+            column="id"
+            type="java.lang.Long"
+        >
+            <generator class="native">
+                <param name="sequence">seq_mainobj</param>
+            </generator>
+        </id>
+
+        <one-to-one
+            name="obj2"
+            class="org.hibernate.test.legacy.Object2"
+            cascade="all"
+            outer-join="auto"
+            constrained="false"
+        />
+
+        <property
+            name="description"
+            type="java.lang.String"
+            update="true"
+            insert="true"
+            column="description"
+        />
+
+        <!--
+            To add non XDoclet property mappings, create a file named
+                hibernate-properties-MainObject.xml
+            containing the additional properties and place it in your merge dir.
+        -->
+
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MainObject.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MainObject.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MainObject.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MainObject.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,38 @@
+package org.hibernate.test.legacy;
+
+/**
+ * @author Wolfgang Voelkl
+ */
+public class MainObject {
+	private Long id;
+	private String description;
+	private Object2 obj2;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Object2 getObj2() {
+		return obj2;
+	}
+
+	public String getDescription() {
+		return description;
+	}
+
+	public void setDescription(String string) {
+		description = string;
+	}
+
+	public void setObj2(Object2 object2) {
+		this.obj2 = object2;
+		if (object2 != null) {
+			object2.setBelongsToMainObj(this);
+		}
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MainObject.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Many.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Many.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Many.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping default-lazy="false">
+  <class name="org.hibernate.test.legacy.Many" table="many">
+    <id name="key" column="many_key">
+      <generator class="native" />
+    </id>
+    <property name="x"/>
+    <many-to-one name="one" column="one_key" class="org.hibernate.test.legacy.One"/>
+  </class>
+</hibernate-mapping>
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Many.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Many.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Many.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Many.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,37 @@
+//$Id: Many.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+public class Many {
+	Long key;
+	One one;
+	private int x;
+	
+	public int getX() {
+		return x;
+	}
+	public void setX(int x) {
+		this.x = x;
+	}
+	
+	public void setKey(Long key) {
+		this.key = key;
+	}
+	
+	public Long getKey() {
+		return this.key;
+	}
+	
+	public void setOne(One one) {
+		this.one = one;
+	}
+	
+	public One getOne() {
+		return this.one;
+	}
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Many.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Map.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Map.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Map.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,57 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+	
+<hibernate-mapping default-lazy="false">
+
+    <class entity-name="TestMap">
+
+        <id name="id" type="long" column="id_">
+            <generator class="hilo"/>
+        </id>
+
+        <property name="name" type="string"/>
+        <property name="address" type="string"/>
+
+        <many-to-one name="parent" entity-name="TestMap"/>
+
+        <bag name="children" inverse="true" lazy="false">
+        	<key column="parent"/>
+        	<one-to-many entity-name="TestMap"/>
+        </bag>
+
+        <dynamic-component name="cmp">
+        	<property name="a" type="integer"/>
+        	<property name="b" type="float"/>
+        </dynamic-component>
+    </class>
+    
+	<class entity-name="ParentMap">
+
+		<id name="parentId" column="ParentId" type="long" unsaved-value="null">
+			<generator class="hilo">
+				<param name="sequence">parent_sequence</param>
+			</generator>
+		</id>
+
+		<version name="version" type="java.lang.Integer" column="version"/>
+		<property name="field" type="string" column="Field" length="50"/>
+
+		<one-to-one name="child" entity-name="ChildMap" cascade="all" outer-join="false" constrained="false" property-ref="parent"/>
+	</class>
+
+	<class entity-name="ChildMap">
+
+		<id name="childId" column="ChildId" type="long" unsaved-value="null">
+			<generator class="hilo">
+				<param name="sequence">child_sequence</param>
+			</generator>
+		</id>
+
+		<property name="field" type="string" column="Field" length="50"/>
+
+		<many-to-one name="parent" entity-name="ParentMap" cascade="all" outer-join="false" column="ParentId" not-null="true"/>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Map.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MapTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MapTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MapTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,164 @@
+//$Id: MapTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.Test;
+
+import org.hibernate.EntityMode;
+import org.hibernate.Session;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.criterion.Example;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+
+public class MapTest extends LegacyTestCase {
+
+	public MapTest(String x) {
+		super(x);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "legacy/Map.hbm.xml", "legacy/Commento.hbm.xml", "legacy/Marelo.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		super.configure( cfg );
+		cfg.setProperty( Environment.DEFAULT_ENTITY_MODE, EntityMode.MAP.toString() );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( MapTest.class );
+	}
+
+	public void testMap() throws Exception {
+
+		Session s = openSession().getSession(EntityMode.MAP);
+		Map map = new HashMap();
+		map.put("$type$", "TestMap");
+		map.put("name", "foo");
+		map.put("address", "bar");
+		Map cmp = new HashMap();
+		cmp.put( "a", new Integer(1) );
+		cmp.put( "b", new Float(1.0) );
+		map.put("cmp", cmp);
+		s.save(map);
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		s = openSession().getSession(EntityMode.MAP);
+		map = (Map) s.get( "TestMap", (Serializable) map.get("id") );
+		assertTrue( map!=null && "foo".equals( map.get("name") ) );
+		assertTrue( map.get("$type$").equals("TestMap") );
+
+		int size = s.createCriteria("TestMap").add( Example.create(map) ).list().size();
+		assertTrue(size==1);
+		s.connection().commit();
+		s.close();
+
+		s = openSession().getSession(EntityMode.MAP);
+		List list = s.createQuery("from TestMap").list();
+		map = (Map) list.get(0);
+		assertTrue( "foo".equals( map.get("name") ) );
+		assertTrue( "bar".equals( map.get("address") ) );
+		cmp = (Map) map.get("cmp");
+		assertTrue( new Integer(1).equals( cmp.get("a") ) && new Float(1.0).equals( cmp.get("b") ) );
+		assertTrue( null==map.get("parent") );
+		map.put("name", "foobar");
+		map.put("parent", map);
+		List bag = (List) map.get("children");
+		bag.add(map);
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		s = openSession();
+		list = s.createQuery("from TestMap tm where tm.address = 'bar'").list();
+		map = (Map) list.get(0);
+		assertTrue( "foobar".equals( map.get("name") ) );
+		assertTrue( "bar".equals( map.get("address") ) );
+		assertTrue( map==map.get("parent") );
+		bag = (List) map.get("children");
+		assertTrue( bag.size()==1 );
+
+		size = s.createCriteria("TestMap")
+			.add( Restrictions.eq("address", "bar") )
+				.createCriteria("parent")
+				.add( Restrictions.eq("name", "foobar") )
+			.list()
+			.size();
+		assertTrue(size==1);
+
+		s.delete(map);
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+	}
+
+	public void testMapOneToOne() throws Exception {
+		Map child = new HashMap();
+		Map parent = new HashMap();
+		Session s = openSession();
+		child.put("parent", parent);
+		child.put("$type$", "ChildMap");
+		parent.put("child", child);
+		parent.put("$type$", "ParentMap");
+		s.save(parent);
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		s = openSession();
+		Map cm = (Map) s.createQuery("from ChildMap cm where cm.parent is not null").uniqueResult();
+		s.delete(cm);
+		s.delete( cm.get("parent") );
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		child = new HashMap();
+		parent = new HashMap();
+		s = openSession();
+		child.put("parent", parent);
+		child.put("$type$", "ChildMap");
+		parent.put("child", child);
+		parent.put("$type$", "ParentMap");
+		s.save(child);
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		s = openSession();
+		Map pm = (Map) s.createQuery("from ParentMap cm where cm.child is not null").uniqueResult();
+		s.delete(pm);
+		s.delete( pm.get("child") );
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+	}
+
+	public void testOneToOnePropertyRef() throws Exception {
+		Session s = openSession();
+		s.createQuery("from Commento c where c.marelo.mlmag = 0").list();
+		s.createQuery("from Commento c where c.marelo.commento.mcompr is null").list();
+		s.createQuery("from Commento c where c.marelo.mlink = 0").list();
+		s.createQuery("from Commento c where c.marelo.commento = c").list();
+		s.createQuery("from Commento c where c.marelo.id.mlmag = 0").list();
+		s.createQuery("from Commento c where c.marelo.commento.id = c.id").list();
+		s.createQuery("from Commento c where c.marelo.commento.mclink = c.mclink").list();
+		s.createQuery("from Marelo m where m.commento.id > 0").list();
+		s.createQuery("from Marelo m where m.commento.marelo.commento.marelo.mlmag is not null").list();
+		s.connection().commit();
+		s.close();
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MapTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Marelo.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Marelo.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Marelo.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,41 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+	
+<hibernate-mapping default-lazy="false">
+<!--
+    Created by the Middlegen Hibernate plugin 2.1
+
+    http://boss.bekk.no/boss/middlegen/
+    http://hibernate.sourceforge.net/
+-->
+
+<class entity-name="Marelo" table="MARELO">
+
+    <composite-id>
+        <key-property name="mlmag" column="MLMAG" type="int" length="5"/>
+        <key-property name="mloca" column="MLOCA" type="java.lang.String" length="11"/>
+    </composite-id>
+
+    <property name="mlink" type="long" column="MLINK" length="10"/>
+    <property name="mlart" type="java.lang.String" column="MLART" length="13"/>
+    <property name="mlido" type="long" column="MLIDO" length="10"/>
+    <property name="mldtc" type="java.sql.Timestamp" column="MLDTC" length="7"/>
+    <property name="mltop" type="java.lang.String" column="MLTOP" length="10"/>
+    <property name="mlrag" type="java.lang.String" column="MLRAG" length="2"/>
+    <property name="mlrop" type="short" column="MLROP" length="4"/>
+    <property name="mlcom" type="long" column="MLCOM" length="10"/>
+    <property name="matri" type="java.lang.String" column="MATRI" length="14"/>
+    <property name="socod" type="java.lang.String" column="SOCOD" length="10"/>
+
+    <!-- Associations -->
+
+    <!-- bi-directional one-to-one association to Commento -->
+    <many-to-one name="commento" entity-name="Commento" unique="false" insert="false" update="false">
+        <column name="MLCOM"/>
+    </many-to-one>
+
+
+</class>
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Marelo.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Master.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Master.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Master.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,143 @@
+//$Id: Master.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+public class Master implements Serializable, Named {
+	private Master otherMaster;
+	private Set details = new HashSet();
+	private Set moreDetails = new HashSet();
+	private Set incoming = new HashSet();
+	private Set outgoing = new HashSet();
+	private String name="master";
+	private Date stamp;
+	private int version;
+	private BigDecimal bigDecimal = new BigDecimal("1234.123");
+	private int x;
+	private Collection allDetails;
+	
+	public int getX() {
+		return x;
+	}
+	public void setX(int x) {
+		this.x = x;
+	}
+	
+	public Set getDetails() {
+		return details;
+	}
+	
+	private void setDetails(Set details) {
+		this.details = details;
+	}
+	
+	public void addDetail(Detail d) {
+		details.add(d);
+	}
+	
+	public void removeDetail(Detail d) {
+		details.remove(d);
+	}
+	
+	public void addIncoming(Master m) {
+		incoming.add(m);
+	}
+	
+	public void removeIncoming(Master m) {
+		incoming.remove(m);
+	}
+	
+	public void addOutgoing(Master m) {
+		outgoing.add(m);
+	}
+	
+	public void removeOutgoing(Master m) {
+		outgoing.remove(m);
+	}
+	
+	public Set getIncoming() {
+		return incoming;
+	}
+	
+	public void setIncoming(Set incoming) {
+		this.incoming = incoming;
+	}
+	
+	public Set getOutgoing() {
+		return outgoing;
+	}
+	
+	public void setOutgoing(Set outgoing) {
+		this.outgoing = outgoing;
+	}
+	
+	public Set getMoreDetails() {
+		return moreDetails;
+	}
+	
+	public void setMoreDetails(Set moreDetails) {
+		this.moreDetails = moreDetails;
+	}
+	
+	public String getName() {
+		return name;
+	}
+	
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	public Date getStamp() {
+		return stamp;
+	}
+	
+	public void setStamp(Date stamp) {
+		this.stamp = stamp;
+	}
+	
+	public BigDecimal getBigDecimal() {
+		return bigDecimal;
+	}
+	
+	public void setBigDecimal(BigDecimal bigDecimal) {
+		this.bigDecimal = bigDecimal;
+	}
+	
+	/**
+	 * @return
+	 */
+	public Master getOtherMaster() {
+		return otherMaster;
+	}
+
+	/**
+	 * @param master
+	 */
+	public void setOtherMaster(Master master) {
+		otherMaster = master;
+	}
+
+	/**
+	 * @return Returns the allDetails.
+	 */
+	public Collection getAllDetails() {
+		return allDetails;
+	}
+	/**
+	 * @param allDetails The allDetails to set.
+	 */
+	public void setAllDetails(Collection allDetails) {
+		this.allDetails = allDetails;
+	}
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Master.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MasterDetail.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MasterDetail.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MasterDetail.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,78 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+	
+<hibernate-mapping default-lazy="false">
+
+	<class name="org.hibernate.test.legacy.Master" table="`master`">
+		<meta attribute="foo">foo</meta>
+		<id column="master_key_column" type="long">
+			<generator class="native"/>
+		</id>
+		<version name="version" access="field"/>
+		<!--version type="timestamp" name="stamp" column="ts_"/-->
+		<!--timestamp name="stamp" column="ts_"/-->
+		<property name="name">
+			<meta attribute="bar">bar</meta>
+			<meta attribute="bar">bar2</meta>
+		</property>
+		<property name="x"/>
+		<property name="bigDecimal" column="big_dec" precision="7" scale="3"/>
+		<set name="details" inverse="true" lazy="true" order-by="i asc">
+			<key column="master_key"/>
+			<one-to-many class="org.hibernate.test.legacy.Detail"/>
+		</set>
+		<set name="moreDetails" cascade="all" lazy="true" order-by="i desc">
+			<key column="more_master_key"/>
+			<one-to-many class="org.hibernate.test.legacy.Detail"/>
+		</set>
+		<set name="incoming" lazy="true" table="mtm">
+			<key foreign-key="AA" column="outgoingabcdef"/>
+			<many-to-many class="org.hibernate.test.legacy.Master" foreign-key="BB">
+				<column name="incomingabcdef" index="IBB"/>
+			</many-to-many>
+		</set>
+		<set name="outgoing" lazy="true" table="mtm" inverse="true">
+			<key column="incomingabcdef"/>
+			<many-to-many class="org.hibernate.test.legacy.Master" column="outgoingabcdef"/>
+		</set>
+		<many-to-one name="otherMaster"/>
+		<!--query-list name="allDetails" query-ref="all_details"/-->
+	</class>
+	
+	<class name="org.hibernate.test.legacy.Detail">
+		<id column="detail_key_column" type="long">
+			<generator class="native"/>
+		</id>
+		<property name="x">
+			<column name="x" unique-key="uk" not-null="true"/>
+		</property>
+		<property name="i">
+			<column name="i" unique-key="uk" not-null="true"/>
+		</property>
+		<many-to-one name="master" foreign-key="CC"> <!--not-null="true"-->
+			<column name="master_key" unique-key="uk" not-null="true"/>
+		</many-to-one>
+		<!-- <cache timeout="10000" type="readwrite"/> -->
+		<set name="subDetails" lazy="true" cascade="all">
+			<key column="detail_key"/>
+			<one-to-many class="org.hibernate.test.legacy.SubDetail"/>
+		</set>
+	</class>
+	
+	<class name="org.hibernate.test.legacy.SubDetail">
+		<id column="subdetail_key_col" type="long">
+			<generator class="native">
+				<param name="sequence">fooseq</param>
+			</generator>
+		</id>
+		<property name="name"/>
+	</class>
+	
+	<query name="all_details" cacheable="true" fetch-size="10"><![CDATA[
+		from 
+			Detail as d
+	]]></query>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MasterDetail.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MasterDetailTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MasterDetailTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MasterDetailTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,1050 @@
+//$Id: MasterDetailTest.java 10981 2006-12-13 00:14:17Z steve.ebersole at jboss.com $
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+import java.sql.Connection;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.LockMode;
+import org.hibernate.ObjectNotFoundException;
+import org.hibernate.Query;
+import org.hibernate.Transaction;
+import org.hibernate.classic.Session;
+import org.hibernate.criterion.Example;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.dialect.HSQLDialect;
+import org.hibernate.dialect.MckoiDialect;
+import org.hibernate.dialect.MySQLDialect;
+import org.hibernate.dialect.SAPDBDialect;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.mapping.MetaAttribute;
+import org.hibernate.mapping.PersistentClass;
+
+
+public class MasterDetailTest extends LegacyTestCase {
+
+	public MasterDetailTest(String arg) {
+		super(arg);
+	}
+
+	public String[] getMappings() {
+		return new String[] {
+			"legacy/MasterDetail.hbm.xml",
+			"legacy/Custom.hbm.xml",
+			"legacy/Category.hbm.xml",
+			"legacy/Nameable.hbm.xml",
+			"legacy/SingleSeveral.hbm.xml",
+			"legacy/WZ.hbm.xml",
+			"legacy/UpDown.hbm.xml",
+			"legacy/Eye.hbm.xml"
+		};
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( MasterDetailTest.class );
+	}
+
+	public void testOuterJoin() throws Exception {
+		Session s = openSession();
+		Eye e = new Eye();
+		e.setName("Eye Eye");
+		Jay jay = new Jay(e);
+		e.setJay(jay);
+		s.saveOrUpdate(e);
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		s = openSession();
+		e = (Eye) s.createCriteria(Eye.class).uniqueResult();
+		assertTrue( Hibernate.isInitialized( e.getJay() ) );
+		assertTrue( Hibernate.isInitialized( e.getJays() ) );
+		s.connection().commit();
+		s.close();
+
+		s = openSession();
+		jay = (Jay) s.createQuery("select new Jay(eye) from Eye eye").uniqueResult();
+		assertTrue( "Eye Eye".equals( jay.getEye().getName() ) );
+		s.delete( jay.getEye() );
+		s.flush();
+		s.connection().commit();
+		s.close();
+	}
+
+	public void testMeta() throws Exception {
+		PersistentClass clazz = getCfg().getClassMapping( Master.class.getName() );
+		MetaAttribute meta = clazz.getMetaAttribute("foo");
+		assertTrue( "foo".equals( meta.getValue() ) );
+		meta = clazz.getProperty("name").getMetaAttribute("bar");
+		assertTrue( meta.isMultiValued() );
+	}
+
+	public void testCopy() throws Exception {
+		Category catWA = new Category();
+		catWA.setName("HSQL workaround");
+		Category cat = new Category();
+		cat.setName("foo");
+		Category subCatBar = new Category();
+		subCatBar.setName("bar");
+		Category subCatBaz = new Category();
+		subCatBaz.setName("baz");
+		cat.getSubcategories().add(subCatBar);
+		cat.getSubcategories().add(subCatBaz);
+		Session s = openSession();
+		s.save(catWA);
+		s.save(cat);
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		cat.setName("new foo");
+		subCatBar.setName("new bar");
+		cat.getSubcategories().remove(subCatBaz);
+		Category newCat = new Category();
+		newCat.setName("new");
+		cat.getSubcategories().add(newCat);
+		Category newSubCat = new Category();
+		newSubCat.setName("new sub");
+		newCat.getSubcategories().add(newSubCat);
+
+		s = openSession();
+		Category copiedCat = (Category) s.saveOrUpdateCopy(cat);
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		assertFalse( copiedCat==cat );
+		//assertFalse( copiedCat.getSubcategories().contains(newCat) );
+		assertTrue( cat.getSubcategories().contains(newCat) );
+
+		s = openSession();
+		cat = (Category) s.createQuery("from Category cat where cat.name='new foo'").uniqueResult();
+		newSubCat = (Category) s.createQuery("from Category cat left join fetch cat.subcategories where cat.name='new sub'").uniqueResult();
+		assertTrue( newSubCat.getName().equals("new sub") );
+		s.close();
+
+		newSubCat.getSubcategories().add(cat);
+		cat.setName("new new foo");
+
+		s = openSession();
+		newSubCat = (Category) s.saveOrUpdateCopy( newSubCat, new Long( newSubCat.getId() ) );
+		assertTrue( newSubCat.getName().equals("new sub") );
+		assertTrue( newSubCat.getSubcategories().size()==1 );
+		cat = (Category) newSubCat.getSubcategories().get(0);
+		assertTrue( cat.getName().equals("new new foo") );
+		newSubCat.getSubcategories().remove(cat);
+		s.delete(cat);
+		s.delete(subCatBaz);
+		s.delete(catWA);
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+	}
+
+	public void testNotNullDiscriminator() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Up up = new Up();
+		up.setId1("foo");
+		up.setId2(123l);
+		Down down = new Down();
+		down.setId1("foo");
+		down.setId2(321l);
+		down.setValue(12312312l);
+		s.save(up);
+		s.save(down);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		List list = s.createQuery( "from Up up order by up.id2 asc" ).list();
+		assertTrue( list.size()==2 );
+		assertFalse( list.get(0) instanceof Down );
+		assertTrue( list.get(1) instanceof Down );
+		list = s.createQuery( "from Down down" ).list();
+		assertTrue( list.size()==1 );
+		assertTrue( list.get(0) instanceof Down );
+		//list = s.find("from Up down where down.class = Down");
+		assertTrue( list.size()==1 );
+		assertTrue( list.get(0) instanceof Down );
+		s.delete("from Up up");
+		t.commit();
+		s.close();
+
+	}
+
+	public void testSelfManyToOne() throws Exception {
+
+		//if (dialect instanceof HSQLDialect) return;
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Master m = new Master();
+		m.setOtherMaster(m);
+		s.save(m);
+		t.commit();
+		s.close();
+		s = openSession();
+		t = s.beginTransaction();
+		Iterator i = s.createQuery( "from Master" ).iterate();
+		m = (Master) i.next();
+		assertTrue( m.getOtherMaster()==m );
+		if (getDialect() instanceof HSQLDialect) { m.setOtherMaster(null); s.flush(); }
+		s.delete(m);
+		t.commit();
+		s.close();
+	}
+
+	public void testExample() throws Exception {
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Master m = new Master();
+		m.setName("name");
+		m.setX(5);
+		m.setOtherMaster(m);
+		s.save(m);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Master m1 = (Master) s.createCriteria(Master.class)
+			.add( Example.create(m).enableLike().ignoreCase().excludeProperty("bigDecimal") )
+			.uniqueResult();
+		assertTrue( m1.getOtherMaster()==m1 );
+		m1 = (Master) s.createCriteria(Master.class)
+			.add( Restrictions.eq("name", "foobar") )
+			.uniqueResult();
+		assertTrue( m1==null );
+		m1 = (Master) s.createCriteria(Master.class)
+			.add( Example.create(m).excludeProperty("bigDecimal") )
+			.createCriteria("otherMaster")
+				.add( Example.create(m).excludeZeroes().excludeProperty("bigDecimal") )
+			.uniqueResult();
+		assertTrue( m1.getOtherMaster()==m1 );
+		Master m2 = (Master) s.createCriteria(Master.class)
+			.add( Example.create(m).excludeNone().excludeProperty("bigDecimal") )
+			.uniqueResult();
+		assertTrue( m2==m1 );
+		m.setName(null);
+		m2 = (Master) s.createCriteria(Master.class)
+			.add( Example.create(m).excludeNone().excludeProperty("bigDecimal") )
+			.uniqueResult();
+		assertTrue( null==m2 );
+		if (getDialect() instanceof HSQLDialect) { m1.setOtherMaster(null); s.flush(); }
+		s.delete(m1);
+		t.commit();
+		s.close();
+	}
+
+	public void testNonLazyBidirectional() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Single sin = new Single();
+		sin.setId("asdfds");
+		sin.setString("adsa asdfasd");
+		Several sev = new Several();
+		sev.setId("asdfasdfasd");
+		sev.setString("asd ddd");
+		sin.getSeveral().add(sev);
+		sev.setSingle(sin);
+		s.save(sin);
+		t.commit();
+		s.close();
+		s = openSession();
+		t = s.beginTransaction();
+		sin = (Single) s.load( Single.class, sin );
+		t.commit();
+		s.close();
+		s = openSession();
+		t = s.beginTransaction();
+		sev = (Several) s.load( Several.class, sev );
+		t.commit();
+		s.close();
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery( "from Several" ).list();
+		t.commit();
+		s.close();
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete("from Single");
+		t.commit();
+		s.close();
+	}
+
+	public void testCollectionQuery() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		if ( !(getDialect() instanceof MySQLDialect) && !(getDialect() instanceof SAPDBDialect) && !(getDialect() instanceof MckoiDialect) ) {
+			s.createQuery( "FROM Master m WHERE NOT EXISTS ( FROM m.details d WHERE NOT d.i=5 )" ).iterate();
+			s.createQuery( "FROM Master m WHERE NOT 5 IN ( SELECT d.i FROM m.details AS d )" ).iterate();
+		}
+		s.createQuery( "SELECT m FROM Master m JOIN m.details d WHERE d.i=5" ).iterate();
+		s.createQuery( "SELECT m FROM Master m JOIN m.details d WHERE d.i=5" ).list();
+		s.createQuery( "SELECT m.id FROM Master AS m JOIN m.details AS d WHERE d.i=5" ).list();
+		t.commit();
+		s.close();
+	}
+
+	public void testMasterDetail() throws Exception {
+
+		if (getDialect() instanceof HSQLDialect) return;
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Master master = new Master();
+		assertTrue( "save returned native id", s.save(master)!=null );
+		Serializable mid = s.getIdentifier(master);
+		Detail d1 = new Detail();
+		d1.setMaster(master);
+		Serializable did = s.save(d1);
+		Detail d2 = new Detail();
+		d2.setI(12);
+		d2.setMaster(master);
+		assertTrue( "generated id returned", s.save(d2)!=null);
+		master.addDetail(d1);
+		master.addDetail(d2);
+		if ( !(getDialect() instanceof MySQLDialect) && !(getDialect() instanceof SAPDBDialect) && !(getDialect() instanceof MckoiDialect) && !(getDialect() instanceof org.hibernate.dialect.TimesTenDialect)) {
+			assertTrue(
+				"query",
+					s.createQuery(
+							"from Detail d, Master m where m = d.master and size(m.outgoing) = 0 and size(m.incoming) = 0"
+					).list().size()==2
+			);
+		}
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		master = new Master();
+		s.load(master, mid);
+		assertTrue( master.getDetails().size()==2 );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		master = (Master) s.load(Master.class, mid);
+		Iterator iter = master.getDetails().iterator();
+		int i=0;
+		while ( iter.hasNext() ) {
+			Detail d = (Detail) iter.next();
+			assertTrue( "master-detail", d.getMaster()==master );
+			i++;
+		}
+		assertTrue( "master-detail", i==2 );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		assertTrue( s.createQuery( "select elements(master.details) from Master master" ).list().size()==2 );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		List list = s.createQuery( "from Master m left join fetch m.details" ).list();
+		Master m = (Master) list.get(0);
+		assertTrue( Hibernate.isInitialized( m.getDetails() ) );
+		assertTrue( m.getDetails().size()==2 );
+		list = s.createQuery( "from Detail d inner join fetch d.master" ).list();
+		Detail dt = (Detail) list.get(0);
+		Serializable dtid = s.getIdentifier(dt);
+		assertTrue( dt.getMaster()==m );
+
+		//assertTrue(m.getAllDetails().size()==2);
+
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		list = s.createQuery( "select m from Master m1, Master m left join fetch m.details where m.name=m1.name" )
+				.list();
+		assertTrue( Hibernate.isInitialized( ( (Master) list.get(0) ).getDetails() ) );
+		dt = (Detail) s.load(Detail.class, dtid);
+		assertTrue( ( (Master) list.get(0) ).getDetails().contains(dt) );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		list = s.createQuery(
+				"select m, m1.name from Master m1, Master m left join fetch m.details where m.name=m1.name"
+		).list();
+		assertTrue( Hibernate.isInitialized( ( (Master) ( (Object[]) list.get(0) )[0] ).getDetails() ) );
+		dt = (Detail) s.load(Detail.class, dtid);
+		assertTrue( ( (Master) ( (Object[]) list.get(0) )[0] ).getDetails().contains(dt) );
+		//list = s.find("select m from Master m, Master m2 left join fetch m.details");
+// depracted syntax
+//		list = s.find("select m.id from Master m inner join fetch m.details");
+		t.commit();
+		s.close();
+
+
+		s = openSession();
+		t = s.beginTransaction();
+		Detail dd = (Detail) s.load(Detail.class, did);
+		master = dd.getMaster();
+		assertTrue( "detail-master", master.getDetails().contains(dd) );
+		assertTrue( s.createFilter( master.getDetails(), "order by this.i desc" ).list().size()==2 );
+		assertTrue( s.createFilter( master.getDetails(), "select this where this.id > -1" ).list().size()==2 );
+		Query q = s.createFilter( master.getDetails(), "where this.id > :id" );
+		q.setInteger("id", -1);
+		assertTrue( q.list().size()==2 );
+		q = s.createFilter( master.getDetails(), "where this.id > :id1 and this.id < :id2" );
+		q.setInteger("id1", -1);
+		q.setInteger("id2", 99999999);
+		assertTrue( q.list().size()==2 );
+		q.setInteger("id2", -1);
+		assertTrue( q.list().size()==0 );
+		q = s.createFilter( master.getDetails(), "where this.id in (:ids)" );
+		list = new ArrayList();
+		list.add(did);
+		list.add( new Long(-1) );
+		q.setParameterList("ids", list);
+		assertTrue( q.list().size()==1 );
+		assertTrue( q.iterate().hasNext() );
+		assertTrue( s.createFilter( master.getDetails(), "where this.id > -1" ).list().size()==2 );
+		assertTrue( s.createFilter( master.getDetails(), "select this.master where this.id > -1" ).list().size()==2 );
+		assertTrue(
+				s.createFilter( master.getDetails(), "select m from Master m where this.id > -1 and this.master=m" )
+						.list()
+						.size()==2 );
+		assertTrue( s.createFilter( master.getIncoming(), "where this.id > -1 and this.name is not null" ).list().size()==0 );
+
+		assertTrue( s.createFilter( master.getDetails(), "select max(this.i)" ).iterate().next() instanceof Integer );
+		assertTrue( s.createFilter( master.getDetails(), "select max(this.i) group by this.id" ).iterate().next() instanceof Integer );
+		assertTrue( s.createFilter( master.getDetails(), "select count(*)" ).iterate().next() instanceof Long );
+
+		assertTrue( s.createFilter( master.getDetails(), "select this.master" ).list().size()==2 );
+		assertTrue( s.createFilter( master.getMoreDetails(), "" ).list().size()==0 );
+		assertTrue( s.createFilter( master.getIncoming(), "" ).list().size()==0 );
+
+		Query f = s.createFilter( master.getDetails(), "select max(this.i) where this.i < :top and this.i>=:bottom" );
+		f.setInteger("top", 100);
+		f.setInteger("bottom", 0);
+		assertEquals( f.iterate().next(), new Integer(12) );
+		f.setInteger("top", 2);
+		assertEquals( f.iterate().next(), new Integer(0) );
+
+		f = s.createFilter( master.getDetails(), "select max(this.i) where this.i not in (:list)" );
+		Collection coll = new ArrayList();
+		coll.add( new Integer(-666) );
+		coll.add( new Integer(22) );
+		coll.add( new Integer(0) );
+		f.setParameterList("list", coll);
+		assertEquals( f.iterate().next(), new Integer(12) );
+
+		f = s.createFilter( master.getDetails(), "select max(this.i) where this.i not in (:list) and this.master.name = :listy2" );
+		f.setParameterList("list", coll);
+		f.setParameter( "listy2", master.getName() );
+		assertEquals( f.iterate().next(), new Integer(12) );
+
+		iter = master.getDetails().iterator();
+		i=0;
+		while ( iter.hasNext() ) {
+			Detail d = (Detail) iter.next();
+			assertTrue( "master-detail", d.getMaster()==master );
+			s.delete(d);
+			i++;
+		}
+		assertTrue( "master-detail", i==2 );
+		s.delete(master);
+		t.commit();
+		s.close();
+	}
+
+	public void testIncomingOutgoing() throws Exception {
+
+		Session s = openSession();
+		Master master1 = new Master();
+		Master master2 = new Master();
+		Master master3 = new Master();
+		s.save(master1);
+		s.save(master2);
+		s.save(master3);
+		master1.addIncoming(master2);
+		master2.addOutgoing(master1);
+		master1.addIncoming(master3);
+		master3.addOutgoing(master1);
+		Serializable m1id = s.getIdentifier(master1);
+		assertTrue( s.createFilter( master1.getIncoming(), "where this.id > 0 and this.name is not null" ).list().size()==2 );
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		s = openSession();
+		master1 = (Master) s.load(Master.class, m1id);
+		Iterator iter = master1.getIncoming().iterator();
+		int i=0;
+		while ( iter.hasNext() ) {
+			Master m = (Master) iter.next();
+			assertTrue( "outgoing", m.getOutgoing().size()==1 );
+			assertTrue( "outgoing", m.getOutgoing().contains(master1) );
+			s.delete(m);
+			i++;
+		}
+		assertTrue( "incoming-outgoing", i==2 );
+		s.delete(master1);
+		s.flush();
+		s.connection().commit();
+		s.close();
+	}
+
+	public void testCascading() throws Exception {
+
+		Session s = openSession();
+		Detail d1 = new Detail();
+		Detail d2 = new Detail();
+		d2.setI(22);
+		Master m = new Master();
+		Master m0 = new Master();
+		Serializable m0id = s.save(m0);
+		m0.addDetail(d1); m0.addDetail(d2);
+		d1.setMaster(m0); d2.setMaster(m0);
+		m.getMoreDetails().add(d1);
+		m.getMoreDetails().add(d2);
+		Serializable mid = s.save(m);
+		s.flush();
+		s.connection().commit();
+		s.close();
+		s = openSession();
+		m = (Master) s.load(Master.class, mid);
+		assertTrue( "cascade save", m.getMoreDetails().size()==2 );
+		assertTrue( "cascade save", ( (Detail) m.getMoreDetails().iterator().next() ).getMaster().getDetails().size()==2 );
+
+		s.delete(m);
+		s.delete( s.load(Master.class, m0id) );
+
+		s.flush();
+		s.connection().commit();
+		s.close();
+	}
+
+	public void testNamedQuery() throws Exception {
+		Session s = openSession();
+		Query q = s.getNamedQuery("all_details");
+		q.list();
+		s.connection().commit();
+		s.close();
+	}
+
+	public void testUpdateLazyCollections() throws Exception {
+		Session s = openSession();
+		Master m = new Master();
+		Serializable mid = s.save(m);
+		Detail d1 = new Detail();
+		Detail d2 = new Detail();
+		d2.setX(14);
+		d1.setMaster(m);
+		d2.setMaster(m);
+		s.save(d1);
+		s.save(d2);
+		m.addDetail(d1);
+		m.addDetail(d2);
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		s = openSession();
+		m = (Master) s.load(Master.class, mid);
+		s.connection().commit();
+		s.close();
+		m.setName("New Name");
+		s = openSession();
+		s.update(m, mid);
+		Iterator iter = m.getDetails().iterator();
+		int i=0;
+		while ( iter.hasNext() ) {
+			assertTrue( iter.next()!=null );
+			i++;
+		}
+		assertTrue(i==2);
+		iter = m.getDetails().iterator();
+		while ( iter.hasNext() ) s.delete( iter.next() );
+		s.delete(m);
+		s.flush();
+		s.connection().commit();
+		s.close();
+	}
+
+	public void testMultiLevelCascade() throws Exception {
+		Session s = openSession();
+		Transaction txn = s.beginTransaction();
+		Detail detail = new Detail();
+		SubDetail subdetail = new SubDetail();
+		Master m = new Master();
+		Master m0 = new Master();
+		Serializable m0id = s.save(m0);
+		m0.addDetail(detail);
+		detail.setMaster(m0);
+		m.getMoreDetails().add(detail);
+		detail.setSubDetails( new HashSet() );
+		detail.getSubDetails().add(subdetail);
+		Serializable mid = s.save(m);
+		txn.commit();
+		s.close();
+
+		s = openSession();
+		txn = s.beginTransaction();
+		m = (Master) s.load( Master.class, mid );
+		assertTrue( ( (Detail) m.getMoreDetails().iterator().next() ).getSubDetails().size()!=0 );
+		s.delete(m);
+		assertTrue( s.createQuery( "from SubDetail" ).list().size()==0 );
+		assertTrue( s.createQuery( "from Detail d" ).list().size()==0 );
+		s.delete( s.load(Master.class, m0id) );
+		txn.commit();
+		s.close();
+	}
+
+	public void testMixNativeAssigned() throws Exception {
+
+		Session s = openSession();
+		Category c = new Category();
+		c.setName("NAME");
+		Assignable assn = new Assignable();
+		assn.setId("i.d.");
+		List l = new ArrayList();
+		l.add(c);
+		assn.setCategories(l);
+		c.setAssignable(assn);
+		s.save(assn);
+		s.flush();
+		s.connection().commit();
+		s.close();
+		s = openSession();
+		s.delete(assn);
+		s.flush();
+		s.connection().commit();
+		s.close();
+	}
+
+	public void testCollectionReplaceOnUpdate() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Category c = new Category();
+		List list = new ArrayList();
+		c.setSubcategories(list);
+		list.add( new Category() );
+		s.save(c);
+		t.commit();
+		s.close();
+		c.setSubcategories(list);
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.update(c);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Category) s.load( Category.class, new Long( c.getId() ), LockMode.UPGRADE );
+		List list2 = c.getSubcategories();
+		t.commit();
+		s.close();
+
+		assertTrue( !Hibernate.isInitialized( c.getSubcategories() ) );
+
+		c.setSubcategories(list2);
+		s = openSession();
+		t = s.beginTransaction();
+		s.update(c);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Category) s.load( Category.class, new Long( c.getId() ), LockMode.UPGRADE );
+		assertTrue( c.getSubcategories().size()==1 );
+		s.delete(c);
+		t.commit();
+		s.close();
+	}
+
+	public void testCollectionReplace2() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Category c = new Category();
+		List list = new ArrayList();
+		c.setSubcategories(list);
+		list.add( new Category() );
+		Category c2 = new Category();
+		s.save(c2);
+		s.save(c);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Category) s.load( Category.class, new Long( c.getId() ), LockMode.UPGRADE );
+		List list2 = c.getSubcategories();
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c2 = (Category) s.load( Category.class, new Long( c2.getId() ), LockMode.UPGRADE );
+		c2.setSubcategories(list2);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c2 = (Category) s.load( Category.class, new Long( c2.getId() ), LockMode.UPGRADE );
+		assertTrue( c2.getSubcategories().size()==1 );
+		s.delete(c2);
+		s.delete( s.load( Category.class, new Long( c.getId() ) ) );
+		t.commit();
+		s.close();
+	}
+
+	public void testCollectionReplace() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Category c = new Category();
+		List list = new ArrayList();
+		c.setSubcategories(list);
+		list.add( new Category() );
+		s.save(c);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Category) s.load( Category.class, new Long( c.getId() ), LockMode.UPGRADE );
+		c.setSubcategories(list);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Category) s.load( Category.class, new Long( c.getId() ), LockMode.UPGRADE );
+		List list2 = c.getSubcategories();
+		t.commit();
+		s.close();
+
+		assertTrue( !Hibernate.isInitialized( c.getSubcategories() ) );
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Category) s.load( Category.class, new Long( c.getId() ), LockMode.UPGRADE );
+		c.setSubcategories(list2);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Category) s.load( Category.class, new Long( c.getId() ), LockMode.UPGRADE );
+		assertTrue( c.getSubcategories().size()==1 );
+		s.delete(c);
+		t.commit();
+		s.close();
+	}
+
+	public void testCategories() throws Exception {
+		Session s = openSession();
+		Category c = new Category();
+		c.setName(Category.ROOT_CATEGORY);
+		Category c1 = new Category();
+		Category c2 = new Category();
+		Category c3 = new Category();
+		c.getSubcategories().add(c1);
+		c.getSubcategories().add(c2);
+		c2.getSubcategories().add(null);
+		c2.getSubcategories().add(c3);
+		s.save(c);
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		s = openSession();
+		Transaction tx = s.beginTransaction();
+		s.lock(c, LockMode.UPGRADE);
+		Category loaded = (Category) s.load( Category.class, new Long( c3.getId() ) );
+		assertTrue( s.contains(c3) );
+		assertTrue(loaded==c3);
+		assertTrue( s.getCurrentLockMode(c3)==LockMode.NONE );
+		assertTrue( s.getCurrentLockMode(c)==LockMode.UPGRADE );
+		s.flush();
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		loaded = (Category) s.load( Category.class, new Long( c.getId() ) );
+		assertFalse( Hibernate.isInitialized( loaded.getSubcategories() ) );
+		s.connection().commit();
+		s.close();
+		s = openSession();
+		s.lock(loaded, LockMode.NONE);
+		assertTrue( loaded.getSubcategories().size()==2 );
+		s.connection().commit();
+		s.close();
+
+
+		s = openSession();
+		c = (Category) s.load( Category.class, new Long( c.getId() ) );
+		System.out.println( c.getSubcategories() );
+		assertTrue( c.getSubcategories().get(0)!=null && c.getSubcategories().get(1)!=null );
+		List list = ( (Category) c.getSubcategories().get(1) ).getSubcategories();
+		assertTrue( list.get(1)!=null && list.get(0)==null );
+
+		assertTrue(
+				s.createQuery( "from Category c where c.name = org.hibernate.test.legacy.Category.ROOT_CATEGORY" )
+						.iterate().hasNext()
+		);
+		s.delete(c);
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+	}
+
+	public void testCollectionRefresh() throws Exception {
+		Session s = openSession();
+		Category c = new Category();
+		List list = new ArrayList();
+		c.setSubcategories(list);
+		list.add( new Category() );
+		c.setName("root");
+		Serializable id = s.save(c);
+		s.flush();
+		s.connection().commit();
+		s.close();
+		s = openSession();
+		c = (Category) s.load(Category.class, id);
+		s.refresh(c);
+		s.flush();
+		assertTrue( c.getSubcategories().size()==1 );
+		s.flush();
+		s.connection().commit();
+		s.close();
+		s = openSession();
+		c = (Category) s.load(Category.class, id);
+		assertTrue( c.getSubcategories().size()==1 );
+		s.delete(c);
+		s.flush();
+		s.connection().commit();
+		s.close();
+	}
+
+	public void testCachedCollectionRefresh() throws Exception {
+		if ( isSerializableIsolationEnforced() ) {
+			reportSkip( "SERIALIZABLE isolation", "cached collection refreshing" );
+			return;
+		}
+		Session s = openSession();
+		Category c = new Category();
+		List list = new ArrayList();
+		c.setSubcategories(list);
+		list.add( new Category() );
+		c.setName("root");
+		Serializable id = s.save(c);
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		s = openSession();
+		c = (Category) s.load(Category.class, id);
+		c.getSubcategories().size(); //force load and cache
+		s.connection().commit();
+		s.close();
+		
+		s = openSession();
+		if ( (getDialect() instanceof MySQLDialect) ) {
+			s.connection().setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
+		}
+		c = (Category) s.load(Category.class, id);
+		c.getSubcategories().size(); //force load
+
+		Session ss = openSession();
+		Category c2 = (Category) ss.load(Category.class, id);
+		ss.delete( c2.getSubcategories().get(0) );
+		c2.getSubcategories().clear();
+		ss.flush();
+		ss.connection().commit();
+		ss.close();
+
+		s.refresh(c);
+		assertTrue( c.getSubcategories().size()==0 );
+
+		ss = openSession();
+		c2 = (Category) ss.load(Category.class, id);
+		c2.getSubcategories().add( new Category() );
+		c2.getSubcategories().add( new Category() );
+		ss.flush();
+		ss.connection().commit();
+		ss.close();
+
+		s.refresh(c);
+		assertEquals( 2, c.getSubcategories().size() );
+
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		s = openSession();
+		c = (Category) s.load(Category.class, id);
+		assertEquals( 2, c.getSubcategories().size() );
+		s.delete(c);
+		s.flush();
+		s.connection().commit();
+		s.close();
+	}
+
+	public void testCustomPersister() throws Exception {
+		Session s = openSession();
+		Custom c = new Custom();
+		c.setName( "foo" );
+		c.id="100";
+		String id = (String) s.save(c);
+		assertTrue( c==s.load(Custom.class, id) );
+		s.flush();
+		s.close();
+		s = openSession();
+		c = (Custom) s.load(Custom.class, id);
+		assertTrue( c.getName().equals("foo") );
+		c.setName( "bar" );
+		s.flush();
+		s.close();
+		s = openSession();
+		c = (Custom) s.load(Custom.class, id);
+		assertTrue( c.getName().equals("bar") );
+		s.delete(c);
+		s.flush();
+		s.close();
+		s = openSession();
+		boolean none = false;
+		try {
+			s.load(Custom.class, id);
+		}
+		catch (ObjectNotFoundException onfe) {
+			none=true;
+		}
+		assertTrue(none);
+		s.close();
+
+	}
+
+	public void testInterface() throws Exception {
+		Session s = openSession();
+		Serializable id = s.save( new BasicNameable() );
+		s.flush();
+		s.connection().commit();
+		s.close();
+		s = openSession();
+		Nameable n = (Nameable) s.load(Nameable.class, id);
+		s.delete(n);
+		s.flush();
+		s.connection().commit();
+		s.close();
+	}
+
+	public void testNoUpdateManyToOne() throws Exception {
+		Session s = openSession();
+		W w1 = new W();
+		W w2 = new W();
+		Z z = new Z();
+		z.setW(w1);
+		s.save(z);
+		s.flush();
+		z.setW(w2);
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		s = openSession();
+		s.update(z);
+		s.flush();
+		s.delete(z);
+		s.delete("from W");
+		s.flush();
+		s.connection().commit();
+		s.close();
+	}
+
+	public void testQueuedBagAdds() throws Exception {
+		Session s = openSession();
+		Assignable a = new Assignable();
+		a.setId("foo");
+		a.setCategories( new ArrayList() );
+		Category c = new Category();
+		c.setAssignable(a);
+		a.getCategories().add(c);
+		s.save(a);
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		getSessions().evictCollection("org.hibernate.test.legacy.Assignable.categories");
+
+		s = openSession();
+		a = (Assignable) s.get(Assignable.class, "foo");
+		c = new Category();
+		c.setAssignable(a);
+		a.getCategories().add(c);
+		assertFalse( Hibernate.isInitialized( a.getCategories() ) );
+		assertTrue( a.getCategories().size()==2 );
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		getSessions().evictCollection("org.hibernate.test.legacy.Assignable.categories");
+
+		s = openSession();
+		a = (Assignable) s.get(Assignable.class, "foo");
+		c = new Category();
+		c.setAssignable(a);
+		a.getCategories().add(c);
+		assertFalse( Hibernate.isInitialized( a.getCategories() ) );
+		s.flush();
+		assertFalse( Hibernate.isInitialized( a.getCategories() ) );
+		assertTrue( a.getCategories().size()==3 );
+		s.connection().commit();
+		s.close();
+
+		getSessions().evictCollection("org.hibernate.test.legacy.Assignable.categories");
+
+		s = openSession();
+		a = (Assignable) s.get(Assignable.class, "foo");
+		assertTrue( a.getCategories().size()==3 );
+		s.delete(a);
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+	}
+
+	public void testPolymorphicCriteria() throws Exception {
+		Session s = openSession();
+		Transaction txn = s.beginTransaction();
+		Category f = new Category();
+		Single b = new Single();
+		b.setId("asdfa");
+		b.setString("asdfasdf");
+		s.save(f);
+		s.save(b);
+		List list = s.createCriteria(Object.class).list();
+		assertTrue( list.size()==2 );
+		assertTrue( list.contains(f) && list.contains(b) );
+		s.delete(f);
+		s.delete(b);
+		txn.commit();
+		s.close();
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MasterDetailTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Medication.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Medication.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Medication.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,20 @@
+package org.hibernate.test.legacy;
+
+/**
+ * @author hbm2java
+ */
+public class Medication extends org.hibernate.test.legacy.Intervention {
+
+   org.hibernate.test.legacy.Drug prescribedDrug;
+
+  
+  org.hibernate.test.legacy.Drug getPrescribedDrug() {
+    return prescribedDrug;
+  }
+
+  void  setPrescribedDrug(org.hibernate.test.legacy.Drug newValue) {
+    prescribedDrug = newValue;
+  }
+
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Medication.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Middle.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Middle.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Middle.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+	
+<hibernate-mapping default-lazy="false">
+
+    <class name="org.hibernate.test.legacy.Inner" table="CID_IN">
+        <composite-id name="id">
+            <key-property name="akey" type="string" length="10" column="AKEY"/>
+            <key-property name="bkey" type="string" length="10" column="BKEY"/>
+        </composite-id>
+        <property name="dudu" length="10" column="DUDU" not-null="true" type="string"/>
+        <bag name="middles" lazy="true" inverse="true">
+        	<key>
+                <column length="10" name="AKEY"/>
+                <column length="10" name="BKEY"/>
+			</key>
+			<one-to-many class="org.hibernate.test.legacy.Middle"/>
+		</bag>
+		<many-to-one name="backOut">
+               <column name="BO_AKEY"/>
+               <column name="BO_BKEY"/>
+               <column name="BO_ONE"/>
+               <column name="BO_TWO"/>
+               <column name="BO_DET"/>
+ 		</many-to-one>	
+    </class>
+
+    <class name="org.hibernate.test.legacy.Middle" table="CID_MID">
+        <composite-id name="id">
+            <key-many-to-one name="sup">
+                <column length="10" name="AKEY"/>
+                <column length="10" name="BKEY"/>
+            </key-many-to-one>
+            <key-property name="one" type="string" length="10" column="ONE"/>
+            <key-property name="two" type="string" length="10" column="TWO"/>
+        </composite-id>
+        <property column="BLA" length="10" name="bla" not-null="true" type="string"/>
+    </class>
+
+    <class name="org.hibernate.test.legacy.Outer" table="CID_OUT">
+        <composite-id name="id">
+            <key-many-to-one name="master">
+                <column length="10" name="AKEY"/>
+                <column length="10" name="BKEY"/>
+                <column length="10" name="ONE"/>
+                <column length="10" name="TWO"/>
+            </key-many-to-one>
+            <key-property name="detailId" type="string" column="ID" length="10"/>
+        </composite-id>
+        <property name="bubu" column="BUBU" length="10" type="string"/>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Middle.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Middle.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Middle.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Middle.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,42 @@
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+
+/**
+ * @author Stefano Travelli
+ */
+public class Middle implements Serializable {
+	private MiddleKey id;
+	private String bla;
+
+	public MiddleKey getId() {
+		return id;
+	}
+
+	public void setId(MiddleKey id) {
+		this.id = id;
+	}
+
+	public String getBla() {
+		return bla;
+	}
+
+	public void setBla(String bla) {
+		this.bla = bla;
+	}
+
+	public boolean equals(Object o) {
+		if (this == o) return true;
+		if (!(o instanceof Middle)) return false;
+
+		final Middle cidMaster = (Middle) o;
+
+		if (id != null ? !id.equals(cidMaster.id) : cidMaster.id != null) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		return (id != null ? id.hashCode() : 0);
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Middle.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MiddleKey.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MiddleKey.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MiddleKey.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,57 @@
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+
+/**
+ * @author Stefano Travelli
+ */
+public class MiddleKey implements Serializable {
+	private Inner sup;
+	private String one;
+	private String two;
+
+	public String getOne() {
+		return one;
+	}
+
+	public void setOne(String one) {
+		this.one = one;
+	}
+
+	public String getTwo() {
+		return two;
+	}
+
+	public void setTwo(String two) {
+		this.two = two;
+	}
+
+	public Inner getSup() {
+		return sup;
+	}
+
+	public void setSup(Inner sup) {
+		this.sup = sup;
+	}
+
+	public boolean equals(Object o) {
+		if (this == o) return true;
+		if (!(o instanceof MiddleKey)) return false;
+
+		final MiddleKey cidMasterID = (MiddleKey) o;
+
+		if (one != null ? !one.equals(cidMasterID.one) : cidMasterID.one != null) return false;
+		if (sup != null ? !sup.equals(cidMasterID.sup) : cidMasterID.sup != null) return false;
+		if (two != null ? !two.equals(cidMasterID.two) : cidMasterID.two != null) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		int result;
+		result = (sup != null ? sup.hashCode() : 0);
+		result = 29 * result + (one != null ? one.hashCode() : 0);
+		result = 29 * result + (two != null ? two.hashCode() : 0);
+		return result;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MiddleKey.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Mono.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Mono.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Mono.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,42 @@
+//$Id: Mono.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.util.Set;
+
+
+public class Mono extends Top {
+	
+	private Set strings;
+
+	/**
+	 * Constructor for Mono.
+	 * @param c
+	 */
+	public Mono(int c) {
+		super(c);
+	}
+
+	/**
+	 * Constructor for Mono.
+	 */
+	public Mono() {
+		super();
+	}
+
+	/**
+	 * Returns the strings.
+	 * @return Set
+	 */
+	public Set getStrings() {
+		return strings;
+	}
+
+	/**
+	 * Sets the strings.
+	 * @param strings The strings to set
+	 */
+	public void setStrings(Set strings) {
+		this.strings = strings;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Mono.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MoreStuff.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MoreStuff.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MoreStuff.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,92 @@
+//$Id: MoreStuff.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+import java.util.Collection;
+
+
+public class MoreStuff implements Serializable {
+	private String stringId;
+	private int intId;
+	private Collection stuffs;
+	private String name;
+	
+	public boolean equals(Object other) {
+		return ( (MoreStuff) other ).getIntId()==intId && ( (MoreStuff) other ).getStringId().equals(stringId);
+	}
+	
+	public int hashCode() {
+		return stringId.hashCode();
+	}
+	
+	/**
+	 * Returns the stuffs.
+	 * @return Collection
+	 */
+	public Collection getStuffs() {
+		return stuffs;
+	}
+	
+	/**
+	 * Sets the stuffs.
+	 * @param stuffs The stuffs to set
+	 */
+	public void setStuffs(Collection stuffs) {
+		this.stuffs = stuffs;
+	}
+	
+	/**
+	 * Returns the name.
+	 * @return String
+	 */
+	public String getName() {
+		return name;
+	}
+	
+	/**
+	 * Sets the name.
+	 * @param name The name to set
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	/**
+	 * Returns the intId.
+	 * @return int
+	 */
+	public int getIntId() {
+		return intId;
+	}
+	
+	/**
+	 * Returns the stringId.
+	 * @return String
+	 */
+	public String getStringId() {
+		return stringId;
+	}
+	
+	/**
+	 * Sets the intId.
+	 * @param intId The intId to set
+	 */
+	public void setIntId(int intId) {
+		this.intId = intId;
+	}
+	
+	/**
+	 * Sets the stringId.
+	 * @param stringId The stringId to set
+	 */
+	public void setStringId(String stringId) {
+		this.stringId = stringId;
+	}
+	
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MoreStuff.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Multi.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Multi.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Multi.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,101 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-lazy="false">
+
+    <class 
+    	name="org.hibernate.test.legacy.Top" 
+    	table="rootclass" 
+    	dynamic-insert="true" 
+    	dynamic-update="true"
+    	select-before-update="true"
+    	where="id1_ is not null">
+        <!--cache-->
+        <id name="id" type="long" column="id1_" unsaved-value="0">
+            <generator class="native"/>
+        </id>
+        <version name="count" column="count_"/>
+        <property name="name"/>
+        <property name="address"/>
+        <property name="date" column="date_"/>
+        <many-to-one name="top" access="field" column="top_"/>
+                
+        <joined-subclass name="org.hibernate.test.legacy.TrivialClass">
+        	<key column="tcid"/>
+        </joined-subclass>
+        
+	    <joined-subclass 
+	    	name="org.hibernate.test.legacy.Lower" 
+	    	table="leafsubclass"
+	    	dynamic-insert="true" 
+    		dynamic-update="true">
+	        <key column="id__"/>
+	        <property name="intprop" not-null="true"/>
+	        <one-to-one name="other" class="org.hibernate.test.legacy.Lower"/>
+	        <many-to-one name="another" column="other1" class="org.hibernate.test.legacy.Top"/>
+	        <many-to-one name="yetanother" column="other3" class="org.hibernate.test.legacy.Lower"/>
+	        <property name="foo"/>
+	        <set name="set" lazy="false">
+	        	<key column="parent"/>
+	        	<one-to-many class="org.hibernate.test.legacy.Top"/>
+	        </set>
+	        <bag name="bag" lazy="true" table="simple_simple">
+	        	<key column="simple1"/>
+	        	<many-to-many column="simple2" class="org.hibernate.test.legacy.Top"/>
+	        </bag>
+	        <one-to-one name="mypo"/>
+	    </joined-subclass>
+	    
+	    <joined-subclass name="org.hibernate.test.legacy.Multi" table="nonleafsubclass">
+	    	<key column="sid" on-delete="cascade"/>
+	        <property name="extraProp" column="dupe"/>
+	        <many-to-one name="other" column="other2" class="org.hibernate.test.legacy.Multi" />
+	        <many-to-one name="po"/>
+	        <property name="derived" formula="upper(dupe)"/>
+	        
+	        <component name="comp" class="org.hibernate.test.legacy.Multi$Component">
+	        	<property name="cal"/>
+	        	<property name="floaty"/>
+	        </component>
+	        
+	        <joined-subclass name="org.hibernate.test.legacy.SubMulti" table="leafsubsubclass">
+	        	<key column="sid"/>
+	        	<property name="amount" column="dupe"/>
+	        	<bag name="children" lazy="true" inverse="true">
+	        		<key column="parent"/>
+	        		<one-to-many class="org.hibernate.test.legacy.SubMulti"/>
+	        	</bag>
+	        	<many-to-one name="parent"/>
+				<list name="moreChildren" lazy="true">
+	        		<key column="another_parent"/>
+	        		<index column="list_ind"/>
+	        		<one-to-many class="org.hibernate.test.legacy.SubMulti"/>
+	        	</list>
+	        </joined-subclass>
+	        
+	    </joined-subclass>
+
+    </class>
+    
+    <class 
+    	name="org.hibernate.test.legacy.Po"
+    	dynamic-insert="true">
+    	<id type="long" column="id_">
+    		<generator class="native"/>
+    	</id>
+    	<property name="value" column="value_"/>
+    	<list name="list" cascade="all">
+    		<key column="list_po"/>
+    		<index column="i"/>
+    		<one-to-many class="org.hibernate.test.legacy.SubMulti"/>
+    	</list>
+    	<set name="set" inverse="true" cascade="all">
+    		<key column="po"/>
+    		<one-to-many class="org.hibernate.test.legacy.Multi"/>
+    	</set>
+    	<many-to-one name="top" column="tl" insert="false" update="false"/>
+    	<many-to-one name="lower" column="tl"/>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Multi.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Multi.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Multi.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Multi.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,120 @@
+//$Id: Multi.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.util.Calendar;
+
+
+public class Multi extends Top {
+	
+	/**
+	 * Constructor for Multi.
+	 */
+	public Multi() {
+		super();
+	}
+	
+	private String extraProp;
+	private String derived;
+	private Component comp;
+	private Po po;
+	
+	/**
+	 * Returns the extraProp.
+	 * @return String
+	 */
+	public String getExtraProp() {
+		return extraProp;
+	}
+	
+	/**
+	 * Sets the extraProp.
+	 * @param extraProp The extraProp to set
+	 */
+	public void setExtraProp(String extraProp) {
+		this.extraProp = extraProp;
+	}
+	
+	public static final class Component {
+		private Calendar cal;
+		private Float floaty;
+		/**
+		 * Returns the cal.
+		 * @return Calendar
+		 */
+		public Calendar getCal() {
+			return cal;
+		}
+		
+		/**
+		 * Sets the cal.
+		 * @param cal The cal to set
+		 */
+		public void setCal(Calendar cal) {
+			this.cal = cal;
+		}
+		
+		/**
+		 * Returns the floaty.
+		 * @return Float
+		 */
+		public Float getFloaty() {
+			return floaty;
+		}
+		
+		/**
+		 * Sets the floaty.
+		 * @param floaty The floaty to set
+		 */
+		public void setFloaty(Float floaty) {
+			this.floaty = floaty;
+		}
+		
+	}
+	
+	/**
+	 * Returns the comp.
+	 * @return Component
+	 */
+	public Component getComp() {
+		return comp;
+	}
+	
+	/**
+	 * Sets the comp.
+	 * @param comp The comp to set
+	 */
+	public void setComp(Component comp) {
+		this.comp = comp;
+	}
+	
+	/**
+	 * Returns the po.
+	 * @return Po
+	 */
+	public Po getPo() {
+		return po;
+	}
+	
+	/**
+	 * Sets the po.
+	 * @param po The po to set
+	 */
+	public void setPo(Po po) {
+		this.po = po;
+	}
+	
+	public String getDerived() {
+		return derived;
+	}
+
+	public void setDerived(String derived) {
+		this.derived = derived;
+	}
+
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Multi.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MultiExtends.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MultiExtends.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MultiExtends.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-lazy="false">
+
+        <joined-subclass 
+        	name="org.hibernate.test.legacy.Mono" 
+        	extends="org.hibernate.test.legacy.Top"
+        	table="mono"
+        	dynamic-insert="true" 
+    		dynamic-update="true">
+        	<key column="superid"/>
+        	<set name="strings" table="monostrings">
+        		<key column="monoid_"/>
+        		<element type="string" column="str_" not-null="true"/>
+        	</set>
+        </joined-subclass>
+
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MultiExtends.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MultiTableTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MultiTableTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MultiTableTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,641 @@
+//$Id: MultiTableTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import junit.framework.Test;
+
+import org.hibernate.Criteria;
+import org.hibernate.FetchMode;
+import org.hibernate.LockMode;
+import org.hibernate.Transaction;
+import org.hibernate.classic.Session;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.dialect.MySQLDialect;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+
+public class MultiTableTest extends LegacyTestCase {
+
+	public MultiTableTest(String arg0) {
+		super(arg0);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "legacy/Multi.hbm.xml", "legacy/MultiExtends.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( MultiTableTest.class );
+	}
+
+	public void testCriteria() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Lower l = new Lower();
+		s.save(l);
+		assertTrue( l==s.createCriteria(Top.class).uniqueResult() );
+		s.delete(l);
+		s.flush();
+		Criteria c = s.createCriteria(Lower.class);
+		c.createCriteria("yetanother")
+			.add( Restrictions.isNotNull("id") )
+			.createCriteria("another");
+		c.createCriteria("another").add( Restrictions.isNotNull("id") );
+		c.list();
+		t.commit();
+		s.close();
+	}
+
+	public void testFetchOneToMany() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		s.createCriteria(Po.class).setFetchMode("set", FetchMode.JOIN).list();
+		s.createCriteria(Po.class).setFetchMode("list", FetchMode.JOIN).list();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testNarrow() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		s.createQuery("from Po po, Lower low where low.mypo = po").list();
+		s.createQuery("from Po po join po.set as sm where sm.amount > 0").list();
+		s.createQuery("from Po po join po.top as low where low.foo = 'po'").list();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testJoins() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		s.createQuery( "from Lower l join l.yetanother l2 where lower(l2.name) > 'a'" ).list();
+		s.createQuery( "from Lower l where lower(l.yetanother.top.name) > 'a'" ).list();
+		s.createQuery( "from SubMulti sm join sm.children smc where smc.name > 'a'" ).list();
+		s.createQuery( "select s, ya from Lower s join s.yetanother ya" ).list();
+		s.createQuery( "from Lower s1 join s1.bag s2" ).list();
+		s.createQuery( "from Lower s1 left join s1.bag s2" ).list();
+		s.createQuery( "select s, a from Lower s join s.another a" ).list();
+		s.createQuery( "select s, a from Lower s left join s.another a" ).list();
+		s.createQuery( "from Top s, Lower ls" ).list();
+		s.createQuery( "from Lower ls join ls.set s where s.name > 'a'" ).list();
+		s.createQuery( "from Po po join po.list sm where sm.name > 'a'" ).list();
+		s.createQuery( "from Lower ls inner join ls.another s where s.name is not null" ).list();
+		s.createQuery( "from Lower ls where ls.other.another.name is not null" ).list();
+		s.createQuery( "from Multi m where m.derived like 'F%'" ).list();
+		s.createQuery( "from SubMulti m where m.derived like 'F%'" ).list();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testSubclassCollection() throws Exception {
+		//if ( getDialect() instanceof HSQLDialect ) return; //TODO: figure out why!?
+		Session s = openSession();
+		s.beginTransaction();
+		SubMulti sm = new SubMulti();
+		SubMulti sm1 = new SubMulti();
+		SubMulti sm2 = new SubMulti();
+		ArrayList list = new ArrayList();
+		ArrayList anotherList = new ArrayList();
+		sm.setChildren(list);
+		sm.setMoreChildren(anotherList);
+		sm.setExtraProp("foo");
+		list.add(sm1);
+		list.add(sm2);
+		anotherList.add(sm1);
+		anotherList.add(sm2);
+		sm1.setParent(sm);
+		sm2.setParent(sm);
+		Serializable id = s.save(sm);
+		s.save(sm1);
+		s.save(sm2);
+		s.getTransaction().commit();
+		s.close();
+
+		getSessions().evict(SubMulti.class);
+
+		s = openSession();
+		s.beginTransaction();
+		s.connection().createStatement().executeQuery(
+			"select * from leafsubsubclass sm, nonleafsubclass m, rootclass s where sm.sid=m.sid and sm.sid=s.id1_ and sm.sid=1"
+		).next();
+		assertTrue(
+				s.createQuery(
+						"select s from SubMulti as sm join sm.children as s where s.amount>-1 and s.name is null"
+				).list().size()==2 );
+		s.createQuery( "select c from SubMulti sm join sm.children c" ).list();
+		assertTrue( s.createQuery( "select elements(sm.children) from SubMulti as sm" ).list().size()==2 );
+		assertTrue(
+				s.createQuery(
+						"select distinct sm from SubMulti as sm join sm.children as s where s.amount>-1 and s.name is null"
+				).list().size()==1 );
+		sm = (SubMulti) s.load(SubMulti.class, id);
+		assertTrue( sm.getChildren().size()==2 );
+		assertEquals(
+			s.createFilter( sm.getMoreChildren(), "select count(*) where this.amount>-1 and this.name is null" ).list().get(0),
+			new Long(2)
+		);
+		assertEquals( "FOO", sm.getDerived() );
+		assertSame(
+				s.createQuery( "select distinct s from SubMulti s where s.moreChildren[1].amount < 1.0" ).iterate().next(),
+			sm
+		);
+		assertTrue( sm.getMoreChildren().size()==2 );
+		s.delete(sm);
+		Iterator iter = sm.getChildren().iterator();
+		while ( iter.hasNext() ) {
+			s.delete( iter.next() );
+		}
+		s.flush();
+		s.getTransaction().commit();
+		s.close();
+
+	}
+
+	public void testCollectionOnly() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Mono m = new Mono();
+		Long id = (Long) s.save(m);
+		t.commit();
+		s.close();
+		s = openSession();
+		t = s.beginTransaction();
+		s.update(m, id);
+		s.flush();
+		m.setAddress("foo bar");
+		s.flush();
+		s.delete(m);
+		t.commit();
+		s.close();
+	}
+
+	public void testQueries() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Long id = ( Long ) s.save( new TrivialClass() );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		TrivialClass tc = (TrivialClass) s.load(TrivialClass.class, id);
+		s.createQuery( "from TrivialClass s where s.id = 2" ).list();
+		s.createQuery( "select t.count from Top t" ).list();
+		s.createQuery( "from Lower s where s.another.name='name'" ).list();
+		s.createQuery( "from Lower s where s.yetanother.name='name'" ).list();
+		s.createQuery( "from Lower s where s.yetanother.name='name' and s.yetanother.foo is null" ).list();
+		s.createQuery( "from Top s where s.count=1" ).list();
+		s.createQuery( "select s.count from Top s, Lower ls where ls.another=s" ).list();
+		s.createQuery( "select elements(ls.bag), elements(ls.set) from Lower ls" ).list();
+		s.createQuery( "from Lower" ).iterate();
+		s.createQuery( "from Top" ).iterate();
+		s.delete(tc);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testConstraints() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		SubMulti sm = new SubMulti();
+		sm.setAmount(66.5f);
+		s.save( sm );
+		t.commit();
+		s.close();
+
+		s = openSession();
+//		doDelete( s, "from SubMulti" );
+//		t = s.beginTransaction();
+		t = s.beginTransaction();
+		doDelete( s, "from SubMulti" );
+		t.commit();
+		s.close();
+	}
+
+	public void testMultiTable() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Multi multi = new Multi();
+		multi.setExtraProp("extra");
+		multi.setName("name");
+		Top simp = new Top();
+		simp.setDate( new Date() );
+		simp.setName("simp");
+
+		Serializable mid = s.save(multi);
+		Serializable sid = s.save(simp);
+
+		SubMulti sm = new SubMulti();
+		sm.setAmount(66.5f);
+		Serializable smid = s.save(sm);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		multi.setExtraProp( multi.getExtraProp() + "2" );
+		//multi.setCount( multi.getCount() + 1 );
+		multi.setName("new name");
+		s.update(multi, mid);
+		simp.setName("new name");
+		s.update(simp, sid);
+		sm.setAmount(456.7f);
+		s.update(sm, smid);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		multi = (Multi) s.load(Multi.class, mid);
+		assertTrue( multi.getExtraProp().equals("extra2") );
+		multi.setExtraProp( multi.getExtraProp() + "3" );
+		//multi.setCount( multi.getCount() + 1 );
+		assertTrue( multi.getName().equals("new name") );
+		multi.setName("newer name");
+		sm = (SubMulti) s.load(SubMulti.class, smid);
+		assertTrue( sm.getAmount()==456.7f );
+		sm.setAmount(23423f);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		multi = (Multi) s.load(Top.class, mid);
+		simp = (Top) s.load(Top.class, sid);
+		assertTrue( ! (simp instanceof Multi) );
+		assertTrue( multi.getExtraProp().equals("extra23") );
+		//multi.setCount( multi.getCount() + 1 );
+		assertTrue( multi.getName().equals("newer name") );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Iterator iter = s.createQuery( "select\n\nt from Top t where t.count>0" ).iterate();
+		boolean foundSimp = false;
+		boolean foundMulti = false;
+		boolean foundSubMulti = false;
+		while ( iter.hasNext() ) {
+			Object o = iter.next();
+			if ( ( o instanceof Top ) && !( o instanceof Multi) ) foundSimp = true;
+			if ( o instanceof Multi && !(o instanceof SubMulti) ) foundMulti = true;
+			if ( o instanceof SubMulti ) foundSubMulti = true;
+		}
+		assertTrue( foundSimp&&foundMulti&&foundSubMulti );
+		s.createQuery( "from Multi m where m.count>0 and m.extraProp is not null" ).list();
+		s.createQuery( "from Top m where m.count>0 and m.name is not null" ).list();
+		s.createQuery( "from Lower m where m.other is not null" ).list();
+		s.createQuery( "from Multi m where m.other.id = 1" ).list();
+		s.createQuery( "from SubMulti m where m.amount > 0.0" ).list();
+
+		assertTrue(
+				s.createQuery( "from Multi" ).list().size()==2
+		);
+		assertTrue(
+				s.createQuery( "from Multi m where m.class = SubMulti" ).list().size()==1
+		);
+		assertTrue(
+				s.createQuery( "from Top m where m.class = Multi" ).list().size()==1
+		);
+		assertTrue(
+				s.createQuery( "from Top" ).list().size()==3
+		);
+		assertTrue(
+				s.createQuery( "from Lower" ).list().size()==0
+		);
+		assertTrue(
+				s.createQuery( "from SubMulti" ).list().size()==1
+		);
+
+		s.createQuery( "from Lower ls join ls.bag s where s.id is not null" ).list();
+		s.createQuery( "from Lower ls join ls.set s where s.id is not null" ).list();
+		if ( !(getDialect() instanceof MySQLDialect) )
+			s.createQuery( "from SubMulti sm where exists elements(sm.children)" ).list();
+
+		List l = s.createCriteria(Top.class).list();
+		assertTrue( l.size()==3 );
+		assertTrue( s.createCriteria(SubMulti.class).list().size()==1 );
+		assertTrue(
+			s.createCriteria(SubMulti.class)
+				.add( Restrictions.lt("amount", new Float(0)) )
+				.list()
+				.size()==0
+		);
+		assertTrue(
+			s.createCriteria(SubMulti.class)
+				.add( Restrictions.ge("amount", new Float(0)) )
+				.list()
+				.size()==1
+		);
+
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		multi = (Multi) s.load(Top.class, mid, LockMode.UPGRADE);
+		simp = (Top) s.load(Top.class, sid);
+		s.lock(simp, LockMode.UPGRADE_NOWAIT);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.update(multi, mid);
+		s.delete(multi);
+		assertEquals( 2, doDelete( s, "from Top" ) );
+		t.commit();
+		s.close();
+
+	}
+
+	public void testMultiTableGeneratedId() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Multi multi = new Multi();
+		multi.setExtraProp("extra");
+		//multi.setCount(666);
+		multi.setName("name");
+		Top simp = new Top();
+		simp.setDate( new Date() );
+		simp.setName("simp");
+		//simp.setCount(132);
+		Serializable multiId = s.save( multi );
+		Serializable simpId = s.save( simp );
+		SubMulti sm = new SubMulti();
+		sm.setAmount(66.5f);
+		Serializable smId = s.save( sm );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		multi.setExtraProp( multi.getExtraProp() + "2" );
+		//multi.setCount( multi.getCount() + 1 );
+		multi.setName("new name");
+		s.update( multi, multiId );
+		simp.setName("new name");
+		s.update( simp, simpId );
+		sm.setAmount(456.7f);
+		s.update( sm, smId );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		multi = (Multi) s.load( Multi.class, multiId );
+		assertTrue( multi.getExtraProp().equals("extra2") );
+		multi.setExtraProp( multi.getExtraProp() + "3" );
+		//multi.setCount( multi.getCount() + 1 );
+		assertTrue( multi.getName().equals("new name") );
+		multi.setName("newer name");
+		sm = (SubMulti) s.load( SubMulti.class, smId );
+		assertTrue( sm.getAmount()==456.7f );
+		sm.setAmount(23423f);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		multi = (Multi) s.load( Top.class, multiId );
+		simp = (Top) s.load( Top.class, simpId );
+		assertTrue( ! (simp instanceof Multi) );
+		assertTrue( multi.getExtraProp().equals("extra23") );
+		//multi.setCount( multi.getCount() + 1 );
+		assertTrue( multi.getName().equals("newer name") );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Iterator iter = s.createQuery( "select\n\nt from Top t where t.count>0" ).iterate();
+		boolean foundSimp = false;
+		boolean foundMulti = false;
+		boolean foundSubMulti = false;
+		while ( iter.hasNext() ) {
+			Object o = iter.next();
+			if ( ( o instanceof Top ) && !( o instanceof Multi) ) foundSimp = true;
+			if ( o instanceof Multi && !(o instanceof SubMulti) ) foundMulti = true;
+			if ( o instanceof SubMulti ) foundSubMulti = true;
+		}
+		assertTrue( foundSimp&&foundMulti&&foundSubMulti );
+		s.createQuery( "from Multi m where m.count>0 and m.extraProp is not null" ).list();
+		s.createQuery( "from Top m where m.count>0 and m.name is not null" ).list();
+		s.createQuery( "from Lower m where m.other is not null" ).list();
+		s.createQuery( "from Multi m where m.other.id = 1" ).list();
+		s.createQuery( "from SubMulti m where m.amount > 0.0" ).list();
+
+		assertTrue(
+				s.createQuery( "from Multi" ).list().size()==2
+		);
+		/*assertTrue(
+			s.find("from m in class Multi where m.class = Multi").size()==1
+		);*/
+		assertTrue(
+				s.createQuery( "from Top" ).list().size()==3
+		);
+		assertTrue(
+				s.createQuery( "from Lower" ).list().size()==0
+		);
+		assertTrue(
+				s.createQuery( "from SubMulti" ).list().size()==1
+		);
+
+		s.createQuery( "from Lower ls join ls.bag s where s.id is not null" ).list();
+		if ( !(getDialect() instanceof MySQLDialect) )
+			s.createQuery( "from SubMulti sm where exists elements(sm.children)" ).list();
+
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		multi = (Multi) s.load( Top.class, multiId, LockMode.UPGRADE );
+		simp = (Top) s.load( Top.class, simpId );
+		s.lock(simp, LockMode.UPGRADE_NOWAIT);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.update( multi, multiId );
+		s.delete(multi);
+		assertEquals( 2, doDelete( s, "from Top" ) );
+		t.commit();
+		s.close();
+
+	}
+
+	public void testMultiTableCollections() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		assertTrue( s.createQuery( "from Top" ).list().size()==0 );
+		Multi multi = new Multi();
+		multi.setExtraProp("extra");
+		multi.setName("name");
+		Top simp = new Top();
+		simp.setDate( new Date() );
+		simp.setName("simp");
+
+		s.save(multi);
+		s.save(simp);
+
+		Lower ls = new Lower();
+		ls.setOther(ls);
+		ls.setAnother(ls);
+		ls.setYetanother(ls);
+		ls.setName("Less Simple");
+		Set set = new HashSet();
+		ls.setSet(set);
+		set.add(multi);
+		set.add(simp);
+		Serializable id = s.save(ls);
+		t.commit();
+		s.close();
+		assertTrue( ls.getOther()==ls && ls.getAnother()==ls && ls.getYetanother()==ls );
+
+		s = openSession();
+		t = s.beginTransaction();
+		ls = (Lower) s.load(Lower.class, id);
+		assertTrue( ls.getOther()==ls && ls.getAnother()==ls && ls.getYetanother()==ls );
+		assertTrue( ls.getSet().size()==2 );
+		Iterator iter = ls.getSet().iterator();
+		int foundMulti = 0;
+		int foundSimple = 0;
+		while ( iter.hasNext() ) {
+			Object o = iter.next();
+			if ( o instanceof Top ) foundSimple++;
+			if ( o instanceof Multi ) foundMulti++;
+		}
+		assertTrue( foundSimple==2 && foundMulti==1 );
+		assertEquals( 3, doDelete( s, "from Top" ) );
+		t.commit();
+		s.close();
+	}
+
+	public void testMultiTableManyToOne() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		assertTrue( s.createQuery( "from Top" ).list().size()==0 );
+		Multi multi = new Multi();
+		multi.setExtraProp("extra");
+		multi.setName("name");
+		Top simp = new Top();
+		simp.setDate( new Date() );
+		simp.setName("simp");
+		s.save(multi);
+		Lower ls = new Lower();
+		ls.setOther(ls);
+		ls.setAnother(multi);
+		ls.setYetanother(ls);
+		ls.setName("Less Simple");
+		Serializable id = s.save(ls);
+		t.commit();
+		s.close();
+		assertTrue( ls.getOther()==ls && ls.getAnother()==multi && ls.getYetanother()==ls );
+
+		s = openSession();
+		t = s.beginTransaction();
+		ls = (Lower) s.load(Lower.class, id);
+		assertTrue( ls.getOther()==ls && ls.getYetanother()==ls );
+		assertTrue( ls.getAnother().getName().equals("name") && ls.getAnother() instanceof Multi );
+		s.delete(ls);
+		s.delete( ls.getAnother() );
+		t.commit();
+		s.close();
+	}
+
+	public void testMultiTableNativeId() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Multi multi = new Multi();
+		multi.setExtraProp("extra");
+		Long id = (Long) s.save(multi);
+		assertTrue( id!=null );
+		s.delete(multi);
+		t.commit();
+		s.close();
+	}
+
+	public void testCollection() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Multi multi1 = new Multi();
+		multi1.setExtraProp("extra1");
+		Multi multi2 = new Multi();
+		multi2.setExtraProp("extra2");
+		Po po = new Po();
+		multi1.setPo(po); multi2.setPo(po);
+		po.setSet( new HashSet() );
+		po.getSet().add(multi1);
+		po.getSet().add(multi2);
+		po.setList( new ArrayList() );
+		//po.getList().add(null);
+		po.getList().add( new SubMulti() );
+		Serializable id = s.save(po);
+		assertTrue( id!=null );
+		t.commit();
+		s.close();
+		s = openSession();
+		t = s.beginTransaction();
+		po = (Po) s.load(Po.class, id);
+		assertTrue( po.getSet().size()==2 );
+		assertTrue( po.getList().size()==1 );
+		s.delete(po);
+		assertTrue( s.createQuery( "from Top" ).list().size()==0 );
+		t.commit();
+		s.close();
+	}
+
+	public void testOneToOne() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Lower ls = new Lower();
+		Serializable id = s.save(ls);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.load(Lower.class, id);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.delete( s.load(Lower.class, id) );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testCollectionPointer() throws Exception {
+		Session sess = openSession();
+		sess.beginTransaction();
+		Lower ls = new Lower();
+		List list = new ArrayList();
+		ls.setBag(list);
+		Top s = new Top();
+		Serializable id = sess.save(ls);
+		sess.save(s);
+		sess.flush();
+		list.add(s);
+		sess.getTransaction().commit();
+		sess.close();
+
+		sess = openSession();
+		sess.beginTransaction();
+		ls = (Lower) sess.load(Lower.class, id);
+		assertTrue( ls.getBag().size()==1 );
+		doDelete( sess, "from java.lang.Object" );
+		sess.getTransaction().commit();
+		sess.close();
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MultiTableTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Multiplicity.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Multiplicity.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Multiplicity.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,9 @@
+//$Id: Multiplicity.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+
+public class Multiplicity implements Serializable {
+	public int count;
+	public GlarchProxy glarch;
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Multiplicity.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MultiplicityType.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MultiplicityType.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MultiplicityType.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,152 @@
+//$Id: MultiplicityType.java 6592 2005-04-28 15:44:16Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+import org.hibernate.Hibernate;
+import org.hibernate.HibernateException;
+import org.hibernate.engine.ForeignKeys;
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.type.IntegerType;
+import org.hibernate.type.StringType;
+import org.hibernate.type.Type;
+import org.hibernate.usertype.CompositeUserType;
+
+public class MultiplicityType implements CompositeUserType {
+
+	private static final String[] PROP_NAMES = new String[] {
+		"count", "glarch"
+	};
+	private static final int[] SQL_TYPES = new int[] {
+		IntegerType.INSTANCE.getSqlTypeDescriptor().getSqlType(), StringType.INSTANCE.getSqlTypeDescriptor().getSqlType()
+	};
+	private static final Type[] TYPES = new Type[] {
+		IntegerType.INSTANCE, Hibernate.entity(Glarch.class)
+	};
+
+	public String[] getPropertyNames() {
+		return PROP_NAMES;
+	}
+
+	public Type[] getPropertyTypes() {
+		return TYPES;
+	}
+
+	public int hashCode(Object x) throws HibernateException {
+		Multiplicity o = (Multiplicity) x;
+		return o.count + o.glarch.hashCode();
+	}
+
+	public Object getPropertyValue(Object component, int property) {
+		Multiplicity o = (Multiplicity) component;
+		return property==0 ?
+			(Object) new Integer(o.count) :
+			(Object) o.glarch;
+	}
+
+	public void setPropertyValue(
+		Object component,
+		int property,
+		Object value) {
+
+		Multiplicity o = (Multiplicity) component;
+		if (property==0) {
+			o.count = ( (Integer) value ).intValue();
+		}
+		else {
+			o.glarch = (Glarch) value;
+		}
+	}
+
+	public int[] sqlTypes() {
+		return SQL_TYPES;
+	}
+
+	public Class returnedClass() {
+		return Multiplicity.class;
+	}
+
+	public boolean equals(Object x, Object y) {
+		Multiplicity mx = (Multiplicity) x;
+		Multiplicity my = (Multiplicity) y;
+		if (mx==my) return true;
+		if (mx==null || my==null) return false;
+		return mx.count==my.count && mx.glarch==my.glarch;
+	}
+
+	public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner)
+		throws HibernateException, SQLException {
+
+		Integer c = (Integer) IntegerType.INSTANCE.nullSafeGet( rs, names[0], session );
+		GlarchProxy g = (GlarchProxy) Hibernate.entity(Glarch.class).nullSafeGet(rs, names[1], session, owner);
+		Multiplicity m = new Multiplicity();
+		m.count = c==null ? 0 : c.intValue();
+		m.glarch = g;
+		return m;
+	}
+
+	public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session)
+		throws HibernateException, SQLException {
+
+		Multiplicity o = (Multiplicity) value;
+		GlarchProxy g;
+		Integer c;
+		if (o==null) {
+			g=null;
+			c=new Integer(0);
+		}
+		else {
+			g = o.glarch;
+			c = new Integer(o.count);
+		}
+		Hibernate.INTEGER.nullSafeSet(st, c, index, session);
+		Hibernate.entity(Glarch.class).nullSafeSet(st, g, index+1, session);
+
+	}
+
+	public Object deepCopy(Object value) {
+		if (value==null) return null;
+		Multiplicity v = (Multiplicity) value;
+		Multiplicity m = new Multiplicity();
+		m.count = v.count;
+		m.glarch = v.glarch;
+		return m;
+	}
+
+	public boolean isMutable() {
+		return true;
+	}
+
+	public Object assemble(
+		Serializable cached,
+		SessionImplementor session,
+		Object owner) throws HibernateException {
+		if (cached==null) return null;
+		Serializable[] o = (Serializable[]) cached;
+		Multiplicity m = new Multiplicity();
+		m.count = ( (Integer) o[0] ).intValue();
+		m.glarch = o[1]==null ? 
+			null : 
+			(GlarchProxy) session.internalLoad( Glarch.class.getName(), o[1], false, false );
+		return m;
+	}
+
+	public Serializable disassemble(Object value, SessionImplementor session)
+	throws HibernateException {
+		if (value==null) return null;
+		Multiplicity m = (Multiplicity) value;
+		return new Serializable[] { 
+				new Integer(m.count), 
+				ForeignKeys.getEntityIdentifierIfNotUnsaved( Glarch.class.getName(), m.glarch, session ) 
+		};
+	}
+
+	public Object replace(Object original, Object target, SessionImplementor session, Object owner) 
+	throws HibernateException {
+		return assemble( disassemble(original, session), session, owner);
+	}
+	
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/MultiplicityType.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Nameable.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Nameable.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Nameable.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-lazy="false">
+
+    <class name="org.hibernate.test.legacy.Nameable">
+        <id name="key" column="key_">
+        	<generator class="native"/>
+         </id>
+        <discriminator column="clazz"/>
+        <property name="name"/>
+        <subclass name="org.hibernate.test.legacy.BasicNameable"/>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Nameable.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Nameable.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Nameable.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Nameable.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,18 @@
+//$Id: Nameable.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+/**
+ *
+ */
+public interface Nameable {
+	public String getName();
+	public void setName(String name);
+	public Long getKey();
+	public void setKey(Long key);
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Nameable.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Named.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Named.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Named.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,13 @@
+//$Id: Named.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+
+public interface Named {
+	public String getName();
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Named.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/NestingComponent.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/NestingComponent.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/NestingComponent.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,15 @@
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+
+public class NestingComponent implements Serializable {
+	private ComponentCollection nested;
+	public ComponentCollection getNested() {
+		return nested;
+	}
+
+	public void setNested(ComponentCollection collection) {
+		nested = collection;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/NestingComponent.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/NonReflectiveBinderTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/NonReflectiveBinderTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/NonReflectiveBinderTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,189 @@
+//$Id: NonReflectiveBinderTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.legacy;
+
+import java.util.Iterator;
+import java.util.Map;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.hibernate.cfg.Configuration;
+import org.hibernate.mapping.Bag;
+import org.hibernate.mapping.Collection;
+import org.hibernate.mapping.Component;
+import org.hibernate.mapping.MetaAttribute;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.Property;
+import org.hibernate.testing.junit.UnitTestCase;
+
+
+public class NonReflectiveBinderTest extends UnitTestCase {
+
+	private Configuration cfg;
+
+	public NonReflectiveBinderTest(String x) {
+		super( x );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "legacy/Wicked.hbm.xml"};
+	}
+
+	public static Test suite() {
+		return new TestSuite( NonReflectiveBinderTest.class );
+	}
+
+	protected void setUp() throws Exception {
+		super.setUp();
+		cfg = new Configuration()
+				.addResource( "org/hibernate/test/legacy/Wicked.hbm.xml" );
+		cfg.buildMappings();
+	}
+
+	protected void tearDown() throws Exception {
+		cfg = null;
+		super.tearDown();
+	}
+
+	public void testMetaInheritance() {
+		PersistentClass cm = cfg.getClassMapping("org.hibernate.test.legacy.Wicked");
+		Map m = cm.getMetaAttributes();
+		assertNotNull(m);
+		assertNotNull(cm.getMetaAttribute("global"));
+		assertNull(cm.getMetaAttribute("globalnoinherit"));
+		
+		MetaAttribute metaAttribute = cm.getMetaAttribute("implements");
+		assertNotNull(metaAttribute);
+		assertEquals("implements", metaAttribute.getName());
+		assertTrue(metaAttribute.isMultiValued());
+		assertEquals(3, metaAttribute.getValues().size());
+		assertEquals("java.lang.Observer",metaAttribute.getValues().get(0));
+		assertEquals("java.lang.Observer",metaAttribute.getValues().get(1));
+		assertEquals("org.foo.BogusVisitor",metaAttribute.getValues().get(2));
+				
+		/*Property property = cm.getIdentifierProperty();
+		property.getMetaAttribute(null);*/
+		
+		Iterator propertyIterator = cm.getPropertyIterator();
+		while (propertyIterator.hasNext()) {
+			Property element = (Property) propertyIterator.next();
+			System.out.println(element);
+			Map ma = element.getMetaAttributes();
+			assertNotNull(ma);
+			assertNotNull(element.getMetaAttribute("global"));
+			MetaAttribute metaAttribute2 = element.getMetaAttribute("implements");
+			assertNotNull(metaAttribute2);
+			assertNull(element.getMetaAttribute("globalnoinherit"));
+						
+		}
+		
+		Property element = cm.getProperty("component");
+		Map ma = element.getMetaAttributes();
+		assertNotNull(ma);
+		assertNotNull(element.getMetaAttribute("global"));
+		assertNotNull(element.getMetaAttribute("componentonly"));
+		assertNotNull(element.getMetaAttribute("allcomponent"));
+		assertNull(element.getMetaAttribute("globalnoinherit"));							
+		
+		MetaAttribute compimplements = element.getMetaAttribute("implements");
+		assertNotNull(compimplements);
+		assertEquals(compimplements.getValue(), "AnotherInterface");
+		
+		Property xp = ((Component)element.getValue()).getProperty( "x" );
+		MetaAttribute propximplements = xp.getMetaAttribute( "implements" );
+		assertNotNull(propximplements);
+		assertEquals(propximplements.getValue(), "AnotherInterface");
+		
+		
+	}
+
+	// HBX-718
+	public void testNonMutatedInheritance() {
+		PersistentClass cm = cfg.getClassMapping("org.hibernate.test.legacy.Wicked");
+		MetaAttribute metaAttribute = cm.getMetaAttribute( "globalmutated" );
+		
+		assertNotNull(metaAttribute);
+		/*assertEquals( metaAttribute.getValues().size(), 2 );		
+		assertEquals( "top level", metaAttribute.getValues().get(0) );*/
+		assertEquals( "wicked level", metaAttribute.getValue() );
+		
+		Property property = cm.getProperty( "component" );
+		MetaAttribute propertyAttribute = property.getMetaAttribute( "globalmutated" );
+		
+		assertNotNull(propertyAttribute);
+		/*assertEquals( propertyAttribute.getValues().size(), 3 );
+		assertEquals( "top level", propertyAttribute.getValues().get(0) );
+		assertEquals( "wicked level", propertyAttribute.getValues().get(1) );*/
+		assertEquals( "monetaryamount level", propertyAttribute.getValue() );
+		
+		org.hibernate.mapping.Component component = (Component)property.getValue();
+		property = component.getProperty( "x" );
+		propertyAttribute = property.getMetaAttribute( "globalmutated" );
+		
+		assertNotNull(propertyAttribute);
+		/*assertEquals( propertyAttribute.getValues().size(), 4 );
+		assertEquals( "top level", propertyAttribute.getValues().get(0) );
+		assertEquals( "wicked level", propertyAttribute.getValues().get(1) );
+		assertEquals( "monetaryamount level", propertyAttribute.getValues().get(2) );*/
+		assertEquals( "monetaryamount x level", propertyAttribute.getValue() );
+		
+		property = cm.getProperty( "sortedEmployee" );
+		propertyAttribute = property.getMetaAttribute( "globalmutated" );
+		
+		assertNotNull(propertyAttribute);
+		/*assertEquals( propertyAttribute.getValues().size(), 3 );
+		assertEquals( "top level", propertyAttribute.getValues().get(0) );
+		assertEquals( "wicked level", propertyAttribute.getValues().get(1) );*/
+		assertEquals( "sortedemployee level", propertyAttribute.getValue() );
+		
+		property = cm.getProperty( "anotherSet" );
+		propertyAttribute = property.getMetaAttribute( "globalmutated" );
+		
+		assertNotNull(propertyAttribute);
+		/*assertEquals( propertyAttribute.getValues().size(), 2 );
+		assertEquals( "top level", propertyAttribute.getValues().get(0) );*/
+		assertEquals( "wicked level", propertyAttribute.getValue() );
+				
+		Bag bag = (Bag) property.getValue();
+		component = (Component)bag.getElement(); 
+		
+		assertEquals(4,component.getMetaAttributes().size());
+		
+		metaAttribute = component.getMetaAttribute( "globalmutated" );
+		/*assertEquals( metaAttribute.getValues().size(), 3 );
+		assertEquals( "top level", metaAttribute.getValues().get(0) );
+		assertEquals( "wicked level", metaAttribute.getValues().get(1) );*/
+		assertEquals( "monetaryamount anotherSet composite level", metaAttribute.getValue() );		
+		
+		property = component.getProperty( "emp" );
+		propertyAttribute = property.getMetaAttribute( "globalmutated" );
+		
+		assertNotNull(propertyAttribute);
+		/*assertEquals( propertyAttribute.getValues().size(), 4 );
+		assertEquals( "top level", propertyAttribute.getValues().get(0) );
+		assertEquals( "wicked level", propertyAttribute.getValues().get(1) );
+		assertEquals( "monetaryamount anotherSet composite level", propertyAttribute.getValues().get(2) );*/
+		assertEquals( "monetaryamount anotherSet composite property emp level", propertyAttribute.getValue() );
+		
+		
+		property = component.getProperty( "empinone" );
+		propertyAttribute = property.getMetaAttribute( "globalmutated" );
+		
+		assertNotNull(propertyAttribute);
+		/*assertEquals( propertyAttribute.getValues().size(), 4 );
+		assertEquals( "top level", propertyAttribute.getValues().get(0) );
+		assertEquals( "wicked level", propertyAttribute.getValues().get(1) );
+		assertEquals( "monetaryamount anotherSet composite level", propertyAttribute.getValues().get(2) );*/
+		assertEquals( "monetaryamount anotherSet composite property empinone level", propertyAttribute.getValue() );
+		
+		
+	}
+	
+	public void testComparator() {
+		PersistentClass cm = cfg.getClassMapping("org.hibernate.test.legacy.Wicked");
+		
+		Property property = cm.getProperty("sortedEmployee");
+		Collection col = (Collection) property.getValue();
+		assertEquals(col.getComparatorClassName(),"org.hibernate.test.legacy.NonExistingComparator");
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/NonReflectiveBinderTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Object2.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Object2.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Object2.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,50 @@
+<?xml version="1.0"?>
+
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping default-lazy="false">
+    <class
+        name="org.hibernate.test.legacy.Object2"
+        table="object2"
+        dynamic-update="false"
+        dynamic-insert="false"
+    >
+        <cache usage="read-write" />
+
+        <id
+            name="id"
+            column="id"
+            type="java.lang.Long"
+        >
+            <generator class="foreign">
+                <param name="property">belongsToMainObj</param>
+            </generator>
+        </id>
+
+        <property
+            name="dummy"
+            type="java.lang.String"
+            update="true"
+            insert="true"
+            column="xdummy"
+        />
+
+        <one-to-one
+            name="belongsToMainObj"
+            class="org.hibernate.test.legacy.MainObject"
+            cascade="none"
+            outer-join="auto"
+            constrained="true"
+        />
+
+        <!--
+            To add non XDoclet property mappings, create a file named
+                hibernate-properties-Object2.xml
+            containing the additional properties and place it in your merge dir.
+        -->
+
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Object2.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Object2.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Object2.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Object2.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,37 @@
+package org.hibernate.test.legacy;
+
+/**
+ * 
+ * @author Wolfgang Voelkl
+ * 
+ */
+public class Object2 {
+	private Long id;
+	private String dummy;
+	private MainObject belongsToMainObj;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long l) {
+		this.id = l;
+	}
+	
+	public String getDummy() {
+		return dummy;
+	}
+
+	public void setDummy(String string) {
+		dummy = string;
+	}
+
+	public MainObject getBelongsToMainObj() {
+		return belongsToMainObj;
+	}
+
+	public void setBelongsToMainObj(MainObject object) {
+		belongsToMainObj = object;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Object2.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/One.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/One.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/One.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping default-lazy="false">
+	<class name="org.hibernate.test.legacy.One" table="one">
+		<id name="key" column="one_key">
+			<generator class="native" />
+		</id>
+		<property name="x"/>
+		<property column="one_value" name="value"/>
+		<set name="manies" inverse="true" lazy="true">
+			<key column="one_key"/>
+			<one-to-many class="org.hibernate.test.legacy.Many"/>
+		</set>
+	</class>
+</hibernate-mapping>
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/One.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/One.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/One.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/One.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,49 @@
+//$Id: One.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.util.Set;
+
+public class One {
+	Long key;
+	String value;
+	Set manies;
+	private int x;
+	
+	public int getX() {
+		return x;
+	}
+	public void setX(int x) {
+		this.x = x;
+	}
+	
+	public void setKey(Long key) {
+		this.key = key;
+	}
+	
+	public Long getKey() {
+		return this.key;
+	}
+	
+	public void setValue(String value) {
+		this.value = value;
+	}
+	
+	public String getValue() {
+		return this.value;
+	}
+	
+	public Set getManies() {
+		return manies;
+	}
+	
+	public void setManies(Set manies) {
+		this.manies = manies;
+	}
+	
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/One.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/OneToOneCacheTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/OneToOneCacheTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/OneToOneCacheTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,120 @@
+//$Id: OneToOneCacheTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+
+import junit.framework.Test;
+
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Simple testcase to illustrate HB-992
+ *
+ * @author Wolfgang Voelkl, michael
+ */
+public class OneToOneCacheTest extends LegacyTestCase {
+
+	private Serializable generatedId;
+
+	public OneToOneCacheTest(String x) {
+		super( x );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "legacy/Object2.hbm.xml", "legacy/MainObject.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( OneToOneCacheTest.class );
+	}
+
+	public void testOneToOneCache() throws HibernateException {
+
+		//create a new MainObject
+		createMainObject();
+		// load the MainObject
+		readMainObject();
+
+		//create and add Ojbect2
+		addObject2();
+
+		//here the newly created Object2 is written to the database
+		//but the MainObject does not know it yet
+		MainObject mainObject = readMainObject();
+
+		assertNotNull( mainObject.getObj2() );
+
+		// after evicting, it works.
+		getSessions().evict( MainObject.class );
+
+		mainObject = readMainObject();
+
+		assertNotNull( mainObject.getObj2() );
+
+	}
+
+	/**
+	 * creates a new MainObject
+	 * <p/>
+	 * one hibernate transaction !
+	 */
+	private void createMainObject() throws HibernateException {
+		Session session = openSession();
+		Transaction tx = session.beginTransaction();
+
+		MainObject mo = new MainObject();
+		mo.setDescription( "Main Test" );
+
+		generatedId = session.save( mo );
+
+		tx.commit();
+		session.close();
+	}
+
+	/**
+	 * loads the newly created MainObject
+	 * and adds a new Object2 to it
+	 * <p/>
+	 * one hibernate transaction
+	 */
+	private void addObject2() throws HibernateException {
+		Session session = openSession();
+		Transaction tx = session.beginTransaction();
+
+		MainObject mo =
+				( MainObject ) session.load( MainObject.class, generatedId );
+
+		Object2 toAdd = new Object2();
+		toAdd.setDummy( "test" );
+
+		//toAdd should now be saved by cascade
+		mo.setObj2( toAdd );
+
+		tx.commit();
+		session.close();
+	}
+
+	/**
+	 * reads the newly created MainObject
+	 * and its Object2 if it exists
+	 * <p/>
+	 * one hibernate transaction
+	 */
+	private MainObject readMainObject() throws HibernateException {
+		Long returnId = null;
+		Session session = openSession();
+		Transaction tx = session.beginTransaction();
+
+		Serializable id = generatedId;
+
+		MainObject mo = ( MainObject ) session.load( MainObject.class, id );
+
+		tx.commit();
+		session.close();
+
+		return mo;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/OneToOneCacheTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Outer.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Outer.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Outer.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,42 @@
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+
+/**
+ * @author Stefano Travelli
+ */
+public class Outer implements Serializable {
+	private OuterKey id;
+	private String bubu;
+
+	public OuterKey getId() {
+		return id;
+	}
+
+	public void setId(OuterKey id) {
+		this.id = id;
+	}
+
+	public String getBubu() {
+		return bubu;
+	}
+
+	public void setBubu(String bubu) {
+		this.bubu = bubu;
+	}
+
+	public boolean equals(Object o) {
+		if (this == o) return true;
+		if (!(o instanceof Outer)) return false;
+
+		final Outer cidDetail = (Outer) o;
+
+		if (id != null ? !id.equals(cidDetail.id) : cidDetail.id != null) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		return (id != null ? id.hashCode() : 0);
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Outer.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/OuterKey.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/OuterKey.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/OuterKey.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,46 @@
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+
+/**
+ * @author Stefano Travelli
+ */
+public class OuterKey implements Serializable {
+	private Middle master;
+	private String detailId;
+
+	public Middle getMaster() {
+		return master;
+	}
+
+	public void setMaster(Middle master) {
+		this.master = master;
+	}
+
+	public String getDetailId() {
+		return detailId;
+	}
+
+	public void setDetailId(String detailId) {
+		this.detailId = detailId;
+	}
+
+	public boolean equals(Object o) {
+		if (this == o) return true;
+		if (!(o instanceof OuterKey)) return false;
+
+		final OuterKey cidDetailID = (OuterKey) o;
+
+		if (detailId != null ? !detailId.equals(cidDetailID.detailId) : cidDetailID.detailId != null) return false;
+		if (master != null ? !master.equals(cidDetailID.master) : cidDetailID.master != null) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		int result;
+		result = (master != null ? master.hashCode() : 0);
+		result = 29 * result + (detailId != null ? detailId.hashCode() : 0);
+		return result;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/OuterKey.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Parent.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Parent.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Parent.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,62 @@
+//$Id: Parent.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+public class Parent {
+	private long id;
+	private int count;
+	private Child child;
+	private Object any;
+	private int x;
+	
+	public int getX() {
+		return x;
+	}
+	public void setX(int x) {
+		this.x = x;
+	}
+	
+	public int getCount() {
+		return count;
+	}
+	
+	
+	public long getId() {
+		return id;
+	}
+	
+	
+	public void setCount(int count) {
+		this.count = count;
+	}
+	
+	
+	public void setId(long id) {
+		this.id = id;
+	}
+	
+	
+	public Child getChild() {
+		return child;
+	}
+	
+	
+	public void setChild(Child child) {
+		this.child = child;
+	}
+	
+	public Object getAny() {
+		return any;
+	}
+
+	public void setAny(Object any) {
+		this.any = any;
+	}
+
+}
+
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Parent.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ParentChild.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ParentChild.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ParentChild.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-lazy="false">
+	
+	<class name="org.hibernate.test.legacy.Parent">
+		<id name="id" type="long">
+			<generator class="native"> <!--seqhilo-->
+				<!--<param>foo_seq</param>-->
+			</generator>
+		</id>
+		<property name="x"/>
+		<property name="count" column="count_"/>
+		<one-to-one name="child"/>
+        <property name="any" type="object">
+        	<column name="any_id"/>
+        	<column name="any_class"/>
+        </property>
+	</class>
+	
+	<class name="org.hibernate.test.legacy.Child">
+		<id name="id" type="long">
+			<generator class="assigned"/>
+		</id>
+		<property name="x"/>
+		<one-to-one name="parent" class="org.hibernate.test.legacy.Parent" constrained="true" foreign-key="parentfk"/>
+		<property name="count" column="count_"/>
+	</class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ParentChild.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ParentChildTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ParentChildTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ParentChildTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,1183 @@
+//$Id: ParentChildTest.java 11089 2007-01-24 14:34:22Z max.andersen at jboss.com $
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.Test;
+
+import org.hibernate.Criteria;
+import org.hibernate.FetchMode;
+import org.hibernate.Hibernate;
+import org.hibernate.HibernateException;
+import org.hibernate.LockMode;
+import org.hibernate.ObjectNotFoundException;
+import org.hibernate.ReplicationMode;
+import org.hibernate.Transaction;
+import org.hibernate.classic.Session;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.dialect.DB2Dialect;
+import org.hibernate.dialect.HSQLDialect;
+import org.hibernate.dialect.IngresDialect;
+import org.hibernate.dialect.MySQLDialect;
+import org.hibernate.engine.EntityEntry;
+import org.hibernate.impl.SessionImpl;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.proxy.HibernateProxy;
+
+
+public class ParentChildTest extends LegacyTestCase {
+
+	public ParentChildTest(String x) {
+		super(x);
+	}
+
+	public String[] getMappings() {
+		return new String[] {
+			"legacy/ParentChild.hbm.xml",
+			"legacy/FooBar.hbm.xml",
+		 	"legacy/Baz.hbm.xml",
+		 	"legacy/Qux.hbm.xml",
+		 	"legacy/Glarch.hbm.xml",
+		 	"legacy/Fum.hbm.xml",
+		 	"legacy/Fumm.hbm.xml",
+		 	"legacy/Fo.hbm.xml",
+		 	"legacy/One.hbm.xml",
+		 	"legacy/Many.hbm.xml",
+		 	"legacy/Immutable.hbm.xml",
+		 	"legacy/Fee.hbm.xml",
+		 	"legacy/Vetoer.hbm.xml",
+		 	"legacy/Holder.hbm.xml",
+		 	"legacy/Simple.hbm.xml",
+		 	"legacy/Container.hbm.xml",
+		 	"legacy/Circular.hbm.xml",
+		 	"legacy/Stuff.hbm.xml"
+		};
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( ParentChildTest.class );
+	}
+
+	public void testReplicate() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Container baz = new Container();
+		Contained f = new Contained();
+		List list = new ArrayList();
+		list.add(baz);
+		f.setBag(list);
+		List list2 = new ArrayList();
+		list2.add(f);
+		baz.setBag(list2);
+		s.save(f);
+		s.save(baz);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.replicate(baz, ReplicationMode.OVERWRITE);
+		// HHH-2378
+		SessionImpl x = (SessionImpl)s;
+		EntityEntry entry = x.getPersistenceContext().getEntry( baz );
+		assertNull(entry.getVersion());
+		// ~~~~~~~
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.replicate(baz, ReplicationMode.IGNORE);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.delete(baz);
+		s.delete(f);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testQueryOneToOne() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Serializable id = s.save( new Parent() );
+		assertTrue( s.createQuery( "from Parent p left join fetch p.child" ).list().size()==1 );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Parent p = (Parent) s.createQuery("from Parent p left join fetch p.child").uniqueResult();
+		assertTrue( p.getChild()==null );
+		s.createQuery( "from Parent p join p.child c where c.x > 0" ).list();
+		s.createQuery( "from Child c join c.parent p where p.x > 0" ).list();
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete( s.get(Parent.class, id) );
+		t.commit();
+		s.close();
+	}
+
+	public void testProxyReuseFailureExpected() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		FooProxy foo = new Foo();
+		FooProxy foo2 = new Foo();
+		Serializable id = s.save(foo);
+		Serializable id2 = s.save(foo2);
+		foo2.setInt(1234567);
+		foo.setInt(1234);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		foo = (FooProxy) s.load(Foo.class, id);
+		foo2 = (FooProxy) s.load(Foo.class, id2);
+		assertFalse( Hibernate.isInitialized(foo) );
+		Hibernate.initialize(foo2);
+		Hibernate.initialize(foo);
+		assertTrue( foo.getComponent().getImportantDates().length==4 );
+		assertTrue( foo2.getComponent().getImportantDates().length==4 );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		foo.setFloat( new Float(1.2f) );
+		foo2.setFloat( new Float(1.3f) );
+		foo2.getDependent().setKey(null);
+		foo2.getComponent().getSubcomponent().getFee().setKey(null);
+		assertFalse( foo2.getKey().equals(id) );
+		s.save(foo, "xyzid");
+		s.update(foo2, id); //intentionally id, not id2!
+		assertEquals( foo2.getKey(), id );
+		assertTrue( foo2.getInt()==1234567 );
+		assertEquals( foo.getKey(), "xyzid" );
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		foo = (FooProxy) s.load(Foo.class, id);
+		assertTrue( foo.getInt()==1234567 );
+		assertTrue( foo.getComponent().getImportantDates().length==4 );
+		String feekey = foo.getDependent().getKey();
+		String fookey = foo.getKey();
+		s.delete(foo);
+		s.delete( s.get(Foo.class, id2) );
+		s.delete( s.get(Foo.class, "xyzid") );
+// here is the issue (HHH-4092).  After the deletes above there are 2 Fees and a Glarch unexpectedly hanging around
+		assertEquals( 2, doDelete( s, "from java.lang.Object" ) );
+		t.commit();
+		s.close();
+		
+		//to account for new id rollback shit
+		foo.setKey(fookey);
+		foo.getDependent().setKey(feekey);
+		foo.getComponent().setGlarch(null);
+		foo.getComponent().setSubcomponent(null);
+		
+		s = openSession();
+		t = s.beginTransaction();
+		//foo.getComponent().setGlarch(null); //no id property!
+		s.replicate(foo, ReplicationMode.OVERWRITE);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Foo refoo = (Foo) s.get(Foo.class, id);
+		assertEquals( feekey, refoo.getDependent().getKey() );
+		s.delete(refoo);
+		t.commit();
+		s.close();
+	}
+
+	public void testComplexCriteria() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Baz baz = new Baz();
+		s.save(baz);
+		baz.setDefaults();
+		Map topGlarchez = new HashMap();
+		baz.setTopGlarchez(topGlarchez);
+		Glarch g1 = new Glarch();
+		g1.setName("g1");
+		s.save(g1);
+		Glarch g2 = new Glarch();
+		g2.setName("g2");
+		s.save(g2);
+		g1.setProxyArray( new GlarchProxy[] {g2} );
+		topGlarchez.put( new Character('1'),g1 );
+		topGlarchez.put( new Character('2'), g2);
+		Foo foo1 = new Foo();
+		Foo foo2 = new Foo();
+		s.save(foo1);
+		s.save(foo2);
+		baz.getFooSet().add(foo1);
+		baz.getFooSet().add(foo2);
+		baz.setFooArray( new FooProxy[] { foo1 } );
+
+		LockMode lockMode = (getDialect() instanceof DB2Dialect) ? LockMode.READ : LockMode.UPGRADE;
+
+		Criteria crit = s.createCriteria(Baz.class);
+		crit.createCriteria("topGlarchez")
+			.add( Restrictions.isNotNull("name") )
+			.createCriteria("proxyArray")
+				.add( Restrictions.eqProperty("name", "name") )
+				.add( Restrictions.eq("name", "g2") )
+				.add( Restrictions.gt("x", new Integer(-666) ) );
+		crit.createCriteria("fooSet")
+			.add( Restrictions.isNull("null") )
+			.add( Restrictions.eq("string", "a string") )
+			.add( Restrictions.lt("integer", new Integer(-665) ) );
+		crit.createCriteria("fooArray")
+				// this is the bit causing the problems; creating the criteria on fooArray does not add it to FROM,
+				// and so restriction below leads to an invalid reference.
+			.add( Restrictions.eq("string", "a string") )
+			.setLockMode(lockMode);
+
+		List list = crit.list();
+		assertTrue( list.size()==2 );
+		
+		s.createCriteria(Glarch.class).setLockMode(LockMode.UPGRADE).list();
+		s.createCriteria(Glarch.class).setLockMode(Criteria.ROOT_ALIAS, LockMode.UPGRADE).list();
+		
+		g2.setName(null);
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		
+		list = s.createCriteria(Baz.class).add( Restrictions.isEmpty("fooSet") ).list();
+		assertEquals( list.size(), 0 );
+
+		list = s.createCriteria(Baz.class).add( Restrictions.isNotEmpty("fooSet") ).list();
+		assertEquals( new HashSet(list).size(), 1 );
+
+		list = s.createCriteria(Baz.class).add( Restrictions.sizeEq("fooSet", 2) ).list();
+		assertEquals( new HashSet(list).size(), 1 );
+		
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+
+		crit = s.createCriteria(Baz.class)
+			.setLockMode(lockMode);
+		crit.createCriteria("topGlarchez")
+			.add( Restrictions.gt( "x", new Integer(-666) ) );
+		crit.createCriteria("fooSet")
+			.add( Restrictions.isNull("null") );
+		list = crit.list();
+
+		assertTrue( list.size()==4 );
+		baz = (Baz) crit.uniqueResult();
+		assertTrue( Hibernate.isInitialized(baz.getTopGlarchez()) ); //cos it is nonlazy
+		assertTrue( !Hibernate.isInitialized(baz.getFooSet()) );
+
+		list = s.createCriteria(Baz.class)
+			.createCriteria("fooSet")
+				.createCriteria("foo")
+					.createCriteria("component.glarch")
+						.add( Restrictions.eq("name", "xxx") )
+			.list();
+		assertTrue( list.size()==0 );
+
+		list = s.createCriteria(Baz.class)
+			.createAlias("fooSet", "foo")
+			.createAlias("foo.foo", "foo2")
+			.setLockMode("foo2", lockMode)
+			.add( Restrictions.isNull("foo2.component.glarch") )
+			.createCriteria("foo2.component.glarch")
+				.add( Restrictions.eq("name", "xxx") )
+			.list();
+		assertTrue( list.size()==0 );
+
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+
+		crit = s.createCriteria(Baz.class);
+		crit.createCriteria("topGlarchez")
+			.add( Restrictions.isNotNull("name") );
+		crit.createCriteria("fooSet")
+			.add( Restrictions.isNull("null") );
+
+		list = crit.list();
+		assertTrue( list.size()==2 );
+		baz = (Baz) crit.uniqueResult();
+		assertTrue( Hibernate.isInitialized(baz.getTopGlarchez()) ); //cos it is nonlazy
+		assertTrue( !Hibernate.isInitialized(baz.getFooSet()) );
+		
+		s.createCriteria(Child.class).setFetchMode("parent", FetchMode.JOIN).list();
+
+		doDelete( s, "from Glarch g" );
+		s.delete( s.get(Foo.class, foo1.getKey() ) );
+		s.delete( s.get(Foo.class, foo2.getKey() ) );
+		s.delete(baz);
+		t.commit();
+		s.close();
+	}
+
+	public void testArrayHQL() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Baz baz = new Baz();
+		s.save(baz);
+		Foo foo1 = new Foo();
+		s.save(foo1);
+		baz.setFooArray( new FooProxy[] { foo1 } );
+
+		s.flush();
+		s.clear();
+
+		baz = ( Baz ) s.createQuery("from Baz b left join fetch b.fooArray").uniqueResult();
+		assertEquals( 1, baz.getFooArray().length );
+
+		t.rollback();
+		s.close();
+
+	}
+
+	public void testArrayCriteria() {
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Baz baz = new Baz();
+		s.save(baz);
+		Foo foo1 = new Foo();
+		s.save(foo1);
+		baz.setFooArray( new FooProxy[] { foo1 } );
+
+		s.flush();
+		s.clear();
+
+		baz = ( Baz ) s.createCriteria(Baz.class).createCriteria( "fooArray" ).uniqueResult();
+		assertEquals( 1, baz.getFooArray().length );
+
+		t.rollback();
+		s.close();
+	}
+
+	public void testLazyManyToOneHQL() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Baz baz = new Baz();
+		s.save(baz);
+		Foo foo1 = new Foo();
+		s.save(foo1);
+		baz.setFoo( foo1 );
+
+		s.flush();
+		s.clear();
+
+		baz = ( Baz ) s.createQuery("from Baz b").uniqueResult();
+		assertFalse( Hibernate.isInitialized( baz.getFoo() ) );
+		assertTrue( baz.getFoo() instanceof HibernateProxy );
+
+		t.rollback();
+		s.close();
+
+	}
+
+	public void testLazyManyToOneCriteria() {
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Baz baz = new Baz();
+		s.save(baz);
+		Foo foo1 = new Foo();
+		s.save(foo1);
+		baz.setFoo( foo1 );
+
+		s.flush();
+		s.clear();
+
+		baz = ( Baz ) s.createCriteria( Baz.class ).uniqueResult();
+		assertTrue( Hibernate.isInitialized( baz.getFoo() ) );
+		assertFalse( baz.getFoo() instanceof HibernateProxy );
+
+		t.rollback();
+		s.close();
+	}
+
+	public void testLazyManyToOneGet() {
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Baz baz = new Baz();
+		s.save(baz);
+		Foo foo1 = new Foo();
+		s.save(foo1);
+		baz.setFoo( foo1 );
+
+		s.flush();
+		s.clear();
+
+		baz = ( Baz ) s.get( Baz.class, baz.getCode() );
+		assertTrue( Hibernate.isInitialized( baz.getFoo() ) );
+		assertFalse( baz.getFoo() instanceof HibernateProxy );
+
+		t.rollback();
+		s.close();
+	}
+
+	public void testClassWhere() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Baz baz = new Baz();
+		baz.setParts( new ArrayList() );
+		Part p1 = new Part();
+		p1.setDescription("xyz");
+		Part p2 = new Part();
+		p2.setDescription("abc");
+		baz.getParts().add(p1);
+		baz.getParts().add(p2);
+		s.save(baz);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		assertTrue( s.createCriteria(Part.class).list().size()==1 ); //there is a where condition on Part mapping
+		assertTrue( s.createCriteria(Part.class).add( Restrictions.eq( "id", p1.getId() ) ).list().size()==1 );
+		assertTrue( s.createQuery("from Part").list().size()==1 );
+		assertTrue( s.createQuery("from Baz baz join baz.parts").list().size()==2 );
+		baz = (Baz) s.createCriteria(Baz.class).uniqueResult();
+		assertTrue( s.createFilter( baz.getParts(), "" ).list().size()==2 );
+		//assertTrue( baz.getParts().size()==1 );
+		s.delete( s.get( Part.class, p1.getId() ));
+		s.delete( s.get( Part.class, p2.getId() ));
+		s.delete(baz);
+		t.commit();
+		s.close();
+	}
+
+	public void testClassWhereManyToMany() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Baz baz = new Baz();
+		baz.setMoreParts( new ArrayList() );
+		Part p1 = new Part();
+		p1.setDescription("xyz");
+		Part p2 = new Part();
+		p2.setDescription("abc");
+		baz.getMoreParts().add(p1);
+		baz.getMoreParts().add(p2);
+		s.save(baz);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		assertTrue( s.createCriteria(Part.class).list().size()==1 ); //there is a where condition on Part mapping
+		assertTrue( s.createCriteria(Part.class).add( Restrictions.eq( "id", p1.getId() ) ).list().size()==1 );
+		assertTrue( s.createQuery("from Part").list().size()==1 );
+		assertTrue( s.createQuery("from Baz baz join baz.moreParts").list().size()==2 );
+		baz = (Baz) s.createCriteria(Baz.class).uniqueResult();
+		assertTrue( s.createFilter( baz.getMoreParts(), "" ).list().size()==2 );
+		//assertTrue( baz.getParts().size()==1 );
+		s.delete( s.get( Part.class, p1.getId() ));
+		s.delete( s.get( Part.class, p2.getId() ));
+		s.delete(baz);
+		t.commit();
+		s.close();
+	}
+
+	public void testCollectionQuery() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Simple s1 = new Simple();
+		s1.setName("s");
+		s1.setCount(0);
+		Simple s2 = new Simple();
+		s2.setCount(2);
+		Simple s3 = new Simple();
+		s3.setCount(3);
+		s.save( s1, new Long(1) ); s.save( s2, new Long(2) ); s.save( s3, new Long(3) );
+		Container c = new Container();
+		Contained cd = new Contained();
+		List bag = new ArrayList();
+		bag.add(cd);
+		c.setBag(bag);
+		List l = new ArrayList();
+		l.add(s1);
+		l.add(s3);
+		l.add(s2);
+		c.setOneToMany(l);
+		l = new ArrayList();
+		l.add(s1);
+		l.add(null);
+		l.add(s2);
+		c.setManyToMany(l);
+		s.save(c);
+		Container cx = new Container();
+		s.save(cx);
+		Simple sx = new Simple();
+		sx.setCount(5);
+		sx.setName("s");
+		s.save( sx, new Long(5) );
+		assertTrue(
+				s.createQuery( "select c from ContainerX c, Simple s where c.oneToMany[2] = s" ).list()
+						.size() == 1
+		);
+		assertTrue(
+				s.createQuery( "select c from ContainerX c, Simple s where c.manyToMany[2] = s" ).list()
+						.size() == 1
+		);
+		assertTrue(
+				s.createQuery( "select c from ContainerX c, Simple s where s = c.oneToMany[2]" ).list()
+						.size() == 1
+		);
+		assertTrue(
+				s.createQuery( "select c from ContainerX c, Simple s where s = c.manyToMany[2]" ).list()
+						.size() == 1
+		);
+		assertTrue(
+				s.createQuery( "select c from ContainerX c where c.oneToMany[0].name = 's'" ).list()
+						.size() == 1
+		);
+		assertTrue(
+				s.createQuery( "select c from ContainerX c where c.manyToMany[0].name = 's'" ).list()
+						.size() == 1
+		);
+		assertTrue(
+				s.createQuery( "select c from ContainerX c where 's' = c.oneToMany[2 - 2].name" ).list()
+						.size() == 1
+		);
+		assertTrue(
+				s.createQuery( "select c from ContainerX c where 's' = c.manyToMany[(3+1)/4-1].name" ).list()
+						.size() == 1
+		);
+		assertTrue(
+				s.createQuery( "select c from ContainerX c where c.oneToMany[ c.manyToMany[0].count ].name = 's'" )
+						.list()
+						.size() == 1
+		);
+		assertTrue(
+				s.createQuery( "select c from ContainerX c where c.manyToMany[ c.oneToMany[0].count ].name = 's'" )
+						.list()
+						.size() == 1
+		);
+		if ( ! ( getDialect() instanceof MySQLDialect ) && !(getDialect() instanceof org.hibernate.dialect.TimesTenDialect) ) {
+			assertTrue(
+					s.createQuery( "select c from ContainerX c where c.manyToMany[ maxindex(c.manyToMany) ].count = 2" )
+							.list()
+							.size() == 1
+			);
+		}
+		assertTrue( s.contains(cd) );
+		if ( !(getDialect() instanceof MySQLDialect) && !(getDialect() instanceof HSQLDialect) )  {
+			s.createFilter( c.getBag(), "where 0 in elements(this.bag)" ).list();
+			s.createFilter( c.getBag(), "where 0 in elements(this.lazyBag)" ).list();
+		}
+		s.createQuery( "select count(comp.name) from ContainerX c join c.components comp" ).list();
+		s.delete(cd);
+		s.delete(c);
+		s.delete(s1);
+		s.delete(s2);
+		s.delete(s3);
+		s.delete(cx);
+		s.delete(sx);
+		t.commit();
+		s.close();
+	}
+
+	public void testParentChild() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Parent p = new Parent();
+		Child c = new Child();
+		c.setParent(p);
+		p.setChild(c);
+		s.save(p);
+		s.save(c);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Child) s.load( Child.class, new Long( c.getId() ) );
+		p = c.getParent();
+		assertTrue( "1-1 parent", p!=null );
+		c.setCount(32);
+		p.setCount(66);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Child) s.load( Child.class, new Long( c.getId() ) );
+		p = c.getParent();
+		assertTrue( "1-1 update", p.getCount()==66 );
+		assertTrue( "1-1 update", c.getCount()==32 );
+		assertTrue(
+			"1-1 query",
+				s.createQuery( "from Child c where c.parent.count=66" ).list().size()==1
+		);
+		assertTrue(
+			"1-1 query",
+			( (Object[]) s.createQuery( "from Parent p join p.child c where p.count=66" ).list().get(0) ).length==2
+		);
+		s.createQuery( "select c, c.parent from Child c order by c.parent.count" ).list();
+		s.createQuery( "select c, c.parent from Child c where c.parent.count=66 order by c.parent.count" ).list();
+		s.createQuery( "select c, c.parent, c.parent.count from Child c order by c.parent.count" ).iterate();
+		List result = s.createQuery( "FROM Parent AS p WHERE p.count = ?" )
+				.setParameter( 0, new Integer(66), Hibernate.INTEGER )
+				.list();
+		assertEquals( "1-1 query", 1, result.size() );
+		s.delete(c); s.delete(p);
+		t.commit();
+		s.close();
+	}
+
+	public void testParentNullChild() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Parent p = new Parent();
+		s.save(p);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		p = (Parent) s.load( Parent.class, new Long( p.getId() ) );
+		assertTrue( p.getChild()==null );
+		p.setCount(66);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		p = (Parent) s.load( Parent.class, new Long( p.getId() ) );
+		assertTrue( "null 1-1 update", p.getCount()==66 );
+		assertTrue( p.getChild()==null );
+		s.delete(p);
+		t.commit();
+		s.close();
+	}
+
+	public void testManyToMany() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Container c = new Container();
+		c.setManyToMany( new ArrayList() );
+		c.setBag( new ArrayList() );
+		Simple s1 = new Simple();
+		Simple s2 = new Simple();
+		s1.setCount(123); s2.setCount(654);
+		Contained c1 = new Contained();
+		c1.setBag( new ArrayList() );
+		c1.getBag().add(c);
+		c.getBag().add(c1);
+		c.getManyToMany().add(s1);
+		c.getManyToMany().add(s2);
+		Serializable cid = s.save(c); //s.save(c1);
+		s.save(s1, new Long(12) ); s.save(s2, new Long(-1) );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Container) s.load(Container.class, cid);
+		assertTrue( c.getBag().size()==1 );
+		assertTrue( c.getManyToMany().size()==2 );
+		c1 = (Contained) c.getBag().iterator().next();
+		assertTrue( c.getBag().size()==1 );
+		c.getBag().remove(c1);
+		c1.getBag().remove(c);
+		assertTrue( c.getManyToMany().remove(0)!=null );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Container) s.load(Container.class, cid);
+		assertTrue( c.getBag().size()==0 );
+		assertTrue( c.getManyToMany().size()==1 );
+		c1 = (Contained) s.load( Contained.class, new Long(c1.getId()) );
+		assertTrue( c1.getBag().size()==0 );
+		assertEquals( 1, doDelete( s, "from ContainerX c" ) );
+		assertEquals( 1, doDelete( s, "from Contained" ) );
+		assertEquals( 2, doDelete( s, "from Simple" ) );
+		t.commit();
+		s.close();
+	}
+
+	public void testContainer() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Container c = new Container();
+		Simple x = new Simple(); x.setCount(123);
+		Simple y = new Simple(); y.setCount(456);
+		s.save( x, new Long(1) ); s.save( y, new Long(0) );
+		List o2m = new ArrayList();
+		o2m.add(x); o2m.add(null); o2m.add(y);
+		List m2m = new ArrayList();
+		m2m.add(x); m2m.add(null); m2m.add(y);
+		c.setOneToMany(o2m); c.setManyToMany(m2m);
+		List comps = new ArrayList();
+		Container.ContainerInnerClass ccic = new Container.ContainerInnerClass();
+		ccic.setName("foo");
+		ccic.setSimple(x);
+		comps.add(ccic);
+		comps.add(null);
+		ccic = new Container.ContainerInnerClass();
+		ccic.setName("bar");
+		ccic.setSimple(y);
+		comps.add(ccic);
+		HashSet compos = new HashSet();
+		compos.add(ccic);
+		c.setComposites(compos);
+		c.setComponents(comps);
+		One one = new One();
+		Many many = new Many();
+		HashSet manies = new HashSet();
+		manies.add(many);
+		one.setManies(manies);
+		many.setOne(one);
+		ccic.setMany(many);
+		ccic.setOne(one);
+		s.save(one);
+		s.save(many);
+		s.save(c);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Long count = (Long) s.createQuery("select count(*) from ContainerX as c join c.components as ce join ce.simple as s where ce.name='foo'").uniqueResult();
+		assertTrue( count.intValue()==1 );
+		List res = s.createQuery(
+				"select c, s from ContainerX as c join c.components as ce join ce.simple as s where ce.name='foo'"
+		).list();
+		assertTrue(res.size()==1);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Container) s.load( Container.class, new Long( c.getId() ) );
+		System.out.println( c.getOneToMany() );
+		System.out.println( c.getManyToMany() );
+		System.out.println( c.getComponents() );
+		System.out.println( c.getComposites() );
+		ccic = (Container.ContainerInnerClass) c.getComponents().get(2);
+		assertTrue( ccic.getMany().getOne()==ccic.getOne() );
+		assertTrue( c.getComponents().size()==3 );
+		assertTrue( c.getComposites().size()==1 );
+		assertTrue( c.getOneToMany().size()==3 );
+		assertTrue( c.getManyToMany().size()==3 );
+		assertTrue( c.getOneToMany().get(0)!=null );
+		assertTrue( c.getOneToMany().get(2)!=null );
+		for ( int i=0; i<3; i++ ) {
+			assertTrue( c.getManyToMany().get(i) == c.getOneToMany().get(i) );
+		}
+		Object o1 = c.getOneToMany().get(0);
+		Object o2 = c.getOneToMany().remove(2);
+		c.getOneToMany().set(0, o2);
+		c.getOneToMany().set(1, o1);
+		o1 = c.getComponents().remove(2);
+		c.getComponents().set(0, o1);
+		c.getManyToMany().set( 0, c.getManyToMany().get(2) );
+		Container.ContainerInnerClass ccic2 = new Container.ContainerInnerClass();
+		ccic2.setName("foo");
+		ccic2.setOne(one);
+		ccic2.setMany(many);
+		ccic2.setSimple( (Simple) s.load(Simple.class, new Long(0) ) );
+		c.getComposites().add(ccic2);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Container) s.load( Container.class, new Long( c.getId() ) );
+		System.out.println( c.getOneToMany() );
+		System.out.println( c.getManyToMany() );
+		System.out.println( c.getComponents() );
+		System.out.println( c.getComposites() );
+		assertTrue( c.getComponents().size()==1 ); //WAS: 2
+		assertTrue( c.getComposites().size()==2 );
+		assertTrue( c.getOneToMany().size()==2 );
+		assertTrue( c.getManyToMany().size()==3 );
+		assertTrue( c.getOneToMany().get(0)!=null );
+		assertTrue( c.getOneToMany().get(1)!=null );
+		( (Container.ContainerInnerClass) c.getComponents().get(0) ).setName("a different name");
+		( (Container.ContainerInnerClass) c.getComposites().iterator().next() ).setName("once again");
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Container) s.load( Container.class, new Long( c.getId() ) );
+		System.out.println( c.getOneToMany() );
+		System.out.println( c.getManyToMany() );
+		System.out.println( c.getComponents() );
+		System.out.println( c.getComposites() );
+		assertTrue( c.getComponents().size()==1 ); //WAS: 2
+		assertTrue( c.getComposites().size()==2 );
+		assertTrue( ( (Container.ContainerInnerClass) c.getComponents().get(0) ).getName().equals("a different name") );
+		Iterator iter = c.getComposites().iterator();
+		boolean found = false;
+		while ( iter.hasNext() ) {
+			if ( ( (Container.ContainerInnerClass) iter.next() ).getName().equals("once again") ) found = true;
+		}
+		assertTrue(found);
+		c.getOneToMany().clear();
+		c.getManyToMany().clear();
+		c.getComposites().clear();
+		c.getComponents().clear();
+		doDelete( s, "from Simple" );
+		doDelete( s, "from Many" );
+		doDelete( s, "from One" );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Container) s.load( Container.class, new Long( c.getId() ) );
+		assertTrue( c.getComponents().size()==0 );
+		assertTrue( c.getComposites().size()==0 );
+		assertTrue( c.getOneToMany().size()==0 );
+		assertTrue( c.getManyToMany().size()==0 );
+		s.delete(c);
+		t.commit();
+		s.close();
+	}
+
+	public void testCascadeCompositeElements() throws Exception {
+		Container c = new Container();
+		List list = new ArrayList();
+		c.setCascades(list);
+		Container.ContainerInnerClass cic = new Container.ContainerInnerClass();
+		cic.setMany( new Many() );
+		cic.setOne( new One() );
+		list.add(cic);
+		Session s = openSession();
+		s.beginTransaction();
+		s.save(c);
+		s.getTransaction().commit();
+		s.close();
+		
+		s=openSession();
+		s.beginTransaction();
+		c = (Container) s.createQuery( "from ContainerX c" ).iterate().next();
+		cic = (Container.ContainerInnerClass) c.getCascades().iterator().next();
+		assertTrue( cic.getMany()!=null && cic.getOne()!=null );
+		assertTrue( c.getCascades().size()==1 );
+		s.delete(c);
+		s.getTransaction().commit();
+		s.close();
+
+		c = new Container();
+		s = openSession();
+		s.beginTransaction();
+		s.save(c);
+		list = new ArrayList();
+		c.setCascades(list);
+		cic = new Container.ContainerInnerClass();
+		cic.setMany( new Many() );
+		cic.setOne( new One() );
+		list.add(cic);
+		s.getTransaction().commit();
+		s.close();
+		
+		s=openSession();
+		s.beginTransaction();
+		c = (Container) s.createQuery( "from ContainerX c" ).iterate().next();
+		cic = (Container.ContainerInnerClass) c.getCascades().iterator().next();
+		assertTrue( cic.getMany()!=null && cic.getOne()!=null );
+		assertTrue( c.getCascades().size()==1 );
+		s.delete(c);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testBag() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Container c = new Container();
+		Contained c1 = new Contained();
+		Contained c2 = new Contained();
+		c.setBag( new ArrayList() );
+		c.getBag().add(c1);
+		c.getBag().add(c2);
+		c1.getBag().add(c);
+		c2.getBag().add(c);
+		s.save(c);
+		c.getBag().add(c2);
+		c2.getBag().add(c);
+		c.getLazyBag().add(c1);
+		c1.getLazyBag().add(c);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Container) s.createQuery( "from ContainerX c" ).list().get(0);
+		c.getLazyBag().size();
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Container) s.createQuery( "from ContainerX c" ).list().get(0);
+		Contained c3 = new Contained();
+		//c.getBag().add(c3);
+		//c3.getBag().add(c);
+		c.getLazyBag().add(c3);
+		c3.getLazyBag().add(c);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Container) s.createQuery( "from ContainerX c" ).list().get(0);
+		Contained c4 = new Contained();
+		c.getLazyBag().add(c4);
+		c4.getLazyBag().add(c);
+		assertTrue( c.getLazyBag().size()==3 ); //forces initialization
+		//s.save(c4);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Container) s.createQuery( "from ContainerX c" ).list().get(0);
+		Iterator i = c.getBag().iterator();
+		int j=0;
+		while ( i.hasNext() ) {
+			assertTrue( i.next()!=null );
+			j++;
+		}
+		assertTrue(j==3);
+		assertTrue( c.getLazyBag().size()==3 );
+		s.delete(c);
+		c.getBag().remove(c2);
+		Iterator iter = c.getBag().iterator();
+		j=0;
+		while ( iter.hasNext() ) {
+			j++;
+			s.delete( iter.next() );
+		}
+		assertTrue(j==2);
+		s.delete( s.load(Contained.class, new Long( c4.getId() ) ) );
+		s.delete( s.load(Contained.class, new Long( c3.getId() ) ) );
+		t.commit();
+		s.close();
+	}
+
+	public void testCircularCascade() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Circular c = new Circular();
+		c.setClazz(Circular.class);
+		c.setOther( new Circular() );
+		c.getOther().setOther( new Circular() );
+		c.getOther().getOther().setOther(c);
+		c.setAnyEntity( c.getOther() );
+		String id = (String) s.save(c);
+		tx.commit();
+		s.close();
+		s = openSession();
+		tx = s.beginTransaction();
+		c = (Circular) s.load(Circular.class, id);
+		c.getOther().getOther().setClazz(Foo.class);
+		tx.commit();
+		s.close();
+		c.getOther().setClazz(Qux.class);
+		s = openSession();
+		tx = s.beginTransaction();
+		s.saveOrUpdate(c);
+		tx.commit();
+		s.close();
+		c.getOther().getOther().setClazz(Bar.class);
+		s = openSession();
+		tx = s.beginTransaction();
+		s.saveOrUpdate(c);
+		tx.commit();
+		s.close();
+		s = openSession();
+		tx = s.beginTransaction();
+		c = (Circular) s.load(Circular.class, id);
+		assertTrue( c.getOther().getOther().getClazz()==Bar.class);
+		assertTrue( c.getOther().getClazz()==Qux.class);
+		assertTrue( c.getOther().getOther().getOther()==c);
+		assertTrue( c.getAnyEntity()==c.getOther() );
+		assertEquals( 3, doDelete( s, "from Universe" ) );
+		tx.commit();
+		s.close();
+	}
+
+	public void testDeleteEmpty() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		assertEquals( 0, doDelete( s, "from Simple" ) );
+		assertEquals( 0, doDelete( s, "from Universe" ) );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testLocking() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Simple s1 = new Simple(); s1.setCount(1);
+		Simple s2 = new Simple(); s2.setCount(2);
+		Simple s3 = new Simple(); s3.setCount(3);
+		Simple s4 = new Simple(); s4.setCount(4);
+		s.save(s1, new Long(1) );
+		s.save(s2, new Long(2) );
+		s.save(s3, new Long(3) );
+		s.save(s4, new Long(4) );
+		assertTrue( s.getCurrentLockMode(s1)==LockMode.WRITE );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s1 = (Simple) s.load(Simple.class, new Long(1), LockMode.NONE);
+		assertTrue( s.getCurrentLockMode(s1)==LockMode.READ || s.getCurrentLockMode(s1)==LockMode.NONE ); //depends if cache is enabled
+		s2 = (Simple) s.load(Simple.class, new Long(2), LockMode.READ);
+		assertTrue( s.getCurrentLockMode(s2)==LockMode.READ );
+		s3 = (Simple) s.load(Simple.class, new Long(3), LockMode.UPGRADE);
+		assertTrue( s.getCurrentLockMode(s3)==LockMode.UPGRADE );
+		s4 = (Simple) s.get(Simple.class, new Long(4), LockMode.UPGRADE_NOWAIT);
+		assertTrue( s.getCurrentLockMode(s4)==LockMode.UPGRADE_NOWAIT );
+
+		s1 = (Simple) s.load(Simple.class, new Long(1), LockMode.UPGRADE); //upgrade
+		assertTrue( s.getCurrentLockMode(s1)==LockMode.UPGRADE );
+		s2 = (Simple) s.load(Simple.class, new Long(2), LockMode.NONE);
+		assertTrue( s.getCurrentLockMode(s2)==LockMode.READ );
+		s3 = (Simple) s.load(Simple.class, new Long(3), LockMode.READ);
+		assertTrue( s.getCurrentLockMode(s3)==LockMode.UPGRADE );
+		s4 = (Simple) s.load(Simple.class, new Long(4), LockMode.UPGRADE);
+		assertTrue( s.getCurrentLockMode(s4)==LockMode.UPGRADE_NOWAIT );
+
+		s.lock(s2, LockMode.UPGRADE); //upgrade
+		assertTrue( s.getCurrentLockMode(s2)==LockMode.UPGRADE );
+		s.lock(s3, LockMode.UPGRADE);
+		assertTrue( s.getCurrentLockMode(s3)==LockMode.UPGRADE );
+		s.lock(s1, LockMode.UPGRADE_NOWAIT);
+		s.lock(s4, LockMode.NONE);
+		assertTrue( s.getCurrentLockMode(s4)==LockMode.UPGRADE_NOWAIT );
+
+		tx.commit();
+		tx = s.beginTransaction();
+
+		assertTrue( s.getCurrentLockMode(s3)==LockMode.NONE );
+		assertTrue( s.getCurrentLockMode(s1)==LockMode.NONE );
+		assertTrue( s.getCurrentLockMode(s2)==LockMode.NONE );
+		assertTrue( s.getCurrentLockMode(s4)==LockMode.NONE );
+
+		s.lock(s1, LockMode.READ); //upgrade
+		assertTrue( s.getCurrentLockMode(s1)==LockMode.READ );
+		s.lock(s2, LockMode.UPGRADE); //upgrade
+		assertTrue( s.getCurrentLockMode(s2)==LockMode.UPGRADE );
+		s.lock(s3, LockMode.UPGRADE_NOWAIT); //upgrade
+		assertTrue( s.getCurrentLockMode(s3)==LockMode.UPGRADE_NOWAIT );
+		s.lock(s4, LockMode.NONE);
+		assertTrue( s.getCurrentLockMode(s4)==LockMode.NONE );
+
+		s4.setName("s4");
+		s.flush();
+		assertTrue( s.getCurrentLockMode(s4)==LockMode.WRITE );
+		tx.commit();
+
+		tx = s.beginTransaction();
+
+		assertTrue( s.getCurrentLockMode(s3)==LockMode.NONE );
+		assertTrue( s.getCurrentLockMode(s1)==LockMode.NONE );
+		assertTrue( s.getCurrentLockMode(s2)==LockMode.NONE );
+		assertTrue( s.getCurrentLockMode(s4)==LockMode.NONE );
+
+		s.delete(s1); s.delete(s2); s.delete(s3); s.delete(s4);
+		tx.commit();
+		s.close();
+	}
+
+	public void testObjectType() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		Parent g = new Parent();
+		Foo foo = new Foo();
+		g.setAny(foo);
+		s.save(g);
+		s.save(foo);
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		g = (Parent) s.load( Parent.class, new Long( g.getId() ) );
+		assertTrue( g.getAny()!=null && g.getAny() instanceof FooProxy );
+		s.delete( g.getAny() );
+		s.delete(g);
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testLoadAfterNonExists() throws HibernateException, SQLException {
+		Session session = openSession();
+		if ( ( getDialect() instanceof MySQLDialect ) || ( getDialect() instanceof IngresDialect ) ) {
+			session.connection().setTransactionIsolation( Connection.TRANSACTION_READ_COMMITTED );
+		}
+		session.getTransaction().begin();
+
+		// First, prime the fixture session to think the entity does not exist
+		try {
+			session.load( Simple.class, new Long(-1) );
+			fail();
+		}
+		catch(ObjectNotFoundException onfe) {
+			// this is correct
+		}
+
+		// Next, lets create that entity "under the covers"
+		Session anotherSession = getSessions().openSession();
+		anotherSession.beginTransaction();
+		Simple myNewSimple = new Simple();
+		myNewSimple.setName("My under the radar Simple entity");
+		myNewSimple.setAddress("SessionCacheTest.testLoadAfterNonExists");
+		myNewSimple.setCount(1);
+		myNewSimple.setDate( new Date() );
+		myNewSimple.setPay( new Float(100000000) );
+		anotherSession.save( myNewSimple, new Long(-1) );
+		anotherSession.getTransaction().commit();
+		anotherSession.close();
+
+		// Now, lets make sure the original session can see the created row...
+		session.clear();
+		try {
+			Simple dummy = (Simple) session.get( Simple.class, new Long(-1) );
+			assertNotNull("Unable to locate entity Simple with id = -1", dummy);
+			session.delete( dummy );
+		}
+		catch(ObjectNotFoundException onfe) {
+			fail("Unable to locate entity Simple with id = -1");
+		}
+		session.getTransaction().commit();
+		session.close();
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ParentChildTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Part.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Part.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Part.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,30 @@
+//$Id: Part.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+/**
+ * @author Gavin King
+ */
+public class Part {
+
+	private Long id;
+	private String description;
+	
+	public String getDescription() {
+		return description;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setDescription(String string) {
+		description = string;
+	}
+
+	public void setId(Long long1) {
+		id = long1;
+	}
+	
+	public static class SpecialPart extends Part {}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Part.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Party.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Party.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Party.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,38 @@
+package org.hibernate.test.legacy;
+
+/**
+ * @author hbm2java
+ */
+public class Party {
+
+   java.lang.String id;
+   java.lang.String name;
+   java.lang.String address;
+
+
+  java.lang.String getId() {
+    return id;
+  }
+
+  void  setId(java.lang.String newValue) {
+    id = newValue;
+  }
+
+  java.lang.String getName() {
+    return name;
+  }
+
+  void  setName(java.lang.String newValue) {
+    name = newValue;
+  }
+
+  java.lang.String getAddress() {
+    return address;
+  }
+
+  void  setAddress(java.lang.String newValue) {
+    address = newValue;
+  }
+
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Party.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,47 @@
+package org.hibernate.test.legacy;
+
+/**
+ * @author hbm2java
+ */
+public class Person extends org.hibernate.test.legacy.Party {
+
+   java.lang.String id;
+   java.lang.String givenName;
+   java.lang.String lastName;
+   java.lang.String nationalID;
+
+
+  java.lang.String getId() {
+    return id;
+  }
+
+  void  setId(java.lang.String newValue) {
+    id = newValue;
+  }
+
+  java.lang.String getGivenName() {
+    return givenName;
+  }
+
+  void  setGivenName(java.lang.String newValue) {
+    givenName = newValue;
+  }
+
+  java.lang.String getLastName() {
+    return lastName;
+  }
+
+  void  setLastName(java.lang.String newValue) {
+    lastName = newValue;
+  }
+
+  java.lang.String getNationalID() {
+    return nationalID;
+  }
+
+  void  setNationalID(java.lang.String newValue) {
+    nationalID = newValue;
+  }
+
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Person.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Po.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Po.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Po.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,104 @@
+//$Id: Po.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.util.List;
+import java.util.Set;
+
+
+/**
+ *
+ */
+public class Po {
+	private long id;
+	private String value;
+	private Set set;
+	private List list;
+	private Top top;
+	private Lower lower;
+	/**
+	 * Returns the id.
+	 * @return long
+	 */
+	public long getId() {
+		return id;
+	}
+	
+	/**
+	 * Returns the value.
+	 * @return String
+	 */
+	public String getValue() {
+		return value;
+	}
+	
+	/**
+	 * Sets the id.
+	 * @param id The id to set
+	 */
+	public void setId(long id) {
+		this.id = id;
+	}
+	
+	/**
+	 * Sets the value.
+	 * @param value The value to set
+	 */
+	public void setValue(String value) {
+		this.value = value;
+	}
+	
+	/**
+	 * Returns the set.
+	 * @return Set
+	 */
+	public Set getSet() {
+		return set;
+	}
+	
+	/**
+	 * Sets the set.
+	 * @param set The set to set
+	 */
+	public void setSet(Set set) {
+		this.set = set;
+	}
+	
+	/**
+	 * Returns the list.
+	 * @return List
+	 */
+	public List getList() {
+		return list;
+	}
+	
+	/**
+	 * Sets the list.
+	 * @param list The list to set
+	 */
+	public void setList(List list) {
+		this.list = list;
+	}
+	
+	public Lower getLower() {
+		return lower;
+	}
+
+	public Top getTop() {
+		return top;
+	}
+
+	public void setLower(Lower lower) {
+		this.lower = lower;
+	}
+
+	public void setTop(Top top) {
+		this.top = top;
+	}
+
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Po.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/QueryByExampleTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/QueryByExampleTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/QueryByExampleTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,136 @@
+//$Id: QueryByExampleTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.legacy;
+
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.Criteria;
+import org.hibernate.Transaction;
+import org.hibernate.classic.Session;
+import org.hibernate.criterion.Example;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Query by example test to allow nested components
+ *
+ * @author Emmanuel Bernard
+ */
+public class QueryByExampleTest extends LegacyTestCase {
+
+    public QueryByExampleTest(String name) {
+        super(name);
+    }
+
+    public String[] getMappings() {
+        return new String[] { "legacy/Componentizable.hbm.xml" };
+    }
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( QueryByExampleTest.class );
+	}
+
+    public void testSimpleQBE() throws Exception {
+    	deleteData();
+        initData();
+
+        Session s = openSession();
+
+        Transaction t = s.beginTransaction();
+        Componentizable master = getMaster("hibernate", "open sourc%", "open source1");
+        Criteria crit = s.createCriteria(Componentizable.class);
+        Example ex = Example.create(master).enableLike();
+        crit.add(ex);
+        List result = crit.list();
+        assertNotNull(result);
+        assertEquals(1, result.size());
+
+        t.commit();
+        s.close();
+    }
+
+    public void testJunctionNotExpressionQBE() throws Exception {
+        deleteData();
+        initData();
+        Session s = openSession();
+        Transaction t = s.beginTransaction();
+        Componentizable master = getMaster("hibernate", null, "ope%");
+        Criteria crit = s.createCriteria(Componentizable.class);
+        Example ex = Example.create(master).enableLike();
+
+        crit.add(Restrictions.or(Restrictions.not(ex), ex));
+
+        List result = crit.list();
+        assertNotNull(result);
+        assertEquals(2, result.size());
+        t.commit();
+        s.close();
+
+    }
+
+    public void testExcludingQBE() throws Exception {
+        deleteData();
+        initData();
+        Session s = openSession();
+        Transaction t = s.beginTransaction();
+        Componentizable master = getMaster("hibernate", null, "ope%");
+        Criteria crit = s.createCriteria(Componentizable.class);
+        Example ex = Example.create(master).enableLike()
+            .excludeProperty("component.subComponent");
+        crit.add(ex);
+        List result = crit.list();
+        assertNotNull(result);
+        assertEquals(3, result.size());
+
+        master = getMaster("hibernate", "ORM tool", "fake stuff");
+        crit = s.createCriteria(Componentizable.class);
+        ex = Example.create(master).enableLike()
+            .excludeProperty("component.subComponent.subName1");
+        crit.add(ex);
+        result = crit.list();
+        assertNotNull(result);
+        assertEquals(1, result.size());
+        t.commit();
+        s.close();
+
+
+    }
+
+    private void initData() throws Exception {
+        Session s = openSession();
+        Transaction t = s.beginTransaction();
+        Componentizable master = getMaster("hibernate", "ORM tool", "ORM tool1");
+        s.saveOrUpdate(master);
+        master = getMaster("hibernate", "open source", "open source1");
+        s.saveOrUpdate(master);
+        master = getMaster("hibernate", null, null);
+        s.saveOrUpdate(master);
+        t.commit();
+        s.close();
+    }
+
+    private void deleteData() throws Exception {
+    	Session s = openSession();
+        Transaction t = s.beginTransaction();
+        s.delete("from Componentizable");
+        t.commit();
+        s.close();
+    }
+
+    private Componentizable getMaster(String name, String subname, String subname1) {
+        Componentizable master = new Componentizable();
+        if (name != null) {
+            Component masterComp = new Component();
+            masterComp.setName(name);
+            if (subname != null || subname1 != null) {
+                SubComponent subComponent = new SubComponent();
+                subComponent.setSubName(subname);
+                subComponent.setSubName1(subname1);
+                masterComp.setSubComponent(subComponent);
+            }
+            master.setComponent(masterComp);
+        }
+        return master;
+    }
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/QueryByExampleTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Qux.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Qux.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Qux.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-lazy="false">
+	
+	<class name="org.hibernate.test.legacy.Qux" table="quux" proxy="org.hibernate.test.legacy.Qux"> <!---->
+		<id name="key" column="qux_key" unsaved-value="0">
+			<generator class="hilo"/>
+		</id>
+		<many-to-one name="foo" class="org.hibernate.test.legacy.Foo">
+			<column name="foo" length="36"/>
+		</many-to-one>
+		<property name="deleted"/>
+		<property name="loaded"/>
+		<property name="stored"/>
+		<property name="created"/>
+		<property name="childKey" type="long"/>
+		<property name="stuff"/>
+		<set name="fums" lazy="true">
+			<key column="qux_id"/>
+			<many-to-many class="org.hibernate.test.legacy.Fum">
+				<column name="fum_string" length="10" not-null="true"/>
+				<column name="fum_short" not-null="true"/>
+				<column name="fum_date" not-null="true"/>
+			</many-to-many>
+		</set>
+		<list name="moreFums" lazy="true">
+			<key column="qux_id"/>
+			<index column="posn"/>
+			<one-to-many class="org.hibernate.test.legacy.Fum"/>
+		</list>
+		<many-to-one name="holder" column="HOLDER_NAME" property-ref="name"/>
+	</class>
+	
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Qux.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Qux.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Qux.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Qux.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,180 @@
+//$Id: Qux.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+import java.sql.SQLException;
+import java.util.List;
+import java.util.Set;
+
+import org.hibernate.CallbackException;
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
+import org.hibernate.classic.Lifecycle;
+
+public class Qux implements Lifecycle {
+
+	boolean created;
+	boolean deleted;
+	boolean loaded;
+	boolean stored;
+	private Long key;
+	private String stuff;
+	private Set fums;
+	private List moreFums;
+	private Qux child;
+	private Session session;
+	private Long childKey;
+	private Holder holder;
+
+	private FooProxy foo;
+
+	public Qux() { }
+
+	public Qux(String s) {
+		stuff=s;
+	}
+
+	public boolean onSave(Session session) throws CallbackException {
+		created=true;
+		try {
+			foo = new Foo();
+			session.save(foo);
+		}
+		catch (Exception e) {
+			throw new CallbackException(e);
+		}
+		foo.setString("child of a qux");
+		return NO_VETO;
+	}
+
+	public boolean onDelete(Session session) throws CallbackException {
+		deleted=true;
+		try {
+			session.delete(foo);
+		}
+		catch (Exception e) {
+			throw new CallbackException(e);
+		}
+		//if (child!=null) session.delete(child);
+		return NO_VETO;
+	}
+
+	public void onLoad(Session session, Serializable id) {
+		loaded=true;
+		this.session=session;
+	}
+
+	public void store() {
+	}
+
+	public FooProxy getFoo() {
+		return foo;
+	}
+	public void setFoo(FooProxy foo) {
+		this.foo = foo;
+	}
+
+	public boolean getCreated() {
+		return created;
+	}
+	private void setCreated(boolean created) {
+		this.created = created;
+	}
+
+	public boolean getDeleted() {
+		return deleted;
+	}
+
+	private void setDeleted(boolean deleted) {
+		this.deleted = deleted;
+	}
+
+	public boolean getLoaded() {
+		return loaded;
+	}
+	private void setLoaded(boolean loaded) {
+		this.loaded = loaded;
+	}
+
+	public boolean getStored() {
+		return stored;
+	}
+	private void setStored(boolean stored) {
+		this.stored = stored;
+	}
+
+	public Long getKey() {
+		return key;
+	}
+
+	private void setKey(long key) {
+		this.key = new Long(key);
+	}
+
+	public void setTheKey(long key) {
+		this.key = new Long(key);
+	}
+
+	public String getStuff() {
+		return stuff;
+	}
+	public void setStuff(String stuff) {
+		this.stuff = stuff;
+	}
+
+	public Set getFums() {
+		return fums;
+	}
+
+	public void setFums(Set fums) {
+		this.fums = fums;
+	}
+
+	public List getMoreFums() {
+		return moreFums;
+	}
+	public void setMoreFums(List moreFums) {
+		this.moreFums = moreFums;
+	}
+
+	public Qux getChild() throws HibernateException, SQLException {
+		stored=true;
+		this.childKey = child==null ? null : child.getKey();
+		if (childKey!=null && child==null) child = (Qux) session.load(Qux.class, childKey);
+		return child;
+	}
+
+	public void setChild(Qux child) {
+		this.child = child;
+	}
+
+	private Long getChildKey() {
+		return childKey;
+	}
+
+	private void setChildKey(Long childKey) {
+		this.childKey = childKey;
+	}
+
+	public boolean onUpdate(Session s) throws CallbackException {
+		return NO_VETO;
+	}
+
+	protected void finalize() { }
+
+	public Holder getHolder() {
+		return holder;
+	}
+
+	public void setHolder(Holder holder) {
+		this.holder = holder;
+	}
+
+}
+
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Qux.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Resource.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Resource.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Resource.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,38 @@
+package org.hibernate.test.legacy;
+
+/**
+ * @author hbm2java
+ */
+public class Resource {
+
+   java.lang.String id;
+   java.lang.String name;
+   java.lang.String userCode;
+
+
+  java.lang.String getId() {
+    return id;
+  }
+
+  void  setId(java.lang.String newValue) {
+    id = newValue;
+  }
+
+  java.lang.String getName() {
+    return name;
+  }
+
+  void  setName(java.lang.String newValue) {
+    name = newValue;
+  }
+
+  java.lang.String getUserCode() {
+    return userCode;
+  }
+
+  void  setUserCode(java.lang.String newValue) {
+    userCode = newValue;
+  }
+
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Resource.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Result.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Result.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Result.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,67 @@
+package org.hibernate.test.legacy;
+
+
+public class Result {
+	private String name;
+	private long amount;
+	private long count;
+	/**
+	 * Returns the amount.
+	 * @return long
+	 */
+	public long getAmount() {
+		return amount;
+	}
+
+	/**
+	 * Returns the count.
+	 * @return int
+	 */
+	public long getCount() {
+		return count;
+	}
+
+	/**
+	 * Returns the name.
+	 * @return String
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * Sets the amount.
+	 * @param amount The amount to set
+	 */
+	public void setAmount(long amount) {
+		this.amount = amount;
+	}
+
+	/**
+	 * Sets the count.
+	 * @param count The count to set
+	 */
+	public void setCount(long count) {
+		this.count = count;
+	}
+
+	/**
+	 * Sets the name.
+	 * @param name The name to set
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	public Result(String n, long a, int c) {
+		name = n;
+		amount = a;
+		count = c;
+	}
+	
+	public Result(String n, long a, long c) {
+		name = n;
+		amount = a;
+		count = c;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Result.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ReverseComparator.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ReverseComparator.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ReverseComparator.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,26 @@
+//$Id: ReverseComparator.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+import java.util.Comparator;
+
+public final class ReverseComparator implements Comparator, Serializable {
+	public int compare(Object x, Object y) {
+		return - ( (Comparable) x ).compareTo(y);
+	}
+	
+	public boolean equals(Object obj) {
+		return obj instanceof ReverseComparator;
+	}
+	
+	public int hashCode() {
+		return 0;
+	}
+	
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/ReverseComparator.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Role.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Role.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Role.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,48 @@
+package org.hibernate.test.legacy;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author hbm2java
+ */
+public class Role {
+
+   long id;
+   java.lang.String name;
+   Set interventions = new HashSet();
+private List bunchOfStrings;
+
+  long getId() {
+    return id;
+  }
+
+  void  setId(long newValue) {
+    id = newValue;
+  }
+
+  java.lang.String getName() {
+    return name;
+  }
+
+  void  setName(java.lang.String newValue) {
+    name = newValue;
+  }
+
+  public Set getInterventions() {
+  	return interventions;
+  }
+  
+  public void setInterventions(Set iv) {
+  	interventions = iv;
+  }
+
+  List getBunchOfStrings() {
+  	return bunchOfStrings;
+  }
+  
+  void setBunchOfStrings(List s) {
+  	bunchOfStrings = s;
+  }
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Role.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/S.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/S.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/S.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,42 @@
+//$Id: S.java 4599 2004-09-26 05:18:27Z oneovthafew $
+
+package org.hibernate.test.legacy;
+
+public class S {
+	private String address;
+	private int count;
+
+	public S(int countArg, String addressArg) {
+		count = countArg;
+		address = addressArg;
+	}
+	
+	/**
+	 * Gets the address
+	 * @return Returns a String
+	 */
+	public String getAddress() {
+		return address;
+	}
+	/**
+	 * Sets the address
+	 * @param address The address to set
+	 */
+	public void setAddress(String address) {
+		this.address = address;
+	}
+	/**
+	 * Gets the count
+	 * @return Returns a int
+	 */
+	public int getCount() {
+		return count;
+	}
+	/**
+	 * Sets the count
+	 * @param count The count to set
+	 */
+	public void setCount(int count) {
+		this.count = count;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/S.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/SQLFunctionsTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/SQLFunctionsTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/SQLFunctionsTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,715 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.legacy;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.hibernate.Query;
+import org.hibernate.ScrollableResults;
+import org.hibernate.Transaction;
+import org.hibernate.classic.Session;
+import org.hibernate.dialect.DB2Dialect;
+import org.hibernate.dialect.HSQLDialect;
+import org.hibernate.dialect.InterbaseDialect;
+import org.hibernate.dialect.MckoiDialect;
+import org.hibernate.dialect.MySQLDialect;
+import org.hibernate.dialect.SybaseDialect;
+import org.hibernate.dialect.Sybase11Dialect;
+import org.hibernate.dialect.SybaseASE15Dialect;
+import org.hibernate.dialect.SybaseAnywhereDialect;
+import org.hibernate.dialect.TimesTenDialect;
+import org.hibernate.dialect.SQLServerDialect;
+import org.hibernate.dialect.Oracle9iDialect;
+import org.hibernate.dialect.function.SQLFunction;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+
+public class SQLFunctionsTest extends LegacyTestCase {
+
+	private static final Logger log = LoggerFactory.getLogger(SQLFunctionsTest.class);
+
+	public SQLFunctionsTest(String name) {
+		super(name);
+	}
+
+	public String[] getMappings() {
+		return new String[] {
+			"legacy/AltSimple.hbm.xml",
+			"legacy/Broken.hbm.xml",
+			"legacy/Blobber.hbm.xml"
+		};
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( SQLFunctionsTest.class );
+	}
+
+	public void testDialectSQLFunctions() throws Exception {
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Iterator iter = s.createQuery( "select max(s.count) from Simple s" ).iterate();
+
+		if ( getDialect() instanceof MySQLDialect ) assertTrue( iter.hasNext() && iter.next()==null );
+
+		Simple simple = new Simple();
+		simple.setName("Simple Dialect Function Test");
+		simple.setAddress("Simple Address");
+		simple.setPay(new Float(45.8));
+		simple.setCount(2);
+		s.save(simple, new Long(10) );
+
+		// Test to make sure allocating an specified object operates correctly.
+		assertTrue(
+				s.createQuery( "select new org.hibernate.test.legacy.S(s.count, s.address) from Simple s" ).list().size() == 1
+		);
+
+		// Quick check the base dialect functions operate correctly
+		assertTrue(
+				s.createQuery( "select max(s.count) from Simple s" ).list().size() == 1
+		);
+		assertTrue(
+				s.createQuery( "select count(*) from Simple s" ).list().size() == 1
+		);
+
+		if ( getDialect() instanceof Oracle9iDialect ) {
+			// Check Oracle Dialect mix of dialect functions - no args (no parenthesis and single arg functions
+			List rset = s.createQuery( "select s.name, sysdate(), trunc(s.pay), round(s.pay) from Simple s" ).list();
+			assertNotNull("Name string should have been returned",(((Object[])rset.get(0))[0]));
+			assertNotNull("Todays Date should have been returned",(((Object[])rset.get(0))[1]));
+			assertEquals("trunc(45.8) result was incorrect ", new Float(45), ( (Object[]) rset.get(0) )[2] );
+			assertEquals("round(45.8) result was incorrect ", new Float(46), ( (Object[]) rset.get(0) )[3] );
+
+			simple.setPay(new Float(-45.8));
+			s.update(simple);
+
+			// Test type conversions while using nested functions (Float to Int).
+			rset = s.createQuery( "select abs(round(s.pay)) from Simple s" ).list();
+			assertEquals("abs(round(-45.8)) result was incorrect ", new Float(46), rset.get(0));
+
+			// Test a larger depth 3 function example - Not a useful combo other than for testing
+			assertTrue(
+					s.createQuery( "select trunc(round(sysdate())) from Simple s" ).list().size() == 1
+			);
+
+			// Test the oracle standard NVL funtion as a test of multi-param functions...
+			simple.setPay(null);
+			s.update(simple);
+			Integer value = (Integer) s.createQuery(
+					"select MOD( NVL(s.pay, 5000), 2 ) from Simple as s where s.id = 10"
+			).list()
+					.get(0);
+			assertTrue( 0 == value.intValue() );
+		}
+
+		if ( (getDialect() instanceof HSQLDialect) ) {
+			// Test the hsql standard MOD funtion as a test of multi-param functions...
+			Integer value = (Integer) s.createQuery( "select MOD(s.count, 2) from Simple as s where s.id = 10" )
+					.list()
+					.get(0);
+			assertTrue( 0 == value.intValue() );
+		}
+
+		s.delete(simple);
+		t.commit();
+		s.close();
+	}
+
+	public void testSetProperties() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Simple simple = new Simple();
+		simple.setName("Simple 1");
+		s.save(simple, new Long(10) );
+		Query q = s.createQuery("from Simple s where s.name=:name and s.count=:count");
+		q.setProperties(simple);
+		assertTrue( q.list().get(0)==simple );
+		//misuse of "Single" as a propertyobject, but it was the first testclass i found with a collection ;)
+		Single single = new Single() { // trivial hack to test properties with arrays.
+			String[] getStuff() { return (String[]) getSeveral().toArray(new String[getSeveral().size()]); }
+		};
+
+		List l = new ArrayList();
+		l.add("Simple 1");
+		l.add("Slimeball");
+		single.setSeveral(l);
+		q = s.createQuery("from Simple s where s.name in (:several)");
+		q.setProperties(single);
+		assertTrue( q.list().get(0)==simple );
+
+
+		q = s.createQuery("from Simple s where s.name in (:stuff)");
+		q.setProperties(single);
+		assertTrue( q.list().get(0)==simple );
+		s.delete(simple);
+		t.commit();
+		s.close();
+	}
+
+	public void testSetPropertiesMap() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Simple simple = new Simple();
+		simple.setName("Simple 1");
+		s.save(simple, new Long(10) );
+		Map parameters = new HashMap();
+		parameters.put("name", simple.getName());
+		parameters.put("count", new Integer(simple.getCount()));
+
+		Query q = s.createQuery("from Simple s where s.name=:name and s.count=:count");
+		q.setProperties(((Map)parameters));
+		assertTrue( q.list().get(0)==simple );
+
+		List l = new ArrayList();
+		l.add("Simple 1");
+		l.add("Slimeball");
+		parameters.put("several", l);
+		q = s.createQuery("from Simple s where s.name in (:several)");
+		q.setProperties(parameters);
+		assertTrue( q.list().get(0)==simple );
+
+
+		parameters.put("stuff", l.toArray(new String[0]));
+		q = s.createQuery("from Simple s where s.name in (:stuff)");
+		q.setProperties(parameters);
+		assertTrue( q.list().get(0)==simple );
+		s.delete(simple);
+		t.commit();
+		s.close();
+	}
+	public void testBroken() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Broken b = new Fixed();
+		b.setId( new Long(123));
+		b.setOtherId("foobar");
+		s.save(b);
+		s.flush();
+		b.setTimestamp( new Date() );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.update(b);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		b = (Broken) s.load( Broken.class, b );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete(b);
+		t.commit();
+		s.close();
+	}
+
+	public void testNothinToUpdate() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Simple simple = new Simple();
+		simple.setName("Simple 1");
+		s.save( simple, new Long(10) );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.update( simple, new Long(10) );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.update( simple, new Long(10) );
+		s.delete(simple);
+		t.commit();
+		s.close();
+	}
+
+	public void testCachedQuery() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Simple simple = new Simple();
+		simple.setName("Simple 1");
+		s.save( simple, new Long(10) );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Query q = s.createQuery("from Simple s where s.name=?");
+		q.setCacheable(true);
+		q.setString(0, "Simple 1");
+		assertTrue( q.list().size()==1 );
+		assertTrue( q.list().size()==1 );
+		assertTrue( q.list().size()==1 );
+		q = s.createQuery("from Simple s where s.name=:name");
+		q.setCacheable(true);
+		q.setString("name", "Simple 1");
+		assertTrue( q.list().size()==1 );
+		simple = (Simple) q.list().get(0);
+
+		q.setString("name", "Simple 2");
+		assertTrue( q.list().size()==0 );
+		assertTrue( q.list().size()==0 );
+		simple.setName("Simple 2");
+		assertTrue( q.list().size()==1 );
+		assertTrue( q.list().size()==1 );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		q = s.createQuery("from Simple s where s.name=:name");
+		q.setString("name", "Simple 2");
+		q.setCacheable(true);
+		assertTrue( q.list().size()==1 );
+		assertTrue( q.list().size()==1 );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.update( simple, new Long(10) );
+		s.delete(simple);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		q = s.createQuery("from Simple s where s.name=?");
+		q.setCacheable(true);
+		q.setString(0, "Simple 1");
+		assertTrue( q.list().size()==0 );
+		assertTrue( q.list().size()==0 );
+		t.commit();
+		s.close();
+	}
+
+	public void testCachedQueryRegion() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Simple simple = new Simple();
+		simple.setName("Simple 1");
+		s.save( simple, new Long(10) );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Query q = s.createQuery("from Simple s where s.name=?");
+		q.setCacheRegion("foo");
+		q.setCacheable(true);
+		q.setString(0, "Simple 1");
+		assertTrue( q.list().size()==1 );
+		assertTrue( q.list().size()==1 );
+		assertTrue( q.list().size()==1 );
+		q = s.createQuery("from Simple s where s.name=:name");
+		q.setCacheRegion("foo");
+		q.setCacheable(true);
+		q.setString("name", "Simple 1");
+		assertTrue( q.list().size()==1 );
+		simple = (Simple) q.list().get(0);
+
+		q.setString("name", "Simple 2");
+		assertTrue( q.list().size()==0 );
+		assertTrue( q.list().size()==0 );
+		simple.setName("Simple 2");
+		assertTrue( q.list().size()==1 );
+		assertTrue( q.list().size()==1 );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.update( simple, new Long(10) );
+		s.delete(simple);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		q = s.createQuery("from Simple s where s.name=?");
+		q.setCacheRegion("foo");
+		q.setCacheable(true);
+		q.setString(0, "Simple 1");
+		assertTrue( q.list().size()==0 );
+		assertTrue( q.list().size()==0 );
+		t.commit();
+		s.close();
+	}
+
+	public void testSQLFunctions() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Simple simple = new Simple();
+		simple.setName("Simple 1");
+		s.save(simple, new Long(10) );
+
+		if ( getDialect() instanceof DB2Dialect) {
+			s.createQuery( "from Simple s where repeat('foo', 3) = 'foofoofoo'" ).list();
+			s.createQuery( "from Simple s where repeat(s.name, 3) = 'foofoofoo'" ).list();
+			s.createQuery( "from Simple s where repeat( lower(s.name), 3 + (1-1) / 2) = 'foofoofoo'" ).list();
+		}
+
+		assertTrue(
+				s.createQuery( "from Simple s where upper( s.name ) ='SIMPLE 1'" ).list().size()==1
+		);
+		if ( !(getDialect() instanceof HSQLDialect) ) {
+			assertTrue(
+					s.createQuery(
+							"from Simple s where not( upper( s.name ) ='yada' or 1=2 or 'foo'='bar' or not('foo'='foo') or 'foo' like 'bar' )"
+					).list()
+							.size()==1
+			);
+		}
+		if ( !(getDialect() instanceof MySQLDialect) && !(getDialect() instanceof SybaseDialect) && !(getDialect() instanceof SQLServerDialect) && !(getDialect() instanceof MckoiDialect) && !(getDialect() instanceof InterbaseDialect) && !(getDialect() instanceof TimesTenDialect) ) { //My SQL has a funny concatenation operator
+			assertTrue(
+					s.createQuery( "from Simple s where lower( s.name || ' foo' ) ='simple 1 foo'" ).list().size()==1
+			);
+		}
+		if ( (getDialect() instanceof SybaseDialect) ) {
+			assertTrue(
+					s.createQuery( "from Simple s where lower( s.name + ' foo' ) ='simple 1 foo'" ).list().size()==1
+			);
+		}
+		if ( (getDialect() instanceof MckoiDialect) || (getDialect() instanceof TimesTenDialect)) {
+			assertTrue(
+					s.createQuery( "from Simple s where lower( concat(s.name, ' foo') ) ='simple 1 foo'" ).list().size()==1
+			);
+		}
+
+		Simple other = new Simple();
+		other.setName("Simple 2");
+		other.setCount(12);
+		simple.setOther(other);
+		s.save( other, new Long(20) );
+		//s.find("from Simple s where s.name ## 'cat|rat|bag'");
+		assertTrue(
+				s.createQuery( "from Simple s where upper( s.other.name ) ='SIMPLE 2'" ).list().size()==1
+		);
+		assertTrue(
+				s.createQuery( "from Simple s where not ( upper( s.other.name ) ='SIMPLE 2' )" ).list().size()==0
+		);
+		assertTrue(
+				s.createQuery(
+						"select distinct s from Simple s where ( ( s.other.count + 3 ) = (15*2)/2 and s.count = 69) or ( ( s.other.count + 2 ) / 7 ) = 2"
+				).list()
+						.size()==1
+		);
+		assertTrue(
+				s.createQuery(
+						"select s from Simple s where ( ( s.other.count + 3 ) = (15*2)/2 and s.count = 69) or ( ( s.other.count + 2 ) / 7 ) = 2 order by s.other.count"
+				).list()
+						.size()==1
+		);
+		Simple min = new Simple();
+		min.setCount(-1);
+		s.save(min, new Long(30) );
+		if ( ! (getDialect() instanceof MySQLDialect) && ! (getDialect() instanceof HSQLDialect) ) { //My SQL has no subqueries
+			assertTrue(
+					s.createQuery( "from Simple s where s.count > ( select min(sim.count) from Simple sim )" )
+							.list()
+							.size()==2
+			);
+			t.commit();
+			t = s.beginTransaction();
+			assertTrue(
+					s.createQuery(
+							"from Simple s where s = some( select sim from Simple sim where sim.count>=0 ) and s.count >= 0"
+					).list()
+							.size()==2
+			);
+			assertTrue(
+					s.createQuery(
+							"from Simple s where s = some( select sim from Simple sim where sim.other.count=s.other.count ) and s.other.count > 0"
+					).list()
+							.size()==1
+			);
+		}
+
+		Iterator iter = s.createQuery( "select sum(s.count) from Simple s group by s.count having sum(s.count) > 10" )
+				.iterate();
+		assertTrue( iter.hasNext() );
+		assertEquals( new Long(12), iter.next() );
+		assertTrue( !iter.hasNext() );
+		if ( ! (getDialect() instanceof MySQLDialect) ) {
+			iter = s.createQuery( "select s.count from Simple s group by s.count having s.count = 12" ).iterate();
+			assertTrue( iter.hasNext() );
+		}
+
+		s.createQuery(
+				"select s.id, s.count, count(t), max(t.date) from Simple s, Simple t where s.count = t.count group by s.id, s.count order by s.count"
+		).iterate();
+
+		Query q = s.createQuery("from Simple s");
+		q.setMaxResults(10);
+		assertTrue( q.list().size()==3 );
+		q = s.createQuery("from Simple s");
+		q.setMaxResults(1);
+		assertTrue( q.list().size()==1 );
+		q = s.createQuery("from Simple s");
+		assertTrue( q.list().size()==3 );
+		q = s.createQuery("from Simple s where s.name = ?");
+		q.setString(0, "Simple 1");
+		assertTrue( q.list().size()==1 );
+		q = s.createQuery("from Simple s where s.name = ? and upper(s.name) = ?");
+		q.setString(1, "SIMPLE 1");
+		q.setString(0, "Simple 1");
+		q.setFirstResult(0);
+		assertTrue( q.iterate().hasNext() );
+		q = s.createQuery("from Simple s where s.name = :foo and upper(s.name) = :bar or s.count=:count or s.count=:count + 1");
+		q.setParameter("bar", "SIMPLE 1");
+		q.setString("foo", "Simple 1");
+		q.setInteger("count", 69);
+		q.setFirstResult(0);
+		assertTrue( q.iterate().hasNext() );
+		q = s.createQuery("select s.id from Simple s");
+		q.setFirstResult(1);
+		q.setMaxResults(2);
+		iter = q.iterate();
+		int i=0;
+		while ( iter.hasNext() ) {
+			assertTrue( iter.next() instanceof Long );
+			i++;
+		}
+		assertTrue(i==2);
+		q = s.createQuery("select all s, s.other from Simple s where s = :s");
+		q.setParameter("s", simple);
+		assertTrue( q.list().size()==1 );
+
+
+		q = s.createQuery("from Simple s where s.name in (:name_list) and s.count > :count");
+		HashSet set = new HashSet();
+		set.add("Simple 1"); set.add("foo");
+		q.setParameterList( "name_list", set );
+		q.setParameter("count", new Integer(-1) );
+		assertTrue( q.list().size()==1 );
+
+		ScrollableResults sr = s.createQuery("from Simple s").scroll();
+		sr.next();
+		sr.get(0);
+		sr.close();
+
+		s.delete(other);
+		s.delete(simple);
+		s.delete(min);
+		t.commit();
+		s.close();
+
+	}
+
+	public void testBlobClob() throws Exception {
+
+		Session s = openSession();
+		Blobber b = new Blobber();
+		b.setBlob( s.getLobHelper().createBlob( "foo/bar/baz".getBytes() ) );
+		b.setClob( s.getLobHelper().createClob("foo/bar/baz") );
+		s.save(b);
+		//s.refresh(b);
+		//assertTrue( b.getClob() instanceof ClobImpl );
+		s.flush();
+
+		// Sybase does not support ResultSet.getBlob(String)
+		if ( getDialect() instanceof SybaseDialect || getDialect() instanceof Sybase11Dialect || getDialect() instanceof SybaseASE15Dialect || getDialect() instanceof SybaseAnywhereDialect ) {
+			s.connection().rollback();
+			s.close();
+			return;
+		}
+
+		s.refresh(b);
+		//b.getBlob().setBytes( 2, "abc".getBytes() );
+		b.getClob().getSubString(2, 3);
+		//b.getClob().setString(2, "abc");
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		s = openSession();
+		b = (Blobber) s.load( Blobber.class, new Integer( b.getId() ) );
+		Blobber b2 = new Blobber();
+		s.save(b2);
+		b2.setBlob( b.getBlob() );
+		b.setBlob(null);
+		//assertTrue( b.getClob().getSubString(1, 3).equals("fab") );
+		b.getClob().getSubString(1, 6);
+		//b.getClob().setString(1, "qwerty");
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		s = openSession();
+		b = (Blobber) s.load( Blobber.class, new Integer( b.getId() ) );
+		b.setClob( s.getLobHelper().createClob("xcvfxvc xcvbx cvbx cvbx cvbxcvbxcvbxcvb") );
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		s = openSession();
+		b = (Blobber) s.load( Blobber.class, new Integer( b.getId() ) );
+		assertTrue( b.getClob().getSubString(1, 7).equals("xcvfxvc") );
+		//b.getClob().setString(5, "1234567890");
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+
+		/*InputStream is = getClass().getClassLoader().getResourceAsStream("jdbc20.pdf");
+		s = sessionsopenSession();
+		b = (Blobber) s.load( Blobber.class, new Integer( b.getId() ) );
+		System.out.println( is.available() );
+		int size = is.available();
+		b.setBlob( Hibernate.createBlob( is, is.available() ) );
+		s.flush();
+		s.connection().commit();
+		ResultSet rs = s.connection().createStatement().executeQuery("select datalength(blob_) from blobber where id=" + b.getId() );
+		rs.next();
+		assertTrue( size==rs.getInt(1) );
+		rs.close();
+		s.close();
+
+		s = sessionsopenSession();
+		b = (Blobber) s.load( Blobber.class, new Integer( b.getId() ) );
+		File f = new File("C:/foo.pdf");
+		f.createNewFile();
+		FileOutputStream fos = new FileOutputStream(f);
+		Blob blob = b.getBlob();
+		byte[] bytes = blob.getBytes( 1, (int) blob.length() );
+		System.out.println( bytes.length );
+		fos.write(bytes);
+		fos.flush();
+		fos.close();
+		s.close();*/
+
+	}
+
+	public void testSqlFunctionAsAlias() throws Exception {
+		String functionName = locateAppropriateDialectFunctionNameForAliasTest();
+		if (functionName == null) {
+			log.info("Dialect does not list any no-arg functions");
+			return;
+		}
+
+		log.info("Using function named [" + functionName + "] for 'function as alias' test");
+		String query = "select " + functionName + " from Simple as " + functionName + " where " + functionName + ".id = 10";
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Simple simple = new Simple();
+		simple.setName("Simple 1");
+		s.save( simple, new Long(10) );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		List result = s.createQuery( query ).list();
+		assertTrue( result.size() == 1 );
+		assertTrue(result.get(0) instanceof Simple);
+		s.delete( result.get(0) );
+		t.commit();
+		s.close();
+	}
+
+	private String locateAppropriateDialectFunctionNameForAliasTest() {
+		for (Iterator itr = getDialect().getFunctions().entrySet().iterator(); itr.hasNext(); ) {
+			final Map.Entry entry = (Map.Entry) itr.next();
+			final SQLFunction function = (SQLFunction) entry.getValue();
+			if ( !function.hasArguments() && !function.hasParenthesesIfNoArguments() ) {
+				return (String) entry.getKey();
+			}
+		}
+		return null;
+	}
+
+	public void testCachedQueryOnInsert() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Simple simple = new Simple();
+		simple.setName("Simple 1");
+		s.save( simple, new Long(10) );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Query q = s.createQuery("from Simple s");
+		List list = q.setCacheable(true).list();
+		assertTrue( list.size()==1 );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		q = s.createQuery("from Simple s");
+		list = q.setCacheable(true).list();
+		assertTrue( list.size()==1 );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Simple simple2 = new Simple();
+		simple2.setCount(133);
+		s.save( simple2, new Long(12) );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		q = s.createQuery("from Simple s");
+		list = q.setCacheable(true).list();
+		assertTrue( list.size()==2 );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		q = s.createQuery("from Simple s");
+		list = q.setCacheable(true).list();
+		assertTrue( list.size()==2 );
+		Iterator i = list.iterator();
+		while ( i.hasNext() ) s.delete( i.next() );
+		t.commit();
+		s.close();
+
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/SQLFunctionsTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/SQLLoaderTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/SQLLoaderTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/SQLLoaderTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,661 @@
+//$Id: SQLLoaderTest.java 11383 2007-04-02 15:34:02Z steve.ebersole at jboss.com $
+package org.hibernate.test.legacy;
+
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.HibernateException;
+import org.hibernate.Query;
+import org.hibernate.Transaction;
+import org.hibernate.classic.Session;
+import org.hibernate.dialect.HSQLDialect;
+import org.hibernate.dialect.MySQLDialect;
+import org.hibernate.dialect.PostgreSQLDialect;
+import org.hibernate.dialect.TimesTenDialect;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+
+public class SQLLoaderTest extends LegacyTestCase {
+
+	static int nextInt = 1;
+	static long nextLong = 1;
+
+	public SQLLoaderTest(String arg) {
+		super(arg);
+	}
+
+	public String[] getMappings() {
+		return new String[] {
+			"legacy/ABC.hbm.xml",
+			"legacy/Category.hbm.xml",
+			"legacy/Simple.hbm.xml",
+			"legacy/Fo.hbm.xml",
+			"legacy/SingleSeveral.hbm.xml",
+			"legacy/Componentizable.hbm.xml",
+            "legacy/CompositeIdId.hbm.xml"
+		};
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( SQLLoaderTest.class );
+	}
+
+	public void testTS() throws Exception {
+		Session session = openSession();
+		Transaction txn = session.beginTransaction();
+		Simple sim = new Simple();
+		sim.setDate( new Date() );
+		session.save( sim, new Long(1) );
+		Query q = session.createSQLQuery("select {sim.*} from Simple {sim} where {sim}.date_ = ?", "sim", Simple.class);
+		q.setTimestamp( 0, sim.getDate() );
+		assertTrue ( q.list().size()==1 );
+		session.delete(sim);
+		txn.commit();
+		session.close();
+	}
+
+
+	public void testFindBySQLStar() throws HibernateException, SQLException {
+		Session session = openSession();
+		session.delete("from Assignable");
+		session.delete("from Category");
+		session.delete("from Simple");
+		session.delete("from A");
+
+		Category s = new Category();
+		s.setName(String.valueOf(nextLong++));
+		session.save(s);
+
+		Simple simple = new Simple();
+		simple.init();
+		session.save(simple, new Long(nextLong++));
+
+		A a = new A();
+		session.save(a);
+
+		B b = new B();
+		session.save(b);
+		session.flush();
+
+		session.createSQLQuery("select {category.*} from category {category}", "category", Category.class).list();
+		session.createSQLQuery("select {simple.*} from Simple {simple}", "simple", Simple.class).list();
+		session.createSQLQuery("select {a.*} from TA {a}", "a", A.class).list();
+
+		session.connection().commit();
+		session.close();
+
+	}
+
+	public void testFindBySQLProperties() throws HibernateException, SQLException {
+			Session session = openSession();
+			session.delete("from Category");
+
+			Category s = new Category();
+			s.setName(String.valueOf(nextLong++));
+			session.save(s);
+
+			s = new Category();
+			s.setName("WannaBeFound");
+			session.flush();
+
+			Query query = session.createSQLQuery("select {category.*} from category {category} where {category}.name = :name", "category", Category.class);
+
+			query.setProperties(s);
+			//query.setParameter("name", s.getName());
+
+			query.list();
+
+			query = session.createSQLQuery("select {category.*} from category {category} where {category}.name in (:names)", "category", Category.class);
+			String[] str = new String[] { "WannaBeFound", "NotThere" };
+			query.setParameterList("names", str);
+			
+			query.uniqueResult();
+			
+			session.connection().commit();
+			session.close();
+			
+			
+
+		}
+
+	public void testFindBySQLAssociatedObjects() throws HibernateException, SQLException {
+		Session s = openSession();
+		s.delete("from Assignable");
+		s.delete("from Category");
+
+		Category c = new Category();
+		c.setName("NAME");
+		Assignable assn = new Assignable();
+		assn.setId("i.d.");
+		List l = new ArrayList();
+		l.add(c);
+		assn.setCategories(l);
+		c.setAssignable(assn);
+		s.save(assn);
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		s = openSession();
+		List list = s.createSQLQuery("select {category.*} from category {category}", "category", Category.class).list();
+		list.get(0);
+		s.connection().commit();
+		s.close();
+		
+		if ( getDialect() instanceof MySQLDialect ) return;
+
+		s = openSession();
+
+		Query query = s.getNamedQuery("namedsql");
+		assertNotNull(query);
+		list = query.list();
+        assertNotNull(list);
+		
+		Object[] values = (Object[]) list.get(0);
+		assertNotNull(values[0]);
+		assertNotNull(values[1]);
+		assertTrue("wrong type: " + values[0].getClass(), values[0] instanceof Category);
+		assertTrue("wrong type: " + values[1].getClass(), values[1] instanceof Assignable);
+		
+		s.connection().commit();
+		s.close();
+
+	}
+
+	public void testPropertyResultSQL() throws HibernateException, SQLException {
+		
+		if ( getDialect() instanceof MySQLDialect ) return;
+			
+		Session s = openSession();
+		s.delete("from Assignable");
+		s.delete("from Category");
+
+		Category c = new Category();
+		c.setName("NAME");
+		Assignable assn = new Assignable();
+		assn.setId("i.d.");
+		List l = new ArrayList();
+		l.add(c);
+		assn.setCategories(l);
+		c.setAssignable(assn);
+		s.save(assn);
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		s = openSession();
+
+		Query query = s.getNamedQuery("nonaliasedsql");
+		assertNotNull(query);
+		List list = query.list();
+        assertNotNull(list);
+		
+		assertTrue(list.get(0) instanceof Category);
+		
+		s.connection().commit();
+		s.close();
+
+	}
+	
+	public void testFindBySQLMultipleObject() throws HibernateException, SQLException {
+		Session s = openSession();
+		s.delete("from Assignable");
+		s.delete("from Category");
+		s.flush();
+		s.connection().commit();
+		s.close();
+		s = openSession();
+		Category c = new Category();
+		c.setName("NAME");
+		Assignable assn = new Assignable();
+		assn.setId("i.d.");
+		List l = new ArrayList();
+		l.add(c);
+		assn.setCategories(l);
+		c.setAssignable(assn);
+		s.save(assn);
+		s.flush();
+		c = new Category();
+		c.setName("NAME2");
+		assn = new Assignable();
+		assn.setId("i.d.2");
+		l = new ArrayList();
+		l.add(c);
+		assn.setCategories(l);
+		c.setAssignable(assn);
+		s.save(assn);
+		s.flush();
+
+		assn = new Assignable();
+		assn.setId("i.d.3");
+		s.save(assn);
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		if ( getDialect() instanceof MySQLDialect ) return;
+
+		s = openSession();
+		List list = s.createSQLQuery("select {category.*}, {assignable.*} from category {category}, \"assign-able\" {assignable}", new String[] { "category", "assignable" }, new Class[] { Category.class, Assignable.class }).list();
+
+		assertTrue(list.size() == 6); // crossproduct of 2 categories x 3 assignables
+		assertTrue(list.get(0) instanceof Object[]);
+		s.connection().commit();
+		s.close();
+	}
+
+	public void testFindBySQLParameters() throws HibernateException, SQLException {
+		Session s = openSession();
+		s.delete("from Assignable");
+		s.delete("from Category");
+		s.flush();
+		s.connection().commit();
+		s.close();
+		s = openSession();
+		Category c = new Category();
+		c.setName("Good");
+		Assignable assn = new Assignable();
+		assn.setId("i.d.");
+		List l = new ArrayList();
+		l.add(c);
+		assn.setCategories(l);
+		c.setAssignable(assn);
+		s.save(assn);
+		s.flush();
+		c = new Category();
+		c.setName("Best");
+		assn = new Assignable();
+		assn.setId("i.d.2");
+		l = new ArrayList();
+		l.add(c);
+		assn.setCategories(l);
+		c.setAssignable(assn);
+		s.save(assn);
+		s.flush();
+		c = new Category();
+		c.setName("Better");
+		assn = new Assignable();
+		assn.setId("i.d.7");
+		l = new ArrayList();
+		l.add(c);
+		assn.setCategories(l);
+		c.setAssignable(assn);
+		s.save(assn);
+		s.flush();
+
+		assn = new Assignable();
+		assn.setId("i.d.3");
+		s.save(assn);
+		s.flush();
+		s.connection().commit();
+		s.close();
+
+		s = openSession();
+		Query basicParam = s.createSQLQuery("select {category.*} from category {category} where {category}.name = 'Best'", "category", Category.class);
+		List list = basicParam.list();
+		assertEquals(1, list.size());
+
+		Query unnamedParam = s.createSQLQuery("select {category.*} from category {category} where {category}.name = ? or {category}.name = ?", "category", Category.class);
+		unnamedParam.setString(0, "Good");
+		unnamedParam.setString(1, "Best");
+		list = unnamedParam.list();
+		assertEquals(2, list.size());
+
+		Query namedParam = s.createSQLQuery("select {category.*} from category {category} where ({category}.name=:firstCat or {category}.name=:secondCat)", "category", Category.class);
+		namedParam.setString("firstCat", "Better");
+		namedParam.setString("secondCat", "Best");
+		list = namedParam.list();
+		assertEquals(2, list.size());
+
+		s.connection().commit();
+		s.close();
+	}
+
+	public void testEscapedJDBC() throws HibernateException, SQLException {
+		if ( 
+				getDialect() instanceof HSQLDialect || 
+				getDialect() instanceof PostgreSQLDialect
+		) return;
+
+		Session session = openSession();
+		session.delete("from A");
+		A savedA = new A();
+		savedA.setName("Max");
+		session.save(savedA);
+
+		B savedB = new B();
+		session.save(savedB);
+		session.flush();
+
+		int count = session.createQuery("from A").list().size();
+		session.close();
+
+		session = openSession();
+
+		Query query;
+		if( getDialect() instanceof TimesTenDialect) {
+            // TimesTen does not permit general expressions (like UPPER) in the second part of a LIKE expression,
+            // so we execute a similar test 
+            query = session.createSQLQuery("select identifier_column as {a.id}, clazz_discriminata as {a.class}, count_ as {a.count}, name as {a.name} from TA where {fn ucase(name)} like 'MAX'", "a", A.class);
+        } else {
+            query = session.createSQLQuery("select identifier_column as {a.id}, clazz_discriminata as {a.class}, count_ as {a.count}, name as {a.name} from TA where {fn ucase(name)} like {fn ucase('max')}", "a", A.class);
+        }
+		List list = query.list();
+
+		assertNotNull(list);
+		assertEquals(1, list.size());
+		session.connection().commit();
+		session.close();
+	}
+
+	public void testDoubleAliasing() throws HibernateException, SQLException {	
+
+		Session session = openSession();
+		session.delete("from A");
+		A savedA = new A();
+		savedA.setName("Max");
+		session.save(savedA);
+
+		B savedB = new B();
+		session.save(savedB);
+		session.flush();
+
+		int count = session.createQuery("from A").list().size();
+		session.close();
+
+		session = openSession();
+
+		Query query = session.createSQLQuery("select a.identifier_column as {a1.id}, a.clazz_discriminata as {a1.class}, a.count_ as {a1.count}, a.name as {a1.name} " +
+											", b.identifier_column as {a2.id}, b.clazz_discriminata as {a2.class}, b.count_ as {a2.count}, b.name as {a2.name} " +
+											" from TA a, TA b" +
+											" where a.identifier_column = b.identifier_column", new String[] {"a1", "a2" }, new Class[] {A.class, A.class});
+		List list = query.list();
+
+		assertNotNull(list);
+		assertEquals(2, list.size());
+		session.connection().commit();
+		session.close();
+	}
+
+	// TODO: compositeid's - how ? (SingleSeveral.hbm.xml test)
+	public void testEmbeddedCompositeProperties() throws HibernateException, SQLException {
+	   Session session = openSession();
+
+	   Single s = new Single();
+	   s.setId("my id");
+	   s.setString("string 1");
+	   session.save(s);
+	   session.flush();
+	   session.connection().commit();
+
+	   session.clear();
+
+	   Query query = session.createSQLQuery("select {sing.*} from Single {sing}", "sing", Single.class);
+
+	   List list = query.list();
+
+	   assertTrue(list.size()==1);
+
+	   session.clear();
+
+	   query = session.createSQLQuery("select {sing.*} from Single {sing} where sing.id = ?", "sing", Single.class);
+	   query.setString(0, "my id");
+	   list = query.list();
+
+	   assertTrue(list.size()==1);
+
+	   session.clear();
+
+	   query = session.createSQLQuery("select s.id as {sing.id}, s.string_ as {sing.string}, s.prop as {sing.prop} from Single s where s.id = ?", "sing", Single.class);
+	   query.setString(0, "my id");
+	   list = query.list();
+
+	   assertTrue(list.size()==1);
+
+	   session.clear();
+
+	   query = session.createSQLQuery("select s.id as {sing.id}, s.string_ as {sing.string}, s.prop as {sing.prop} from Single s where s.id = ?", "sing", Single.class);
+	   query.setString(0, "my id");
+	   list = query.list();
+
+	   assertTrue(list.size()==1);
+
+	   session.connection().commit();
+	   session.close();
+
+	}
+
+	public void testReturnPropertyComponentRenameFailureExpected() throws HibernateException, SQLException {
+		// failure expected because this was a regression introduced previously which needs to get tracked down.
+		Session session = openSession();
+		Componentizable componentizable = setupComponentData(session);
+		
+		Query namedQuery = session.getNamedQuery("queryComponentWithOtherColumn");
+		List list = namedQuery.list();
+		
+		assertEquals(1, list.size());
+		assertEquals( "flakky comp", ( (Componentizable) list.get(0) ).getComponent().getName() );
+		
+		session.clear();
+		
+		session.delete(componentizable);
+		session.flush();
+		
+		session.connection().commit();
+		session.close();
+	}
+	
+	public void testComponentStar() throws HibernateException, SQLException {
+	    componentTest("select {comp.*} from Componentizable comp");
+	}
+	
+	public void testComponentNoStar() throws HibernateException, SQLException {
+	    componentTest("select comp.id as {comp.id}, comp.nickName as {comp.nickName}, comp.name as {comp.component.name}, comp.subName as {comp.component.subComponent.subName}, comp.subName1 as {comp.component.subComponent.subName1} from Componentizable comp");
+	}
+	
+
+	private void componentTest(String sql) throws SQLException {
+        Session session = openSession();
+	    
+	    Componentizable c = setupComponentData( session );
+        
+	    Query q = session.createSQLQuery(sql, "comp", Componentizable.class);
+	    List list = q.list();
+	    
+	    assertEquals(list.size(),1);
+	    
+	    Componentizable co = (Componentizable) list.get(0);
+	    
+	    assertEquals(c.getNickName(), co.getNickName());
+	    assertEquals(c.getComponent().getName(), co.getComponent().getName());
+	    assertEquals(c.getComponent().getSubComponent().getSubName(), co.getComponent().getSubComponent().getSubName());
+	    
+	    session.delete(co);
+	    session.flush();
+	    session.connection().commit();
+	    session.close();
+    }
+
+	private Componentizable setupComponentData(Session session) throws SQLException {
+		Componentizable c = new Componentizable();
+	    c.setNickName("Flacky");
+	    Component component = new Component();
+	    component.setName("flakky comp");
+	    SubComponent subComponent = new SubComponent();
+	    subComponent.setSubName("subway");
+        component.setSubComponent(subComponent);
+	    
+        c.setComponent(component);
+        
+        session.save(c);
+        
+        session.flush();
+        session.connection().commit();
+        
+        session.clear();
+		return c;
+	}
+
+    public void testFindSimpleBySQL() throws Exception {
+		if ( getDialect() instanceof MySQLDialect ) return;
+		Session session = openSession();
+		Category s = new Category();
+		s.setName(String.valueOf(nextLong++));
+		session.save(s);
+		session.flush();
+
+		Query query = session.createSQLQuery("select s.category_key_col as {category.id}, s.name as {category.name}, s.\"assign-able-id\" as {category.assignable} from {category} s", "category", Category.class);
+		List list = query.list();
+
+		assertNotNull(list);
+		assertTrue(list.size() > 0);
+		assertTrue(list.get(0) instanceof Category);
+		session.connection().commit();
+		session.close();
+		// How do we handle objects with composite id's ? (such as Single)
+	}
+
+	public void testFindBySQLSimpleByDiffSessions() throws Exception {
+		Session session = openSession();
+		Category s = new Category();
+		s.setName(String.valueOf(nextLong++));
+		session.save(s);
+		session.flush();
+		session.connection().commit();
+		session.close();
+
+		if ( getDialect() instanceof MySQLDialect ) return;
+
+		session = openSession();
+
+		Query query = session.createSQLQuery("select s.category_key_col as {category.id}, s.name as {category.name}, s.\"assign-able-id\" as {category.assignable} from {category} s", "category", Category.class);
+		List list = query.list();
+
+		assertNotNull(list);
+		assertTrue(list.size() > 0);
+		assertTrue(list.get(0) instanceof Category);
+
+		// How do we handle objects that does not have id property (such as Simple ?)
+		// How do we handle objects with composite id's ? (such as Single)
+		session.connection().commit();
+		session.close();
+	}
+
+	public void testFindBySQLDiscriminatedSameSession() throws Exception {
+		Session session = openSession();
+		session.delete("from A");
+		A savedA = new A();
+		session.save(savedA);
+
+		B savedB = new B();
+		session.save(savedB);
+		session.flush();
+
+		Query query = session.createSQLQuery("select identifier_column as {a.id}, clazz_discriminata as {a.class}, name as {a.name}, count_ as {a.count} from TA {a}", "a", A.class);
+		List list = query.list();
+
+		assertNotNull(list);
+		assertEquals(2, list.size());
+
+		A a1 = (A) list.get(0);
+		A a2 = (A) list.get(1);
+
+		assertTrue((a2 instanceof B) || (a1 instanceof B));
+		assertFalse(a1 instanceof B && a2 instanceof B);
+
+		if (a1 instanceof B) {
+			assertSame(a1, savedB);
+			assertSame(a2, savedA);
+		}
+		else {
+			assertSame(a2, savedB);
+			assertSame(a1, savedA);
+		}
+
+		session.clear();
+		List list2 = session.getNamedQuery("propertyResultDiscriminator").list();
+		assertEquals(2, list2.size());
+		
+		session.connection().commit();
+		session.close();
+	}
+
+	public void testFindBySQLDiscriminatedDiffSession() throws Exception {
+		Session session = openSession();
+		session.delete("from A");
+		A savedA = new A();
+		session.save(savedA);
+
+		B savedB = new B();
+		session.save(savedB);
+		session.flush();
+
+		int count = session.createQuery("from A").list().size();
+		session.close();
+
+		session = openSession();
+
+		Query query = session.createSQLQuery("select identifier_column as {a.id}, clazz_discriminata as {a.class}, count_ as {a.count}, name as {a.name} from TA", "a", A.class);
+		List list = query.list();
+
+		assertNotNull(list);
+		assertEquals(count, list.size());
+		session.connection().commit();
+		session.close();
+	}
+
+
+    public void testCompositeIdId() throws HibernateException, SQLException {
+	    // issue HHH-21
+        Session s = openSession();
+
+        CompositeIdId id = new CompositeIdId();
+        id.setName("Max");
+        id.setSystem("c64");
+        id.setId("games");
+
+        s.save(id);
+        s.flush();
+        s.connection().commit();
+        s.close();
+
+        s = openSession();
+        // having a composite id with one property named id works since the map used by sqlloader to map names to properties handles it.
+        Query query = s.createSQLQuery("select system as {c.system}, id as {c.id}, name as {c.name}, foo as {c.composite.foo}, bar as {c.composite.bar} from CompositeIdId where system=? and id=?", "c", CompositeIdId.class);
+        query.setString(0, "c64");
+        query.setString(1, "games");
+
+        CompositeIdId id2 = (CompositeIdId) query.uniqueResult();
+        check(id, id2);
+
+        s.flush();
+        s.connection().commit();
+        s.close();
+
+        s = openSession();
+
+        CompositeIdId useForGet = new CompositeIdId();
+        useForGet.setSystem("c64");
+        useForGet.setId("games");
+        // this doesn't work since the verification does not take column span into respect!
+        CompositeIdId getted = (CompositeIdId) s.get(CompositeIdId.class, useForGet);
+        check(id,getted);
+
+
+        s.connection().commit();
+        s.close();
+
+    }
+
+    private void check(CompositeIdId id, CompositeIdId id2) {
+        assertEquals(id,id2);
+        assertEquals(id.getName(), id2.getName());
+        assertEquals(id.getId(), id2.getId());
+        assertEquals(id.getSystem(), id2.getSystem());
+    }
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/SQLLoaderTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Several.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Several.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Several.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,90 @@
+//$Id: Several.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+
+
+public class Several implements Serializable {
+	private String id;
+	private String prop;
+	private Single single;
+	private String string;
+	/**
+	 * Returns the id.
+	 * @return String
+	 */
+	public String getId() {
+		return id;
+	}
+	
+	/**
+	 * Returns the prop.
+	 * @return String
+	 */
+	public String getProp() {
+		return prop;
+	}
+	
+	/**
+	 * Returns the single.
+	 * @return Single
+	 */
+	public Single getSingle() {
+		return single;
+	}
+	
+	/**
+	 * Sets the id.
+	 * @param id The id to set
+	 */
+	public void setId(String id) {
+		this.id = id;
+	}
+	
+	/**
+	 * Sets the prop.
+	 * @param prop The prop to set
+	 */
+	public void setProp(String prop) {
+		this.prop = prop;
+	}
+	
+	/**
+	 * Sets the single.
+	 * @param single The single to set
+	 */
+	public void setSingle(Single single) {
+		this.single = single;
+	}
+	
+	/**
+	 * Returns the string.
+	 * @return String
+	 */
+	public String getString() {
+		return string;
+	}
+	
+	/**
+	 * Sets the string.
+	 * @param string The string to set
+	 */
+	public void setString(String string) {
+		this.string = string;
+	}
+	
+	/*public boolean equals(Object other) {
+		return ( (Several) other ).id.equals(id) && ( (Several) other ).string.equals(string);
+	}
+	
+	public int hashCode() {
+		return id.hashCode();
+	}*/
+	
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Several.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Simple.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Simple.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Simple.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-lazy="false">
+
+    <class name="org.hibernate.test.legacy.Simple">
+        <id type="long" column="id_">
+            <generator class="assigned"/>
+        </id>
+        <property name="name"/>
+        <property name="address"/>
+        <property name="count" column="count_" not-null="true" unique="true"/> 
+        <property name="date" column="date_"/>
+        <property name="pay"/>
+        <many-to-one name="other" access="field"/>
+    </class>
+    
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Simple.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Simple.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Simple.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Simple.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,127 @@
+//$Id: Simple.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+
+public class Simple implements Serializable {
+	private String name;
+	private String address;
+	private int count;
+	private java.util.Date date;
+	private Float number;
+	private Simple other;
+
+	private Long parent;
+
+	public Simple(int c) {
+		count=c;
+	}
+	public Simple() {}
+
+	public void init() {
+		name="Someone With Along Name";
+		address="1234 Some Street, Some City, Victoria, 3000, Austraya";
+		count=69;
+		date=new java.sql.Date(666);
+		number=new Float(55.8);
+	}
+	/**
+	 * Gets the name
+	 * @return Returns a String
+	 */
+	public String getName() {
+		return name;
+	}
+	/**
+	 * Sets the name
+	 * @param name The name to set
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	/**
+	 * Gets the address
+	 * @return Returns a String
+	 */
+	public String getAddress() {
+		return address;
+	}
+	/**
+	 * Sets the address
+	 * @param address The address to set
+	 */
+	public void setAddress(String address) {
+		this.address = address;
+	}
+
+	/**
+	 * Gets the count
+	 * @return Returns a int
+	 */
+	public int getCount() {
+		return count;
+	}
+	/**
+	 * Sets the count
+	 * @param count The count to set
+	 */
+	public void setCount(int count) {
+		this.count = count;
+	}
+
+	/**
+	 * Gets the date
+	 * @return Returns a java.util.Date
+	 */
+	public java.util.Date getDate() {
+		return date;
+	}
+	/**
+	 * Sets the date
+	 * @param date The date to set
+	 */
+	public void setDate(java.util.Date date) {
+		this.date = date;
+	}
+
+	/**
+	 * Gets the pay number
+	 * @return Returns a Float
+	 */
+	public Float getPay() {
+		return number;
+	}
+
+	/**
+	 * Sets the pay number
+	 * @param number The Pay to set
+	 */
+	public void setPay(Float number) {
+		this.number = number;
+	}
+
+	/**
+	 * Returns the other.
+	 * @return Simple
+	 */
+	public Simple getOther() {
+		return other;
+	}
+
+	/**
+	 * Sets the other.
+	 * @param other The other to set
+	 */
+	public void setOther(Simple other) {
+		this.other = other;
+	}
+
+}
+
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Simple.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Single.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Single.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Single.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,93 @@
+//$Id: Single.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.HashSet;
+
+
+public class Single implements Serializable {
+	private String id;
+	private String prop;
+	private String string;
+	private Collection several = new HashSet();
+	/**
+	 * Returns the id.
+	 * @return String
+	 */
+	public String getId() {
+		return id;
+	}
+	
+	/**
+	 * Returns the prop.
+	 * @return String
+	 */
+	public String getProp() {
+		return prop;
+	}
+	
+	/**
+	 * Returns the several.
+	 * @return Set
+	 */
+	public Collection getSeveral() {
+		return several;
+	}
+	
+	/**
+	 * Sets the id.
+	 * @param id The id to set
+	 */
+	public void setId(String id) {
+		this.id = id;
+	}
+	
+	/**
+	 * Sets the prop.
+	 * @param prop The prop to set
+	 */
+	public void setProp(String prop) {
+		this.prop = prop;
+	}
+	
+	/**
+	 * Sets the several.
+	 * @param several The several to set
+	 */
+	public void setSeveral(Collection several) {
+		this.several = several;
+	}
+	
+	/**
+	 * Returns the string.
+	 * @return String
+	 */
+	public String getString() {
+		return string;
+	}
+	
+	/**
+	 * Sets the string.
+	 * @param string The string to set
+	 */
+	public void setString(String string) {
+		this.string = string;
+	}
+	
+	/*public boolean equals(Object other) {
+		if ( !(other instanceof Single) ) return false;
+		return ( (Single) other ).id.equals(id) && ( (Single) other ).string.equals(string);
+	}
+	
+	public int hashCode() {
+		return id.hashCode();
+	}*/
+	
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Single.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/SingleSeveral.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/SingleSeveral.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/SingleSeveral.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping default-lazy="false">
+
+	<class name="org.hibernate.test.legacy.Single">
+		<composite-id>
+			<key-property name="id" length="32"/>
+			<key-property name="string" length="32" column="string_"/>
+		</composite-id>
+		<property name="prop"/>
+		<bag name="several" inverse="true" lazy="false" cascade="all"> <!--important: test for bidirectional with lazy="false" -->
+			<key>
+				<column name="single_id" not-null="true"/>
+				<column name="single_string" not-null="true"/>
+			</key>
+			<one-to-many class="org.hibernate.test.legacy.Several"/>
+		</bag>
+	</class>
+	
+	<class name="org.hibernate.test.legacy.Several">
+		<composite-id unsaved-value="any">
+			<key-property name="id" length="32"/>
+			<key-property name="string" length="32" column="string_"/>
+		</composite-id>
+		<many-to-one name="single">
+			<column name="single_id" length="32"/>
+			<column name="single_string" length="32"/>
+		</many-to-one>
+	</class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/SingleSeveral.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Sortable.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Sortable.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Sortable.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,33 @@
+package org.hibernate.test.legacy;
+
+public class Sortable implements Comparable {
+	
+	private int id;
+	private String name;
+	
+	private Sortable() {}
+	Sortable(String name) {
+		this.name = name;
+	}
+	
+	public int compareTo(Object o) {
+		return name.compareTo( ( (Sortable) o).name );
+	}
+
+	public int getId() {
+		return id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setId(int i) {
+		id = i;
+	}
+
+	public void setName(String string) {
+		name = string;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Sortable.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/StatisticsTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/StatisticsTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/StatisticsTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,63 @@
+//$Id: StatisticsTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.legacy;
+
+import junit.framework.Test;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.stat.Statistics;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class StatisticsTest extends LegacyTestCase {
+
+	public StatisticsTest(String x) {
+		super(x);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "legacy/ABC.hbm.xml", "legacy/ABCExtends.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( StatisticsTest.class );
+	}
+	
+	public void testSessionStats() throws Exception {
+		
+		SessionFactory sf = getSessions();
+		Statistics stats = sf.getStatistics();
+		boolean isStats = stats.isStatisticsEnabled();
+		stats.clear();
+		stats.setStatisticsEnabled(true);
+		Session s = sf.openSession();
+		assertEquals( 1, stats.getSessionOpenCount() );
+		s.close();
+		assertEquals( 1, stats.getSessionCloseCount() );
+		s = sf.openSession();
+		Transaction tx = s.beginTransaction();
+		A a = new A();
+		a.setName("mya");
+		s.save(a);
+		a.setName("b");
+		tx.commit();
+		s.close();
+		assertEquals( 1, stats.getFlushCount() );
+		s = sf.openSession();
+		tx = s.beginTransaction();
+		String hql = "from " + A.class.getName();
+		Query q = s.createQuery(hql);
+		q.list();
+		tx.commit();
+		s.close();
+		assertEquals(1, stats.getQueryExecutionCount() );
+		assertEquals(1, stats.getQueryStatistics(hql).getExecutionCount() );
+		
+		stats.setStatisticsEnabled(isStats);
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/StatisticsTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/StringComparator.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/StringComparator.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/StringComparator.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,12 @@
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+import java.util.Comparator;
+
+public class StringComparator implements Comparator, Serializable {
+
+	public int compare(Object o1, Object o2) {
+		return ( (String) o1 ).toLowerCase().compareTo( ( (String) o2 ).toLowerCase() );
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/StringComparator.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Stuff.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Stuff.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Stuff.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-lazy="false">
+	
+	<class name="org.hibernate.test.legacy.MoreStuff">
+		<composite-id>
+			<key-property name="intId"/>
+			<key-property name="stringId" length="32"/>
+		</composite-id>
+		<property name="name"/>
+		<bag name="stuffs" inverse="true" lazy="false" cascade="all">
+			<key>
+				<!--unfortunately have to specify not-null here because of limitation in schema export....-->
+				<column name="moreInt" not-null="true"/>
+				<column name="moreString" not-null="true" length="32"/>
+			</key>
+			<one-to-many class="org.hibernate.test.legacy.Stuff"/>
+		</bag>
+	</class>
+	
+    <class name="org.hibernate.test.legacy.Stuff">
+        <composite-id unsaved-value="any">
+            <key-property name="id"/>
+            <key-many-to-one name="foo" class="org.hibernate.test.legacy.Foo"/>
+            <key-many-to-one name="moreStuff" class="org.hibernate.test.legacy.MoreStuff">
+            	<column name="moreInt"/>
+				<column name="moreString" length="32"/>
+			</key-many-to-one>
+        </composite-id>
+        <property name="property"/>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Stuff.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Stuff.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Stuff.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Stuff.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,93 @@
+//$Id: Stuff.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+import java.util.TimeZone;
+
+public class Stuff implements Serializable {
+	
+	public int hashCode() {
+		return new Long(id).hashCode();
+	}
+	
+	public boolean equals(Object other) {
+		if ( ! (other instanceof Stuff) ) return false;
+		Stuff otherStuff = (Stuff) other;
+		return otherStuff.getId()==id && otherStuff.getFoo().getKey().equals( foo.getKey() ) && otherStuff.getMoreStuff().equals(moreStuff);
+	}
+	
+	private long id;
+	private FooProxy foo;
+	private MoreStuff moreStuff;
+	private TimeZone property;
+	/**
+	 * Returns the foo.
+	 * @return Foo
+	 */
+	public FooProxy getFoo() {
+		return foo;
+	}
+	
+	/**
+	 * Returns the id.
+	 * @return long
+	 */
+	public long getId() {
+		return id;
+	}
+	
+	/**
+	 * Returns the property.
+	 * @return TimeZone
+	 */
+	public TimeZone getProperty() {
+		return property;
+	}
+	
+	/**
+	 * Sets the foo.
+	 * @param foo The foo to set
+	 */
+	public void setFoo(FooProxy foo) {
+		this.foo = foo;
+	}
+	
+	/**
+	 * Sets the id.
+	 * @param id The id to set
+	 */
+	public void setId(long id) {
+		this.id = id;
+	}
+	
+	/**
+	 * Sets the property.
+	 * @param property The property to set
+	 */
+	public void setProperty(TimeZone property) {
+		this.property = property;
+	}
+	
+	/**
+	 * Returns the moreStuff.
+	 * @return MoreStuff
+	 */
+	public MoreStuff getMoreStuff() {
+		return moreStuff;
+	}
+	
+	/**
+	 * Sets the moreStuff.
+	 * @param moreStuff The moreStuff to set
+	 */
+	public void setMoreStuff(MoreStuff moreStuff) {
+		this.moreStuff = moreStuff;
+	}
+	
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Stuff.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/SubComponent.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/SubComponent.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/SubComponent.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,41 @@
+//$Id: SubComponent.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+/**
+ * Sub component
+ * 
+ * @author emmanuel
+ */
+public class SubComponent {
+    private String _subName;
+    
+    private String _subName1;
+    
+    /**
+     * @return
+     */
+    public String getSubName() {
+        return _subName;
+    }
+
+    /**
+     * @param string
+     */
+    public void setSubName(String string) {
+        _subName = string;
+    }
+
+    /**
+     * @return
+     */
+    public String getSubName1() {
+        return _subName1;
+    }
+
+    /**
+     * @param string
+     */
+    public void setSubName1(String string) {
+        _subName1 = string;
+    }
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/SubComponent.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/SubDetail.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/SubDetail.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/SubDetail.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,45 @@
+//$Id: SubDetail.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+public class SubDetail {
+	private String name;
+	private long id;
+	/**
+	 * Returns the id.
+	 * @return long
+	 */
+	public long getId() {
+		return id;
+	}
+	
+	/**
+	 * Returns the name.
+	 * @return String
+	 */
+	public String getName() {
+		return name;
+	}
+	
+	/**
+	 * Sets the id.
+	 * @param id The id to set
+	 */
+	public void setId(long id) {
+		this.id = id;
+	}
+	
+	/**
+	 * Sets the name.
+	 * @param name The name to set
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/SubDetail.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/SubMulti.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/SubMulti.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/SubMulti.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,81 @@
+//$Id: SubMulti.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.util.List;
+
+public class SubMulti extends Multi {
+	private float amount;
+	private SubMulti parent;
+	private List children;
+	private List moreChildren;
+	/**
+	 * Returns the amount.
+	 * @return float
+	 */
+	public float getAmount() {
+		return amount;
+	}
+	
+	/**
+	 * Sets the amount.
+	 * @param amount The amount to set
+	 */
+	public void setAmount(float amount) {
+		this.amount = amount;
+	}
+	
+	/**
+	 * Returns the childen.
+	 * @return List
+	 */
+	public List getChildren() {
+		return children;
+	}
+	
+	/**
+	 * Returns the parent.
+	 * @return SubMulti
+	 */
+	public SubMulti getParent() {
+		return parent;
+	}
+	
+	/**
+	 * Sets the childen.
+	 * @param childen The childen to set
+	 */
+	public void setChildren(List children) {
+		this.children = children;
+	}
+	
+	/**
+	 * Sets the parent.
+	 * @param parent The parent to set
+	 */
+	public void setParent(SubMulti parent) {
+		this.parent = parent;
+	}
+	
+	/**
+	 * Returns the moreChildren.
+	 * @return List
+	 */
+	public List getMoreChildren() {
+		return moreChildren;
+	}
+
+	/**
+	 * Sets the moreChildren.
+	 * @param moreChildren The moreChildren to set
+	 */
+	public void setMoreChildren(List moreChildren) {
+		this.moreChildren = moreChildren;
+	}
+
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/SubMulti.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Super.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Super.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Super.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,15 @@
+package org.hibernate.test.legacy;
+
+public class Super {
+
+	protected String name;
+
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Super.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Top.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Top.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Top.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,115 @@
+//$Id: Top.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.legacy;
+
+public class Top {
+	private long id;
+	private String name;
+	private String address;
+	private int count;
+	private java.util.Date date;
+	private Top other;
+	private Top top;
+	
+	public Top(int c) {
+		count=c;
+	}
+	public Top() {}
+	
+	public void init() {
+		name="Someone With Along Name";
+		address="1234 Some Street, Some City, Victoria, 3000, Austraya";
+		count=69;
+		date=new java.sql.Date(666);
+	}
+	/**
+	 * Gets the name
+	 * @return Returns a String
+	 */
+	public String getName() {
+		return name;
+	}
+	/**
+	 * Sets the name
+	 * @param name The name to set
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	/**
+	 * Gets the address
+	 * @return Returns a String
+	 */
+	public String getAddress() {
+		return address;
+	}
+	/**
+	 * Sets the address
+	 * @param address The address to set
+	 */
+	public void setAddress(String address) {
+		this.address = address;
+	}
+	
+	/**
+	 * Gets the count
+	 * @return Returns a int
+	 */
+	public int getCount() {
+		return count;
+	}
+	/**
+	 * Sets the count
+	 * @param count The count to set
+	 */
+	public void setCount(int count) {
+		this.count = count;
+	}
+	
+	/**
+	 * Gets the date
+	 * @return Returns a java.util.Date
+	 */
+	public java.util.Date getDate() {
+		return date;
+	}
+	/**
+	 * Sets the date
+	 * @param date The date to set
+	 */
+	public void setDate(java.util.Date date) {
+		this.date = date;
+	}
+	
+	/**
+	 * Returns the other.
+	 * @return Simple
+	 */
+	public Top getOther() {
+		return other;
+	}
+	
+	/**
+	 * Sets the other.
+	 * @param other The other to set
+	 */
+	public void setOther(Top other) {
+		this.other = other;
+	}
+	
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long l) {
+		id = l;
+	}
+
+}
+
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Top.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Trivial.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Trivial.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Trivial.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,13 @@
+//$Id: Trivial.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+
+public class Trivial extends Foo {
+	
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Trivial.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/TrivialClass.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/TrivialClass.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/TrivialClass.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,6 @@
+//$Id: TrivialClass.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+public class TrivialClass extends Top {
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/TrivialClass.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Up.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Up.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Up.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,39 @@
+//$Id: Up.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+
+/**
+ * @author Gavin King
+ */
+public class Up implements Serializable {
+
+	private String id1;
+	private long id2;
+
+	public String getId1() {
+		return id1;
+	}
+
+	public long getId2() {
+		return id2;
+	}
+
+	public void setId1(String string) {
+		id1 = string;
+	}
+
+	public void setId2(long l) {
+		id2 = l;
+	}
+	
+	public boolean equals(Object other) {
+		if ( !(other instanceof Up) ) return false;
+		Up that = (Up) other;
+		return this.id1.equals(that.id1) && this.id2==that.id2;
+	}
+	public int hashCode() {
+		return id1.hashCode();
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Up.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/UpDown.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/UpDown.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/UpDown.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+	
+<hibernate-mapping default-lazy="false">
+	<class name="org.hibernate.test.legacy.Up" discriminator-value="null">
+		<composite-id>
+			<key-property name="id1"/>
+			<key-property name="id2"/>
+		</composite-id>
+		<discriminator column="value_" type="long" not-null="false" insert="false"/>
+
+		<subclass name="org.hibernate.test.legacy.Down" discriminator-value="not null">
+			<property name="value" column="value_" type="long"/>
+		</subclass>
+	</class>
+</hibernate-mapping>
+	
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/UpDown.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Vetoer.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Vetoer.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Vetoer.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-lazy="false">
+
+    <class name="org.hibernate.test.legacy.Vetoer">
+        <id type="string" column="id_" length="32">
+            <generator class="uuid.hex"/>
+        </id>
+        <property name="name"/>
+        <property name="strings"/>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Vetoer.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Vetoer.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Vetoer.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Vetoer.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,61 @@
+//$Id: Vetoer.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.io.Serializable;
+
+import org.hibernate.CallbackException;
+import org.hibernate.Session;
+import org.hibernate.classic.Lifecycle;
+
+public class Vetoer implements Lifecycle {
+
+	boolean onSaveCalled;
+	boolean onUpdateCalled;
+	boolean onDeleteCalled;
+
+	private String name;
+	private String[] strings;
+
+	public boolean onSave(Session s) throws CallbackException {
+		boolean result = !onSaveCalled;
+		onSaveCalled = true;
+		return result;
+	}
+
+	public boolean onUpdate(Session s) throws CallbackException {
+		boolean result = !onUpdateCalled;
+		onUpdateCalled = true;
+		return result;
+	}
+
+	public boolean onDelete(Session s) throws CallbackException {
+		boolean result = !onDeleteCalled;
+		onDeleteCalled = true;
+		return result;
+	}
+
+	public void onLoad(Session s, Serializable id) {}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String[] getStrings() {
+		return strings;
+	}
+
+	public void setStrings(String[] strings) {
+		this.strings = strings;
+	}
+
+}
+
+
+
+
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Vetoer.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/W.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/W.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/W.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,44 @@
+package org.hibernate.test.legacy;
+
+import java.util.Set;
+
+public class W {
+	
+	private long id;
+	private Set zeds;
+	
+	/**
+	 * 
+	 */
+	public W() {
+	}
+
+	/**
+	 * @return
+	 */
+	public long getId() {
+		return id;
+	}
+
+	/**
+	 * @return
+	 */
+	public Set getZeds() {
+		return zeds;
+	}
+
+	/**
+	 * @param l
+	 */
+	public void setId(long l) {
+		id = l;
+	}
+
+	/**
+	 * @param set
+	 */
+	public void setZeds(Set set) {
+		zeds = set;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/W.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/WZ.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/WZ.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/WZ.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-lazy="false">
+
+	<class name="org.hibernate.test.legacy.Z">
+		<id name="id" unsaved-value="0" column="zid">
+			<generator class="hilo"/>
+		</id>
+		<many-to-one name="w" 
+			cascade="save-update"
+			class="org.hibernate.test.legacy.W" 
+			insert="true" 
+			update="false" 
+			not-null="true"/>
+	</class>
+
+	<class name="org.hibernate.test.legacy.W" 
+		discriminator-value="0" 
+		proxy="org.hibernate.test.legacy.W">
+		
+		<id name="id" unsaved-value="0" column="wid">
+			<generator class="hilo"/>
+		</id>
+		<!--<set name="zeds" lazy="true">
+			<key column="w"/>
+			<one-to-many class="org.hibernate.test.legacy.Z"/>
+		</set>-->
+	</class>
+	
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/WZ.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Wicked.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Wicked.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Wicked.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,71 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- Mapping document mainly used for testing non-reflective Binder + meta inheritance -->
+<hibernate-mapping default-lazy="false">
+  <meta attribute="global">global value</meta>
+  <meta attribute="globalnoinherit" inherit="false">only visible at top level</meta>
+  <meta attribute="globalmutated">top level</meta>
+  
+    <class name="org.hibernate.test.legacy.Wicked"
+           table="WICKED"
+           schema="HR">
+           <meta attribute="implements">java.lang.Observer</meta>
+           <meta attribute="implements">java.lang.Observer</meta>           
+           <meta attribute="implements" inherit="false">org.foo.BogusVisitor</meta>                      
+           <meta attribute="extends">AuditInfo</meta>
+		   <meta attribute="globalmutated">wicked level</meta>
+        <id name="id"
+            type="long"
+            column="EMPLOYEE_ID">
+            <generator class="assigned"/>
+        </id>
+        <version name="versionProp"       type="long"/>
+        <property name="stringProp"       type="string"/>
+        <property name="doubleProp"       type="double"/>
+	    <property name="objectDoubleProp" type="java.lang.Double"/>
+        <property name="booleanProp"       type="boolean"/>
+	    <property name="objectBooleanProp" type="java.lang.Boolean"/>
+  	    <property name="binaryProp"       type="binary"/>
+        <many-to-one name="objectManyToOne"  class="org.hibernate.test.legacy.Employee" column="MANAGER_ID"/>
+		<component name="component" class="net.sf.hibern8ide.test.MonetaryAmount">
+		  <meta attribute="componentonly" inherit="true"/>
+		  <meta attribute="implements">AnotherInterface</meta>
+		  <meta attribute="allcomponent"/>
+ 		  <meta attribute="globalmutated">monetaryamount level</meta>
+			<property name="x" type="string">
+	  		    <meta attribute="globalmutated">monetaryamount x level</meta>
+  		    </property>
+		</component>
+
+		<set name="sortedEmployee" sort="org.hibernate.test.legacy.NonExistingComparator">
+  		     <meta attribute="globalmutated">sortedemployee level</meta>
+			 <key column="attrb_id"/> 
+    	     <many-to-many class="org.hibernate.test.legacy.Employee" column="id"/>
+		</set>
+
+        <bag name="anotherSet">
+			 <key column="attrb2_id"/> 			 
+			 <composite-element class="org.hibernate.test.legacy.Employee">
+  		     <meta attribute="globalmutated">monetaryamount anotherSet composite level</meta>
+  		      <property name="emp" type="string">
+    		      <meta attribute="globalmutated">monetaryamount anotherSet composite property emp level</meta>
+  		      </property>
+  		      <many-to-one name="empinone" class="org.hibernate.test.legacy.Employee">
+  		          <meta attribute="globalmutated">monetaryamount anotherSet composite property empinone level</meta>
+  		      </many-to-one>
+			 </composite-element>
+        </bag>	
+
+   </class>
+   
+   <class name="org.hibernate.test.legacy.Employee">
+        <composite-id class="X">
+            <key-property name="comp" type="string"/>
+        </composite-id>
+		
+   </class>
+</hibernate-mapping>
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Wicked.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/X.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/X.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/X.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,79 @@
+//$Id: X.java 4599 2004-09-26 05:18:27Z oneovthafew $
+package org.hibernate.test.legacy;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class X {
+
+	private long id;
+	private Y y;
+	private List xxs = new ArrayList();
+
+	/**
+	 * Returns the id.
+	 * @return long
+	 */
+	public long getId() {
+		return id;
+	}
+
+	/**
+	 * Returns the y.
+	 * @return Y
+	 */
+	public Y getY() {
+		return y;
+	}
+
+	/**
+	 * Sets the id.
+	 * @param id The id to set
+	 */
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	/**
+	 * Sets the y.
+	 * @param y The y to set
+	 */
+	public void setY(Y y) {
+		this.y = y;
+	}
+	
+	public List getXxs() {
+		return xxs;
+	}
+
+	public void setXxs(List xxs) {
+		this.xxs = xxs;
+	}
+
+	public static class XX {
+		private Long id;
+		private X x;
+		private XX() {}
+		public XX(X x) {
+			this.x = x;
+		}
+		public Long getId() {
+			return id;
+		}
+
+		public void setId(Long id) {
+			this.id = id;
+		}
+
+		public X getX() {
+			return x;
+		}
+
+		public void setX(X x) {
+			this.x = x;
+		}
+
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/X.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/XY.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/XY.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/XY.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping default-lazy="false">
+	<class name="org.hibernate.test.legacy.X">
+		<id name="id" unsaved-value="0" column="xid">
+			<generator class="foreign">
+				<param name="property">y</param>
+			</generator>
+		</id>
+		<one-to-one name="y" constrained="true" cascade="all"/>
+		<bag name="xxs" inverse="true" cascade="all">
+			<key column="x"/>
+			<one-to-many class="org.hibernate.test.legacy.X$XX"/>
+		</bag>
+	</class>
+	<class name="org.hibernate.test.legacy.Y">
+		<id name="id" column="yid">
+			<generator class="hilo"/>
+		</id>
+		<property name="x"/>
+		<one-to-one name="theX" cascade="save-update"/>
+	</class>
+	<class name="org.hibernate.test.legacy.X$XX" table="xxx">
+		<id name="id">
+			<generator class="hilo"/>
+		</id>
+		<many-to-one name="x" not-null="true"/>
+	</class>
+</hibernate-mapping>
+	
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/XY.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Y.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Y.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Y.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,55 @@
+package org.hibernate.test.legacy;
+
+
+public class Y {
+
+	private Long id;
+	private String x;
+	private X theX;
+	/**
+	 * Returns the id.
+	 * @return Long
+	 */
+	public Long getId() {
+		return id;
+	}
+
+	/**
+	 * Returns the x.
+	 * @return String
+	 */
+	public String getX() {
+		return x;
+	}
+
+	/**
+	 * Sets the id.
+	 * @param id The id to set
+	 */
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	/**
+	 * Sets the x.
+	 * @param x The x to set
+	 */
+	public void setX(String x) {
+		this.x = x;
+	}
+
+	/**
+	 * @return
+	 */
+	public X getTheX() {
+		return theX;
+	}
+
+	/**
+	 * @param x
+	 */
+	public void setTheX(X x) {
+		theX = x;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Y.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Z.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Z.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Z.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,43 @@
+package org.hibernate.test.legacy;
+
+public class Z {
+
+	private long id;
+	private W w;
+
+	/**
+	 * 
+	 */
+	public Z() {
+	}
+
+
+	/**
+	 * @return
+	 */
+	public long getId() {
+		return id;
+	}
+
+	/**
+	 * @return
+	 */
+	public W getW() {
+		return w;
+	}
+
+	/**
+	 * @param l
+	 */
+	public void setId(long l) {
+		id = l;
+	}
+
+	/**
+	 * @param w
+	 */
+	public void setW(W w) {
+		this.w = w;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/legacy/Z.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/BlobLocatorTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/BlobLocatorTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/BlobLocatorTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,196 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.lob;
+
+import java.sql.Blob;
+
+import junit.framework.AssertionFailedError;
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.LockMode;
+import org.hibernate.Session;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.testing.junit.functional.DatabaseSpecificFunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.util.ArrayHelper;
+
+/**
+ * Tests lazy materialization of data mapped by
+ * {@link org.hibernate.type.BlobType}, as well as bounded and unbounded
+ * materialization and mutation.
+ *
+ * @author Steve Ebersole
+ */
+public class BlobLocatorTest extends DatabaseSpecificFunctionalTestCase {
+	private static final int BLOB_SIZE = 10000;
+
+	public BlobLocatorTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "lob/LobMappings.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( BlobLocatorTest.class );
+	}
+
+	public boolean appliesTo(Dialect dialect) {
+		if ( ! dialect.supportsExpectedLobUsagePattern() ) {
+			reportSkip( "database/driver does not support expected LOB usage pattern", "LOB support" );
+			return false;
+		}
+		return true;
+	}
+
+	public void testBoundedBlobLocatorAccess() throws Throwable {
+		byte[] original = buildRecursively( BLOB_SIZE, true );
+		byte[] changed = buildRecursively( BLOB_SIZE, false );
+
+		Session s = openSession();
+		s.beginTransaction();
+		LobHolder entity = new LobHolder();
+		entity.setBlobLocator( s.getLobHelper().createBlob( original ) );
+		s.save( entity );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		entity = ( LobHolder ) s.get( LobHolder.class, entity.getId() );
+		assertEquals( BLOB_SIZE, entity.getBlobLocator().length() );
+		assertEquals( original, extractData( entity.getBlobLocator() ) );
+		s.getTransaction().commit();
+		s.close();
+
+		// test mutation via setting the new clob data...
+		if ( supportsLobValueChangePropogation() ) {
+			s = openSession();
+			s.beginTransaction();
+			entity = ( LobHolder ) s.get( LobHolder.class, entity.getId(), LockMode.UPGRADE );
+			entity.getBlobLocator().truncate( 1 );
+			entity.getBlobLocator().setBytes( 1, changed );
+			s.getTransaction().commit();
+			s.close();
+
+			s = openSession();
+			s.beginTransaction();
+			entity = ( LobHolder ) s.get( LobHolder.class, entity.getId(), LockMode.UPGRADE );
+			assertNotNull( entity.getBlobLocator() );
+			assertEquals( BLOB_SIZE, entity.getBlobLocator().length() );
+			assertEquals( changed, extractData( entity.getBlobLocator() ) );
+			entity.getBlobLocator().truncate( 1 );
+			entity.getBlobLocator().setBytes( 1, original );
+			s.getTransaction().commit();
+			s.close();
+		}
+
+		// test mutation via supplying a new clob locator instance...
+		s = openSession();
+		s.beginTransaction();
+		entity = ( LobHolder ) s.get( LobHolder.class, entity.getId(), LockMode.UPGRADE );
+		assertNotNull( entity.getBlobLocator() );
+		assertEquals( BLOB_SIZE, entity.getBlobLocator().length() );
+		assertEquals( original, extractData( entity.getBlobLocator() ) );
+		entity.setBlobLocator( s.getLobHelper().createBlob( changed ) );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		entity = ( LobHolder ) s.get( LobHolder.class, entity.getId() );
+		assertEquals( BLOB_SIZE, entity.getBlobLocator().length() );
+		assertEquals( changed, extractData( entity.getBlobLocator() ) );
+		s.delete( entity );
+		s.getTransaction().commit();
+		s.close();
+
+	}
+
+	public void testUnboundedBlobLocatorAccess() throws Throwable {
+		if ( ! supportsUnboundedLobLocatorMaterialization() ) {
+			return;
+		}
+
+		// Note: unbounded mutation of the underlying lob data is completely
+		// unsupported; most databases would not allow such a construct anyway.
+		// Thus here we are only testing materialization...
+
+		byte[] original = buildRecursively( BLOB_SIZE, true );
+
+		Session s = openSession();
+		s.beginTransaction();
+		LobHolder entity = new LobHolder();
+		entity.setBlobLocator( Hibernate.createBlob( original ) );
+		s.save( entity );
+		s.getTransaction().commit();
+		s.close();
+
+		// load the entity with the clob locator, and close the session/transaction;
+		// at that point it is unbounded...
+		s = openSession();
+		s.beginTransaction();
+		entity = ( LobHolder ) s.get( LobHolder.class, entity.getId() );
+		s.getTransaction().commit();
+		s.close();
+
+		assertEquals( BLOB_SIZE, entity.getBlobLocator().length() );
+		assertEquals( original, extractData( entity.getBlobLocator() ) );
+
+		s = openSession();
+		s.beginTransaction();
+		s.delete( entity );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	private byte[] extractData(Blob blob) throws Throwable {
+		return blob.getBytes( 1, ( int ) blob.length() );
+	}
+
+
+	private byte[] buildRecursively(int size, boolean on) {
+		byte[] data = new byte[size];
+		data[0] = mask( on );
+		for ( int i = 0; i < size; i++ ) {
+			data[i] = mask( on );
+			on = !on;
+		}
+		return data;
+	}
+
+	private byte mask(boolean on) {
+		return on ? ( byte ) 1 : ( byte ) 0;
+	}
+
+	public static void assertEquals(byte[] val1, byte[] val2) {
+		if ( !ArrayHelper.isEquals( val1, val2 ) ) {
+			throw new AssertionFailedError( "byte arrays did not match" );
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/BlobLocatorTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/ClobLocatorTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/ClobLocatorTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/ClobLocatorTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,187 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.lob;
+
+import java.sql.Clob;
+
+import junit.framework.Test;
+
+import org.hibernate.LockMode;
+import org.hibernate.Session;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.dialect.H2Dialect;
+import org.hibernate.testing.junit.functional.DatabaseSpecificFunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Tests lazy materialization of data mapped by
+ * {@link org.hibernate.type.ClobType} as well as bounded and unbounded
+ * materialization and mutation.
+ *
+ * @author Steve Ebersole
+ */
+public class ClobLocatorTest extends DatabaseSpecificFunctionalTestCase {
+	private static final int CLOB_SIZE = 10000;
+
+	public ClobLocatorTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "lob/LobMappings.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( ClobLocatorTest.class );
+	}
+
+	public boolean appliesTo(Dialect dialect) {
+		if ( ! dialect.supportsExpectedLobUsagePattern() ) {
+			reportSkip( "database/driver does not support expected LOB usage pattern", "LOB support" );
+			return false;
+		}
+		return true;
+	}
+
+	public void testBoundedClobLocatorAccess() throws Throwable {
+		String original = buildRecursively( CLOB_SIZE, 'x' );
+		String changed = buildRecursively( CLOB_SIZE, 'y' );
+
+		Session s = openSession();
+		s.beginTransaction();
+		LobHolder entity = new LobHolder();
+		entity.setClobLocator( s.getLobHelper().createClob( original ) );
+		s.save( entity );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		entity = ( LobHolder ) s.get( LobHolder.class, entity.getId() );
+		assertEquals( CLOB_SIZE, entity.getClobLocator().length() );
+		assertEquals( original, extractData( entity.getClobLocator() ) );
+		s.getTransaction().commit();
+		s.close();
+
+		// test mutation via setting the new clob data...
+		if ( supportsLobValueChangePropogation() ) {
+			s = openSession();
+			s.beginTransaction();
+			entity = ( LobHolder ) s.get( LobHolder.class, entity.getId(), LockMode.UPGRADE );
+			entity.getClobLocator().truncate( 1 );
+			entity.getClobLocator().setString( 1, changed );
+			s.getTransaction().commit();
+			s.close();
+
+			s = openSession();
+			s.beginTransaction();
+			entity = ( LobHolder ) s.get( LobHolder.class, entity.getId(), LockMode.UPGRADE );
+			assertNotNull( entity.getClobLocator() );
+			assertEquals( CLOB_SIZE, entity.getClobLocator().length() );
+			assertEquals( changed, extractData( entity.getClobLocator() ) );
+			entity.getClobLocator().truncate( 1 );
+			entity.getClobLocator().setString( 1, original );
+			s.getTransaction().commit();
+			s.close();
+		}
+
+		// test mutation via supplying a new clob locator instance...
+		s = openSession();
+		s.beginTransaction();
+		entity = ( LobHolder ) s.get( LobHolder.class, entity.getId(), LockMode.UPGRADE );
+		assertNotNull( entity.getClobLocator() );
+		assertEquals( CLOB_SIZE, entity.getClobLocator().length() );
+		assertEquals( original, extractData( entity.getClobLocator() ) );
+		entity.setClobLocator( s.getLobHelper().createClob( changed ) );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		entity = ( LobHolder ) s.get( LobHolder.class, entity.getId() );
+		assertEquals( CLOB_SIZE, entity.getClobLocator().length() );
+		assertEquals( changed, extractData( entity.getClobLocator() ) );
+		s.delete( entity );
+		s.getTransaction().commit();
+		s.close();
+
+	}
+
+	public void testUnboundedClobLocatorAccess() throws Throwable {
+		if ( ! supportsUnboundedLobLocatorMaterialization() ) {
+			return;
+		}
+
+		// Note: unbounded mutation of the underlying lob data is completely
+		// unsupported; most databases would not allow such a construct anyway.
+		// Thus here we are only testing materialization...
+
+		String original = buildRecursively( CLOB_SIZE, 'x' );
+
+		Session s = openSession();
+		s.beginTransaction();
+		LobHolder entity = new LobHolder();
+		entity.setClobLocator( s.getLobHelper().createClob( original ) );
+		s.save( entity );
+		s.getTransaction().commit();
+		s.close();
+
+		// load the entity with the clob locator, and close the session/transaction;
+		// at that point it is unbounded...
+		s = openSession();
+		s.beginTransaction();
+		entity = ( LobHolder ) s.get( LobHolder.class, entity.getId() );
+		s.getTransaction().commit();
+		s.close();
+
+		assertEquals( CLOB_SIZE, entity.getClobLocator().length() );
+		assertEquals( original, extractData( entity.getClobLocator() ) );
+
+		s = openSession();
+		s.beginTransaction();
+		s.delete( entity );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	private String extractData(Clob clob) throws Throwable {
+		if ( getDialect() instanceof H2Dialect ) {
+			return clob.getSubString( 1, ( int ) clob.length() );
+		}
+		else {
+			char[] data = new char[ (int) clob.length() ];
+			clob.getCharacterStream().read( data );
+			return new String( data );
+		}
+	}
+
+
+	private String buildRecursively(int size, char baseChar) {
+		StringBuffer buff = new StringBuffer();
+		for( int i = 0; i < size; i++ ) {
+			buff.append( baseChar );
+		}
+		return buff.toString();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/ClobLocatorTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/ImageMappings.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/ImageMappings.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/ImageMappings.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.lob">
+
+	<class name="LongByteArrayHolder" table="LOB_ENTITY_IMAGE">
+		<id name="id" type="long" column="ID">
+			<generator class="increment"/>
+		</id>
+
+		<property name="longByteArray" column="LONG_BYTE_ARRAY" type="image" length="15000"/>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/ImageMappings.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/ImageTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/ImageTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/ImageTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,51 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.lob;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Tests eager materialization and mutation of data mapped by
+ * {@link org.hibernate.type.ImageType}.
+ *
+ * @author Gail Badner
+ */
+public class ImageTest extends LongByteArrayTest {
+
+	public ImageTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "lob/ImageMappings.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( ImageTest.class );
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/ImageTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/LobHolder.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/LobHolder.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/LobHolder.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,51 @@
+package org.hibernate.test.lob;
+
+import java.io.Serializable;
+import java.sql.Clob;
+import java.sql.Blob;
+
+/**
+ * An entity containing all kinds of good LOB-type data...
+ * <p/>
+ * {@link #clobLocator} is used to hold CLOB data that is materialized lazily
+ * via a JDBC CLOB locator; it is mapped via the
+ * {@link org.hibernate.type.ClobType}
+ * <p/>
+ * {@link #blobLocator} is used to hold BLOB data that is materialized lazily
+ * via a JDBC BLOB locator; it is mapped via the
+ * {@link org.hibernate.type.BlobType}
+ * 
+ *
+ * @author Steve Ebersole
+ */
+public class LobHolder {
+	private Long id;
+
+	private Clob clobLocator;
+
+	private Blob blobLocator;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Clob getClobLocator() {
+		return clobLocator;
+	}
+
+	public void setClobLocator(Clob clobLocator) {
+		this.clobLocator = clobLocator;
+	}
+
+	public Blob getBlobLocator() {
+		return blobLocator;
+	}
+
+	public void setBlobLocator(Blob blobLocator) {
+		this.blobLocator = blobLocator;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/LobHolder.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/LobMappings.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/LobMappings.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/LobMappings.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.lob">
+
+	<class name="LobHolder" table="LOB_ENTITY">
+		<id name="id" type="long" column="ID">
+			<generator class="increment"/>
+		</id>
+
+        <property name="clobLocator" column="CLOB_DATA" type="clob" length="15000" />
+
+        <property name="blobLocator" column="BLOB_DATA" type="blob" length="15000" />
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/LobMappings.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/LongByteArrayHolder.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/LongByteArrayHolder.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/LongByteArrayHolder.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,54 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.lob;
+
+/**
+ * An entity containing data that is materialized into a byte array immediately.
+ * The hibernate type mapped for {@link #longByteArray} determines the SQL type
+ * asctually used.
+ * 
+ * @author Gail Badner
+ */
+public class LongByteArrayHolder {
+	private Long id;
+	private byte[] longByteArray;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public byte[] getLongByteArray() {
+		return longByteArray;
+	}
+
+	public void setLongByteArray(byte[] longByteArray) {
+		this.longByteArray = longByteArray;
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/LongByteArrayHolder.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/LongByteArrayTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/LongByteArrayTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/LongByteArrayTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,110 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.lob;
+
+import junit.framework.AssertionFailedError;
+import org.hibernate.Session;
+import org.hibernate.testing.junit.functional.DatabaseSpecificFunctionalTestCase;
+import org.hibernate.util.ArrayHelper;
+
+/**
+ * Tests eager materialization and mutation of long byte arrays.
+ *
+ * @author Steve Ebersole
+ */
+public abstract class LongByteArrayTest extends DatabaseSpecificFunctionalTestCase {
+	private static final int ARRAY_SIZE = 10000;
+
+	public LongByteArrayTest(String name) {
+		super( name );
+	}
+
+	public void testBoundedLongByteArrayAccess() {
+		byte[] original = buildRecursively( ARRAY_SIZE, true );
+		byte[] changed = buildRecursively( ARRAY_SIZE, false );
+
+		Session s = openSession();
+		s.beginTransaction();
+		LongByteArrayHolder entity = new LongByteArrayHolder();
+		s.save( entity );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		entity = ( LongByteArrayHolder ) s.get( LongByteArrayHolder.class, entity.getId() );
+		assertNull( entity.getLongByteArray() );
+		entity.setLongByteArray( original );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		entity = ( LongByteArrayHolder ) s.get( LongByteArrayHolder.class, entity.getId() );
+		assertEquals( ARRAY_SIZE, entity.getLongByteArray().length );
+		assertEquals( original, entity.getLongByteArray() );
+		entity.setLongByteArray( changed );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		entity = ( LongByteArrayHolder ) s.get( LongByteArrayHolder.class, entity.getId() );
+		assertEquals( ARRAY_SIZE, entity.getLongByteArray().length );
+		assertEquals( changed, entity.getLongByteArray() );
+		entity.setLongByteArray( null );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		entity = ( LongByteArrayHolder ) s.get( LongByteArrayHolder.class, entity.getId() );
+		assertNull( entity.getLongByteArray() );
+		s.delete( entity );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	private byte[] buildRecursively(int size, boolean on) {
+		byte[] data = new byte[size];
+		data[0] = mask( on );
+		for ( int i = 0; i < size; i++ ) {
+			data[i] = mask( on );
+			on = !on;
+		}
+		return data;
+	}
+
+	private byte mask(boolean on) {
+		return on ? ( byte ) 1 : ( byte ) 0;
+	}
+
+	public static void assertEquals(byte[] val1, byte[] val2) {
+		if ( !ArrayHelper.isEquals( val1, val2 ) ) {
+			throw new AssertionFailedError( "byte arrays did not match" );
+		}
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/LongByteArrayTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/LongStringHolder.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/LongStringHolder.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/LongStringHolder.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,53 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.lob;
+
+/**
+ * An entity containing data that is materialized into a String immediately.
+ *
+ * @author Gail Badner
+ */
+public class LongStringHolder {
+	private Long id;
+
+	private String longString;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getLongString() {
+		return longString;
+	}
+
+	public void setLongString(String longString) {
+		this.longString = longString;
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/LongStringHolder.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/LongStringTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/LongStringTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/LongStringTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,96 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.lob;
+
+import org.hibernate.Session;
+import org.hibernate.testing.junit.functional.DatabaseSpecificFunctionalTestCase;
+
+/**
+ * Tests eager materialization and mutation of long strings.
+ *
+ * @author Steve Ebersole
+ */
+public abstract class LongStringTest extends DatabaseSpecificFunctionalTestCase {
+	private static final int LONG_STRING_SIZE = 10000;
+
+	public LongStringTest(String name) {
+		super( name );
+	}
+
+	public void testBoundedLongStringAccess() {
+		String original = buildRecursively( LONG_STRING_SIZE, 'x' );
+		String changed = buildRecursively( LONG_STRING_SIZE, 'y' );
+
+		Session s = openSession();
+		s.beginTransaction();
+		LongStringHolder entity = new LongStringHolder();
+		s.save( entity );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		entity = ( LongStringHolder ) s.get( LongStringHolder.class, entity.getId() );
+		assertNull( entity.getLongString() );
+		entity.setLongString( original );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		entity = ( LongStringHolder ) s.get( LongStringHolder.class, entity.getId() );
+		assertEquals( LONG_STRING_SIZE, entity.getLongString().length() );
+		assertEquals( original, entity.getLongString() );
+		entity.setLongString( changed );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		entity = ( LongStringHolder ) s.get( LongStringHolder.class, entity.getId() );
+		assertEquals( LONG_STRING_SIZE, entity.getLongString().length() );
+		assertEquals( changed, entity.getLongString() );
+		entity.setLongString( null );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		entity = ( LongStringHolder ) s.get( LongStringHolder.class, entity.getId() );
+		assertNull( entity.getLongString() );
+		s.delete( entity );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	private String buildRecursively(int size, char baseChar) {
+		StringBuffer buff = new StringBuffer();
+		for( int i = 0; i < size; i++ ) {
+			buff.append( baseChar );
+		}
+		return buff.toString();
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/LongStringTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/MaterializedBlobMappings.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/MaterializedBlobMappings.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/MaterializedBlobMappings.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.lob">
+
+	<class name="LongByteArrayHolder" table="LOB_ENTITY_MAT_BLOB">
+		<id name="id" type="long" column="ID">
+			<generator class="increment"/>
+		</id>
+
+        <property name="longByteArray" column="LONG_BYTE_ARRAY" type="materialized_blob" length="15000"/>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/MaterializedBlobMappings.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/MaterializedBlobTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/MaterializedBlobTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/MaterializedBlobTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,60 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.lob;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.dialect.Dialect;
+
+/**
+ * Tests eager materialization and mutation of data mapped by
+ * {@link org.hibernate.type.MaterializedBlobType}.
+ *
+ * @author Gail Badner
+ */
+public class MaterializedBlobTest extends LongByteArrayTest {
+
+	public MaterializedBlobTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "lob/MaterializedBlobMappings.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( MaterializedBlobTest.class );
+	}
+
+	public boolean appliesTo(Dialect dialect) {
+		if ( ! dialect.supportsExpectedLobUsagePattern() ) {
+			reportSkip( "database/driver does not support expected LOB usage pattern", "LOB support" );
+			return false;
+		}
+		return true;
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/MaterializedBlobTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/MaterializedClobMappings.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/MaterializedClobMappings.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/MaterializedClobMappings.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.lob">
+
+	<class name="LongStringHolder" table="LOB_ENTITY_MAT_CLOB">
+		<id name="id" type="long" column="ID">
+			<generator class="increment"/>
+		</id>
+
+		<property name="longString" column="LONG_STR" type="materialized_clob" length="15000"/>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/MaterializedClobMappings.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/MaterializedClobTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/MaterializedClobTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/MaterializedClobTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,60 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.lob;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.dialect.Dialect;
+
+/**
+ * Tests eager materialization and mutation of data mapped by
+ * {@link org.hibernate.type.MaterializedClobType}.
+ *
+ * @author Gail Badner
+ */
+public class MaterializedClobTest extends LongStringTest {
+
+	public MaterializedClobTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "lob/MaterializedClobMappings.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( MaterializedClobTest.class );
+	}
+
+	public boolean appliesTo(Dialect dialect) {
+		if ( ! dialect.supportsExpectedLobUsagePattern() ) {
+			reportSkip( "database/driver does not support expected LOB usage pattern", "LOB support" );
+			return false;
+		}
+		return true;
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/MaterializedClobTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/SerializableData.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/SerializableData.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/SerializableData.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,29 @@
+// $Id: SerializableData.java 4704 2004-11-04 21:59:22Z steveebersole $
+package org.hibernate.test.lob;
+
+import java.io.Serializable;
+
+/**
+ * Implementation of SerializableData.
+ *
+ * @author Steve
+ */
+public class SerializableData implements Serializable
+{
+   private String payload;
+
+   public SerializableData(String payload)
+   {
+      this.payload = payload;
+   }
+
+   public String getPayload()
+   {
+      return payload;
+   }
+
+   public void setPayload(String payload)
+   {
+      this.payload = payload;
+   }
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/SerializableData.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/SerializableHolder.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/SerializableHolder.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/SerializableHolder.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,56 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.lob;
+
+import java.io.Serializable;
+
+/**
+ * An entity containing serializable data which is
+ * mapped via the {@link org.hibernate.type.SerializableType}.
+ *
+ * @author Steve Ebersole
+ */
+public class SerializableHolder {
+	private Long id;
+
+	private Serializable serialData;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Serializable getSerialData() {
+		return serialData;
+	}
+
+	public void setSerialData(Serializable serialData) {
+		this.serialData = serialData;
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/SerializableHolder.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/SerializableMappings.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/SerializableMappings.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/SerializableMappings.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.lob">
+
+	<class name="SerializableHolder" table="LOB_ENTITY">
+		<id name="id" type="long" column="ID">
+			<generator class="increment"/>
+		</id>
+
+		<property name="serialData" column="SER_DATA" type="serializable"/>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/SerializableMappings.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/SerializableTypeTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/SerializableTypeTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/SerializableTypeTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,80 @@
+// $Id: SerializableTypeTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.lob;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Tests of {@link org.hibernate.type.SerializableType}
+ * 
+ * @author Steve Ebersole
+ */
+public class SerializableTypeTest extends FunctionalTestCase {
+
+	public SerializableTypeTest(String testName) {
+		super( testName );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "lob/SerializableMappings.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( SerializableTypeTest.class );
+	}
+
+
+	public String getCacheConcurrencyStrategy() {
+		return null;
+	}
+
+	public void testNewSerializableType() {
+		final String initialPayloadText = "Initial payload";
+		final String changedPayloadText = "Changed payload";
+
+		Session s = openSession();
+		s.beginTransaction();
+		SerializableHolder holder = new SerializableHolder();
+		s.save( holder );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		holder = ( SerializableHolder ) s.get( SerializableHolder.class, holder.getId() );
+		assertNull( holder.getSerialData() );
+		holder.setSerialData( new SerializableData( initialPayloadText ) );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		holder = ( SerializableHolder ) s.get( SerializableHolder.class, holder.getId() );
+		SerializableData serialData = ( SerializableData ) holder.getSerialData();
+		assertEquals( initialPayloadText, serialData.getPayload() );
+		holder.setSerialData( new SerializableData( changedPayloadText ) );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		holder = ( SerializableHolder ) s.get( SerializableHolder.class, holder.getId() );
+		serialData = ( SerializableData ) holder.getSerialData();
+		assertEquals( changedPayloadText, serialData.getPayload() );
+		holder.setSerialData( null );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		holder = ( SerializableHolder ) s.get( SerializableHolder.class, holder.getId() );
+		assertNull( holder.getSerialData() );
+		s.delete( holder );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/SerializableTypeTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/TextMappings.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/TextMappings.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/TextMappings.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.lob">
+
+	<class name="LongStringHolder" table="LOB_ENTITY_TEXT">
+		<id name="id" type="long" column="ID">
+			<generator class="increment"/>
+		</id>
+
+		<property name="longString" column="LONG_STR" type="text" length="15000"/>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/TextMappings.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/TextTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/TextTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/TextTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,51 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.lob;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Test eager materialization and mutation data mapped by
+ * #{@link org.hibernate.type.TextType}.
+ *
+ * @author Gail Badner
+ */
+public class TextTest extends LongStringTest {
+
+	public TextTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "lob/TextMappings.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( TextTest.class );
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/lob/TextTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/Group.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/Group.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/Group.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,56 @@
+//$Id: Group.java 7085 2005-06-08 17:59:47Z oneovthafew $
+package org.hibernate.test.manytomany;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+
+public class Group implements Serializable {
+
+	private String org;
+	private String name;
+	private String description;
+
+	private Set users = new HashSet();
+	
+	public Group(String name, String org) {
+		this.org = org;
+		this.name = name;
+	}
+
+	public Group() {
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getOrg() {
+		return org;
+	}
+
+	public void setOrg(String org) {
+		this.org = org;
+	}
+
+	public Set getUsers() {
+		return users;
+	}
+
+	public void setUsers(Set users) {
+		this.users = users;
+	}
+
+	public String getDescription() {
+		return description;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/Group.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/ManyToManyTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/ManyToManyTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/ManyToManyTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,127 @@
+//$Id: ManyToManyTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.manytomany;
+
+import junit.framework.Test;
+
+import org.hibernate.FetchMode;
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class ManyToManyTest extends FunctionalTestCase {
+	
+	public ManyToManyTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "manytomany/UserGroup.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setProperty(Environment.USE_SECOND_LEVEL_CACHE, "false");
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( ManyToManyTest.class );
+	}
+	
+	public void testManyToManyWithFormula() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		User gavin = new User("gavin", "jboss");
+		Group seam = new Group("seam", "jboss");
+		Group hb = new Group("hibernate", "jboss");
+		gavin.getGroups().add(seam);
+		gavin.getGroups().add(hb);
+		seam.getUsers().add(gavin);
+		hb.getUsers().add(gavin);
+		s.persist(gavin);
+		s.persist(seam);
+		s.persist(hb);
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		gavin = (User) s.get(User.class, gavin);
+		assertFalse( Hibernate.isInitialized( gavin.getGroups() ) );
+		assertEquals( 2, gavin.getGroups().size() );
+		hb = (Group) s.get(Group.class, hb);
+		assertFalse( Hibernate.isInitialized( hb.getUsers() ) );
+		assertEquals( 1, hb.getUsers().size() );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		gavin = (User) s.createCriteria(User.class)
+			.setFetchMode("groups", FetchMode.JOIN)
+			.uniqueResult();
+		assertTrue( Hibernate.isInitialized( gavin.getGroups() ) );
+		assertEquals( 2, gavin.getGroups().size() );
+		Group group = (Group) gavin.getGroups().iterator().next();
+		assertFalse( Hibernate.isInitialized( group.getUsers() ) );
+		assertEquals( 1, group.getUsers().size() );
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		gavin = (User) s.createCriteria(User.class)
+			.setFetchMode("groups", FetchMode.JOIN)
+			.setFetchMode("groups.users", FetchMode.JOIN)
+			.uniqueResult();
+		assertTrue( Hibernate.isInitialized( gavin.getGroups() ) );
+		assertEquals( 2, gavin.getGroups().size() );
+		group = (Group) gavin.getGroups().iterator().next();
+		assertTrue( Hibernate.isInitialized( group.getUsers() ) );
+		assertEquals( 1, group.getUsers().size() );
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		gavin = (User) s.createQuery("from User u join fetch u.groups g join fetch g.users").uniqueResult();
+		assertTrue( Hibernate.isInitialized( gavin.getGroups() ) );
+		assertEquals( 2, gavin.getGroups().size() );
+		group = (Group) gavin.getGroups().iterator().next();
+		assertTrue( Hibernate.isInitialized( group.getUsers() ) );
+		assertEquals( 1, group.getUsers().size() );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		gavin = (User) s.get(User.class, gavin);
+		hb = (Group) s.get(Group.class, hb);
+		gavin.getGroups().remove(hb);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		gavin = (User) s.get(User.class, gavin);
+		assertEquals( gavin.getGroups().size(), 1 );
+		hb = (Group) s.get(Group.class, hb);
+		assertEquals( hb.getUsers().size(), 0 );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete(gavin);
+		s.flush();
+		s.createQuery("delete from Group").executeUpdate();
+		t.commit();
+		s.close();
+	}
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/ManyToManyTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/User.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/User.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/User.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,46 @@
+//$Id: User.java 7085 2005-06-08 17:59:47Z oneovthafew $
+package org.hibernate.test.manytomany;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+
+public class User implements Serializable {
+	
+	private String org;
+	private String name;
+	private Set groups = new HashSet();
+
+	public User(String name, String org) {
+		this.org = org;
+		this.name = name;
+	}
+
+	public User() {
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getOrg() {
+		return org;
+	}
+
+	public void setOrg(String org) {
+		this.org = org;
+	}
+
+	public Set getGroups() {
+		return groups;
+	}
+
+	public void setGroups(Set groups) {
+		this.groups = groups;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/User.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/UserGroup.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/UserGroup.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/UserGroup.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,52 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+  This mapping demonstrates how to map a many-to-many
+  association with a shared attribute in the primary keys
+  of the associated entities.
+     
+-->
+
+<hibernate-mapping 
+	package="org.hibernate.test.manytomany">
+	
+	<class name="User" table="`User`">
+		<composite-id>
+			<key-property name="name" length="32"/>
+			<key-property name="org" length="32"/>
+		</composite-id>
+		<set name="groups" table="UserGroup">
+			<key>
+				<column name="`userName`"/>
+				<column name="org"/>
+			</key>
+			<many-to-many class="Group">
+				<column name="groupName"/>
+				<formula>org</formula>
+			</many-to-many>
+		</set>
+	</class>
+	
+	<class name="Group" table="`Group`">
+		<composite-id>
+			<key-property name="name" length="32"/>
+			<key-property name="org" length="32"/>
+		</composite-id>
+		<property name="description"/>
+		<set name="users" table="UserGroup" inverse="true">
+			<key>
+				<column name="groupName"/>
+				<column name="org"/>
+			</key>
+			<many-to-many class="User">
+				<column name="`userName`"/>
+				<formula>org</formula>
+			</many-to-many>
+		</set>
+	</class>
+	
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/UserGroup.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/batchload/BatchedManyToManyTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/batchload/BatchedManyToManyTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/batchload/BatchedManyToManyTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,176 @@
+/*
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.manytomany.batchload;
+
+import java.util.List;
+
+import junit.framework.Test;
+import junit.framework.Assert;
+
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.Session;
+import org.hibernate.Hibernate;
+import org.hibernate.Interceptor;
+import org.hibernate.EmptyInterceptor;
+import org.hibernate.jdbc.BatcherFactory;
+import org.hibernate.jdbc.NonBatchingBatcher;
+import org.hibernate.jdbc.Batcher;
+import org.hibernate.jdbc.ConnectionManager;
+import org.hibernate.stat.CollectionStatistics;
+import org.hibernate.loader.collection.BatchingCollectionInitializer;
+import org.hibernate.persister.collection.AbstractCollectionPersister;
+
+/**
+ * Tests loading of many-to-many collection which should trigger
+ * a batch load.
+ *
+ * @author Steve Ebersole
+ */
+public class BatchedManyToManyTest extends FunctionalTestCase {
+	public BatchedManyToManyTest(String string) {
+		super( string );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( BatchedManyToManyTest.class );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "manytomany/batchload/UserGroupBatchLoad.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setProperty( Environment.USE_SECOND_LEVEL_CACHE, "false" );
+		cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
+		cfg.setProperty( Environment.BATCH_STRATEGY, TestingBatcherFactory.class.getName() );
+	}
+
+	public static class TestingBatcherFactory implements BatcherFactory {
+		public Batcher createBatcher(ConnectionManager connectionManager, Interceptor interceptor) {
+			return new TestingBatcher( connectionManager, interceptor );
+		}
+	}
+
+	public static class TestingBatcher extends NonBatchingBatcher {
+		public TestingBatcher(ConnectionManager connectionManager, Interceptor interceptor) {
+			super( connectionManager, interceptor );
+		}
+
+	}
+
+	public void testProperLoaderSetup() {
+		AbstractCollectionPersister cp = ( AbstractCollectionPersister )
+				sfi().getCollectionPersister( User.class.getName() + ".groups" );
+		assertClassAssignability( BatchingCollectionInitializer.class, cp.getInitializer().getClass() );
+		BatchingCollectionInitializer initializer = ( BatchingCollectionInitializer ) cp.getInitializer();
+		assertEquals( 50, findMaxBatchSize( initializer.getBatchSizes() ) );
+	}
+
+	private int findMaxBatchSize(int[] batchSizes) {
+		int max = 0;
+		for ( int size : batchSizes ) {
+			if ( size > max ) {
+				max = size;
+			}
+		}
+		return max;
+	}
+
+	public void testLoadingNonInverseSide() {
+		prepareTestData();
+
+		sfi().getStatistics().clear();
+		CollectionStatistics userGroupStats = sfi().getStatistics()
+				.getCollectionStatistics( User.class.getName() + ".groups" );
+		CollectionStatistics groupUserStats = sfi().getStatistics()
+				.getCollectionStatistics( Group.class.getName() + ".users" );
+
+		Interceptor testingInterceptor = new EmptyInterceptor() {
+			public String onPrepareStatement(String sql) {
+				// ugh, this is the best way I could come up with to assert this.
+				// unfortunately, this is highly dependent on the dialect and its
+				// outer join fragment.  But at least this wil fail on the majority
+				// of dialects...
+				Assert.assertFalse(
+						"batch load of many-to-many should use inner join",
+						sql.toLowerCase().contains( "left outer join" )
+				);
+				return super.onPrepareStatement( sql );
+			}
+		};
+
+		Session s = openSession( testingInterceptor );
+		s.beginTransaction();
+		List users = s.createQuery( "from User u" ).list();
+		User user = ( User ) users.get( 0 );
+		assertTrue( Hibernate.isInitialized( user ) );
+		assertTrue( Hibernate.isInitialized( user.getGroups() ) );
+		user = ( User ) users.get( 1 );
+		assertTrue( Hibernate.isInitialized( user ) );
+		assertTrue( Hibernate.isInitialized( user.getGroups() ) );
+		assertEquals( 1, userGroupStats.getFetchCount() ); // should have been just one fetch (the batch fetch)
+		assertEquals( 1, groupUserStats.getFetchCount() ); // should have been just one fetch (the batch fetch)
+		s.getTransaction().commit();
+		s.close();
+
+		cleanupTestData();
+	}
+
+	protected void prepareTestData() {
+		// set up the test data
+		User me = new User( "steve" );
+		User you = new User( "not steve" );
+		Group developers = new Group( "developers" );
+		Group translators = new Group( "translators" );
+		Group contributors = new Group( "contributors" );
+		me.getGroups().add( developers );
+		developers.getUsers().add( me );
+		you.getGroups().add( translators );
+		translators.getUsers().add( you );
+		you.getGroups().add( contributors );
+		contributors.getUsers().add( you );
+		Session s = openSession();
+		s.beginTransaction();
+		s.save( me );
+		s.save( you );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	protected void cleanupTestData() {
+		// clean up the test data
+		Session s = openSession();
+		s.beginTransaction();
+		// User is the non-inverse side...
+		List<User> users = s.createQuery( "from User" ).list();
+		for ( User user : users ) {
+			s.delete( user );
+		}
+		s.flush();
+		s.createQuery( "delete Group" ).executeUpdate();
+		s.getTransaction().commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/batchload/BatchedManyToManyTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/batchload/Group.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/batchload/Group.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/batchload/Group.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.manytomany.batchload;
+
+import java.util.Set;
+import java.util.HashSet;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class Group {
+	private Long id;
+	private String name;
+	private Set<User> users = new HashSet<User>();
+
+	public Group() {
+	}
+
+	public Group(String name) {
+		this.name = name;
+	}
+
+	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 Set<User> getUsers() {
+		return users;
+	}
+
+	public void setUsers(Set<User> users) {
+		this.users = users;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/batchload/Group.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/batchload/User.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/batchload/User.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/batchload/User.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.manytomany.batchload;
+
+import java.util.Set;
+import java.util.HashSet;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class User {
+	private Long id;
+	private String name;
+	private Set<Group> groups = new HashSet<Group>();
+
+	public User() {
+	}
+
+	public User(String name) {
+		this.name = name;
+	}
+
+	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 Set<Group> getGroups() {
+		return groups;
+	}
+
+	public void setGroups(Set<Group> groups) {
+		this.groups = groups;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/batchload/User.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/batchload/UserGroupBatchLoad.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/batchload/UserGroupBatchLoad.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/batchload/UserGroupBatchLoad.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,52 @@
+<?xml version="1.0"?>
+<!--
+  ~ Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+  ~ indicated by the @author tags or express copyright attribution
+  ~ statements applied by the authors.  All third-party contributions are
+  ~ distributed under license by Red Hat Middleware LLC.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, as published by the Free Software Foundation.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  ~ or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+  ~ for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public License
+  ~ along with this distribution; if not, write to:
+  ~ Free Software Foundation, Inc.
+  ~ 51 Franklin Street, Fifth Floor
+  ~ Boston, MA  02110-1301  USA
+  -->
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+
+<hibernate-mapping package="org.hibernate.test.manytomany.batchload">
+	
+	<class name="User" table="M2N_BATCHED_USER">
+        <id name="id" type="long">
+            <generator class="increment"/>
+        </id>
+        <property name="name" type="string"/>
+		<set name="groups" table="M2N_BATCHED_GROUPUSER" inverse="false" cascade="all" lazy="false" batch-size="50" >
+            <key column="USER_ID"/>
+			<many-to-many class="Group" column="GROUP_ID"/>
+		</set>
+	</class>
+	
+	<class name="Group" table="M2N_BATCHED_GROUP">
+        <id name="id" type="long">
+            <generator class="increment"/>
+        </id>
+		<property name="name" type="string"/>
+		<set name="users" table="M2N_BATCHED_GROUPUSER" inverse="true" cascade="all" lazy="false" batch-size="50">
+            <key column="GROUP_ID"/>
+			<many-to-many class="User" column="USER_ID"/>
+		</set>
+	</class>
+	
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/batchload/UserGroupBatchLoad.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/ordered/Group.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/ordered/Group.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/ordered/Group.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,69 @@
+package org.hibernate.test.manytomany.ordered;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.ArrayList;
+
+public class Group implements Serializable {
+
+	private Long id;
+	private String org;
+	private String name;
+	private String description;
+
+	private List users = new ArrayList();
+
+	public Group() {
+	}
+
+	public Group(String name, String org) {
+		this.org = org;
+		this.name = name;
+	}
+
+	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 String getOrg() {
+		return org;
+	}
+
+	public void setOrg(String org) {
+		this.org = org;
+	}
+
+	public List getUsers() {
+		return users;
+	}
+
+	public void setUsers(List users) {
+		this.users = users;
+	}
+
+	public String getDescription() {
+		return description;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
+	public void addUser(User user) {
+		if ( user.getGroups().add( this ) ) {
+			getUsers().add( user );
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/ordered/Group.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/ordered/OrderedManyToManyTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/ordered/OrderedManyToManyTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/ordered/OrderedManyToManyTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,139 @@
+package org.hibernate.test.manytomany.ordered;
+
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.Criteria;
+import org.hibernate.FetchMode;
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class OrderedManyToManyTest extends FunctionalTestCase {
+
+	public OrderedManyToManyTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "manytomany/ordered/UserGroup.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setProperty( Environment.USE_SECOND_LEVEL_CACHE, "false");
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( OrderedManyToManyTest.class );
+	}
+
+	public void testManyToManyOrdering() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		User gavin = new User( "gavin", "jboss" );
+		User steve = new User( "steve", "jboss" );
+		User max = new User( "max", "jboss" );
+		User emmanuel = new User( "emmanuel", "jboss" );
+		s.persist( gavin );
+		s.persist( steve );
+		s.persist( max );
+		s.persist( emmanuel );
+		Group hibernate = new Group( "hibernate", "jboss" );
+		hibernate.addUser( gavin );
+		hibernate.addUser( steve );
+		hibernate.addUser( max );
+		hibernate.addUser( emmanuel );
+		s.persist( hibernate );
+		t.commit();
+		s.close();
+
+		// delayed collection load...
+		s = openSession();
+		t = s.beginTransaction();
+		hibernate = ( Group ) s.get( Group.class, hibernate.getId() );
+		assertFalse( Hibernate.isInitialized( hibernate.getUsers() ) );
+		assertEquals( 4, hibernate.getUsers().size() );
+		assertOrdering( hibernate.getUsers() );
+		t.commit();
+		s.close();
+
+		// HQL (non eager)
+		s = openSession();
+		t = s.beginTransaction();
+		hibernate = ( Group ) s.createQuery( "from Group" ).uniqueResult();
+		assertFalse( Hibernate.isInitialized( hibernate.getUsers() ) );
+		assertEquals( 4, hibernate.getUsers().size() );
+		assertOrdering( hibernate.getUsers() );
+		t.commit();
+		s.close();
+
+		// HQL (eager)
+		s = openSession();
+		t = s.beginTransaction();
+		hibernate = ( Group ) s.createQuery( "from Group g inner join fetch g.users" ).uniqueResult();
+		assertTrue( Hibernate.isInitialized( hibernate.getUsers() ) );
+		assertEquals( 4, hibernate.getUsers().size() );
+		assertOrdering( hibernate.getUsers() );
+		t.commit();
+		s.close();
+
+		// criteria load (forced eager fetch)
+		s = openSession();
+		t = s.beginTransaction();
+		Criteria criteria = s.createCriteria( Group.class );
+		criteria.setFetchMode( "users", FetchMode.JOIN );
+		hibernate = ( Group ) criteria.uniqueResult();
+		assertTrue( Hibernate.isInitialized( hibernate.getUsers() ) );
+		assertEquals( 4, hibernate.getUsers().size() );
+		assertOrdering( hibernate.getUsers() );
+		t.commit();
+		s.close();
+
+		// criteria load (forced non eager fetch)
+		s = openSession();
+		t = s.beginTransaction();
+		criteria = s.createCriteria( Group.class );
+		criteria.setFetchMode( "users", FetchMode.SELECT );
+		hibernate = ( Group ) criteria.uniqueResult();
+		assertFalse( Hibernate.isInitialized( hibernate.getUsers() ) );
+		assertEquals( 4, hibernate.getUsers().size() );
+		assertOrdering( hibernate.getUsers() );
+		t.commit();
+		s.close();
+
+		// clean up
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete( gavin );
+		s.delete( steve );
+		s.delete( max );
+		s.delete( emmanuel );
+		s.delete( hibernate );
+		t.commit();
+		s.close();
+	}
+
+	private void assertOrdering(List users) {
+		User user = extractUser( users, 0 );
+		assertTrue( "many-to-many ordering not applied", user.getName().equals( "emmanuel" ) );
+		user = extractUser( users, 1 );
+		assertTrue( "many-to-many ordering not applied", user.getName().equals( "gavin" ) );
+		user = extractUser( users, 2 );
+		assertTrue( "many-to-many ordering not applied", user.getName().equals( "max" ) );
+		user = extractUser( users, 3 );
+		assertTrue( "many-to-many ordering not applied", user.getName().equals( "steve" ) );
+	}
+
+	private User extractUser(List users, int position) {
+		return ( User ) users.get( position );
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/ordered/OrderedManyToManyTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/ordered/User.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/ordered/User.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/ordered/User.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,54 @@
+package org.hibernate.test.manytomany.ordered;
+
+import java.io.Serializable;
+import java.util.Set;
+import java.util.HashSet;
+
+public class User implements Serializable {
+
+	private Long id;
+	private String org;
+	private String name;
+	private Set groups = new HashSet();
+
+	public User() {
+	}
+
+	public User(String name, String org) {
+		this.org = org;
+		this.name = name;
+	}
+
+	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 String getOrg() {
+		return org;
+	}
+
+	public void setOrg(String org) {
+		this.org = org;
+	}
+
+	public Set getGroups() {
+		return groups;
+	}
+
+	public void setGroups(Set groups) {
+		this.groups = groups;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/ordered/User.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/ordered/UserGroup.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/ordered/UserGroup.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/ordered/UserGroup.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,42 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+  This mapping demonstrates how to map a many-to-many
+  association with a shared attribute in the primary keys
+  of the associated entities.
+     
+-->
+
+<hibernate-mapping 
+	package="org.hibernate.test.manytomany.ordered">
+
+
+	<class name="User" table="`User`">
+        <id name="id" column="ID" type="long">
+            <generator class="native"/>
+        </id>
+        <property name="name" column="NAME"/>
+        <property name="org" column="ORG"/>
+		<set name="groups" table="UserGroup">
+			<key column="USER_ID"/>
+			<many-to-many column="GROUP_ID" class="Group"/>
+		</set>
+	</class>
+
+	<class name="Group" table="`Group`">
+        <id name="id" column="ID">
+            <generator class="native"/>
+        </id>
+        <property name="name"/>
+		<property name="description"/>
+		<bag name="users" table="UserGroup" inverse="true">
+			<key column="GROUP_ID"/>
+			<many-to-many column="USER_ID" class="User" order-by="NAME"/>
+		</bag>
+	</class>
+	
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomany/ordered/UserGroup.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/AbstractManyToManyAssociationClassTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/AbstractManyToManyAssociationClassTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/AbstractManyToManyAssociationClassTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,271 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.manytomanyassociationclass;
+
+import java.util.HashSet;
+
+import org.hibernate.Session;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+
+/**
+ * Abstract class for tests on many-to-many association using an association class.
+ *
+ * @author Gail Badner
+ */
+public abstract class AbstractManyToManyAssociationClassTest extends FunctionalTestCase {
+	private User user;
+	private Group group;
+	private Membership membership;
+
+	public AbstractManyToManyAssociationClassTest(String string) {
+		super( string );
+	}
+
+	public abstract String[] getMappings();
+
+	public abstract Membership createMembership(String name);
+
+	protected void prepareTest() {
+		Session s = openSession();
+		s.beginTransaction();
+		user = new User( "user" );
+		group = new Group( "group" );
+		s.save( user );
+		s.save( group );
+		membership = createMembership( "membership");
+		addMembership( user, group, membership );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	protected void cleanupTest() {
+		if ( getSessions() != null ) {
+			Session s = openSession();
+			s.beginTransaction();
+			s.createQuery( "delete from " + membership.getClass().getName() );
+			s.createQuery( "delete from User" );
+			s.createQuery( "delete from Group" );
+			s.getTransaction().commit();
+			s.close();
+		}
+	}
+
+	public User getUser() {
+		return user;
+	}
+
+	public Group getGroup() {
+		return group;
+	}
+
+	public Membership getMembership() {
+		return membership;
+	}
+	
+	public void testRemoveAndAddSameElement() {
+		deleteMembership( user, group, membership );
+		addMembership( user, group, membership );
+
+		Session s = openSession();
+		s.beginTransaction();
+		s.merge( user );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		user = ( User ) s.get( User.class, user.getId() );
+		group = ( Group ) s.get( Group.class, group.getId() );
+		membership = ( Membership ) s.get( membership.getClass(), membership.getId() );
+		assertEquals( "user", user.getName() );
+		assertEquals( "group", group.getName() );
+		assertEquals( "membership", membership.getName() );
+		assertEquals( 1, user.getMemberships().size() );
+		assertEquals( 1, group.getMemberships().size() );
+		assertSame( membership, user.getMemberships().iterator().next() );
+		assertSame( membership, group.getMemberships().iterator().next() );
+		assertSame( user, membership.getUser() );
+		assertSame( group, membership.getGroup() );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testRemoveAndAddEqualElement() {
+		deleteMembership( user, group, membership );
+		membership = createMembership( "membership" );
+		addMembership( user, group, membership );
+
+		Session s = openSession();
+		s.beginTransaction();
+		s.merge( user );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		user = ( User ) s.get( User.class, user.getId() );
+		group = ( Group ) s.get( Group.class, group.getId() );
+		membership = ( Membership ) s.get( membership.getClass(), membership.getId() );
+		assertEquals( "user", user.getName() );
+		assertEquals( "group", group.getName() );
+		assertEquals( "membership", membership.getName() );
+		assertEquals( 1, user.getMemberships().size() );
+		assertEquals( 1, group.getMemberships().size() );
+		assertSame( membership, user.getMemberships().iterator().next() );
+		assertSame( membership, group.getMemberships().iterator().next() );
+		assertSame( user, membership.getUser() );
+		assertSame( group, membership.getGroup() );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testRemoveAndAddEqualCollection() {
+		deleteMembership( user, group, membership );
+		membership = createMembership( "membership" );
+		user.setMemberships( new HashSet() );
+		group.setMemberships( new HashSet() );
+		addMembership( user, group, membership );
+
+		Session s = openSession();
+		s.beginTransaction();
+		s.merge( user );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		user = ( User ) s.get( User.class, user.getId() );
+		group = ( Group ) s.get( Group.class, group.getId() );
+		membership = ( Membership ) s.get( membership.getClass(), membership.getId() );
+		assertEquals( "user", user.getName() );
+		assertEquals( "group", group.getName() );
+		assertEquals( "membership", membership.getName() );
+		assertEquals( 1, user.getMemberships().size() );
+		assertEquals( 1, group.getMemberships().size() );
+		assertSame( membership, user.getMemberships().iterator().next() );
+		assertSame( membership, group.getMemberships().iterator().next() );
+		assertSame( user, membership.getUser() );
+		assertSame( group, membership.getGroup() );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testRemoveAndAddSameElementNonKeyModified() {
+		deleteMembership( user, group, membership );
+		addMembership( user, group, membership );
+		membership.setName( "membership1" );
+
+		Session s = openSession();
+		s.beginTransaction();
+		s.merge( user );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		user = ( User ) s.get( User.class, user.getId() );
+		group = ( Group ) s.get( Group.class, group.getId() );
+		membership = ( Membership ) s.get( membership.getClass(), membership.getId() );
+		assertEquals( "user", user.getName() );
+		assertEquals( "group", group.getName() );
+		assertEquals( "membership1", membership.getName() );
+		assertEquals( 1, user.getMemberships().size() );
+		assertEquals( 1, group.getMemberships().size() );
+		assertSame( membership, user.getMemberships().iterator().next() );
+		assertSame( membership, group.getMemberships().iterator().next() );
+		assertSame( user, membership.getUser() );
+		assertSame( group, membership.getGroup() );
+		s.getTransaction().commit();
+		s.close();
+
+	}
+
+	public void testRemoveAndAddEqualElementNonKeyModified() {
+		deleteMembership( user, group, membership );
+		membership = createMembership( "membership" );
+		addMembership( user, group, membership );
+		membership.setName( "membership1" );
+
+		Session s = openSession();
+		s.beginTransaction();
+		s.merge( user );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		user = ( User ) s.get( User.class, user.getId() );
+		group = ( Group ) s.get( Group.class, group.getId() );
+		membership = ( Membership ) s.get( membership.getClass(), membership.getId() );
+		assertEquals( "user", user.getName() );
+		assertEquals( "group", group.getName() );
+		assertEquals( "membership1", membership.getName() );
+		assertEquals( 1, user.getMemberships().size() );
+		assertEquals( 1, group.getMemberships().size() );
+		assertSame( membership, user.getMemberships().iterator().next() );
+		assertSame( membership, group.getMemberships().iterator().next() );
+		assertSame( user, membership.getUser() );
+		assertSame( group, membership.getGroup() );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testDeleteDetached() {
+		Session s = openSession();
+		s.beginTransaction();
+		s.delete( user );
+		s.delete( group );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		assertNull( s.get( User.class, user.getId() ) );
+		assertNull( s.get( Group.class , group.getId() ) );
+		assertNull( s.get( membership.getClass(), membership.getId() ) );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void deleteMembership(User u, Group g, Membership ug) {
+		if ( u == null || g == null ) {
+			throw new IllegalArgumentException();
+		}
+		u.getMemberships().remove( ug );
+		g.getMemberships().remove( ug );
+		ug.setUser( null );
+		ug.setGroup( null );
+	}
+
+	public void addMembership(User u, Group g, Membership ug) {
+		if ( u == null || g == null ) {
+			throw new IllegalArgumentException();
+		}
+		ug.setUser( u );
+		ug.setGroup( g );
+		u.getMemberships().add( ug );
+		g.getMemberships().add( ug );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/AbstractManyToManyAssociationClassTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/Group.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/Group.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/Group.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,90 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.manytomanyassociationclass;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author Gail Badner
+ */
+public class Group {
+	private Long id;
+	private String name;
+	private Set memberships = new HashSet();
+
+	public Group() {
+	}
+
+	public Group(String name) {
+		this.name = name;
+	}
+
+	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 Set getMemberships() {
+		return memberships;
+	}
+
+	public void setMemberships(Set memberships) {
+		this.memberships = memberships;
+	}
+
+	public boolean equals(Object obj) {
+		if ( this == obj ) {
+			return true;
+		}
+		if ( obj instanceof  Group ) {
+			Group grp = ( Group ) obj;
+			if ( grp.getName() != null && name != null ) {
+				return grp.getName().equals( name );
+			}
+			else {
+				return super.equals( obj );
+			}
+		}
+		else {
+			return false;
+		}
+	}
+
+	public int hashCode() {
+		return ( name == null ? super.hashCode() : name.hashCode() );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/Group.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/Membership.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/Membership.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/Membership.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,109 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.manytomanyassociationclass;
+
+import java.io.Serializable;
+
+/**
+ * Models a user's membership in a group.
+ *
+ * @author Gail Badner
+ */
+public class Membership {
+	private Serializable id;
+	private String name;
+	private User user;
+	private Group group;
+
+	public Membership() {
+	}
+
+	public Membership(Serializable id) {
+		this.id = id;
+	}
+
+	public Membership(String name) {
+		this.name = name;
+	}
+
+	public Membership(Serializable id, String name) {
+		this.id = id;
+		this.name = name;
+	}
+
+	public Serializable getId() {
+		return id;
+	}
+
+	public void setId(Serializable id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public User getUser() {
+		return user;
+	}
+
+	public void setUser(User user) {
+		this.user = user;
+	}
+
+	public Group getGroup() {
+		return group;
+	}
+
+	public void setGroup(Group group) {
+		this.group = group;
+	}
+
+	public boolean equals(Object obj) {
+		if ( this == obj ) {
+			return true;
+		}
+		if ( obj instanceof Membership ) {
+			Membership mem = ( Membership ) obj;
+			if ( mem.getName() != null && name != null ) {
+				return mem.getName().equals( name );
+			}
+			else {
+				return super.equals( obj );
+			}
+		}
+		else {
+			return false;
+		}
+	}
+
+	public int hashCode() {
+		return ( name == null ? super.hashCode() : name.hashCode() );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/Membership.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/User.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/User.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/User.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,95 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.manytomanyassociationclass;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author Gail Badner
+ */
+public class User {
+	private Long id;
+	private String name;
+	private Set memberships = new HashSet();
+
+	public User() {
+	}
+
+	public User(String name) {
+		this.name = name;
+	}
+
+	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 Set getMemberships() {
+		return memberships;
+	}
+
+	public void setMemberships(Set memberships) {
+		this.memberships = memberships;
+	}
+
+	public void addGroupMembership(Group group) {
+		if ( group == null ) {
+			throw new IllegalArgumentException( "group cannot be null" );
+		}
+	}
+	public boolean equals(Object obj) {
+		if ( this == obj ) {
+			return true;
+		}
+		if ( obj instanceof  User ) {
+			User user = ( User ) obj;
+			if ( user.getName() != null && name != null ) {
+				return user.getName().equals( name );
+			}
+			else {
+				return super.equals( obj );
+			}
+		}
+		else {
+			return false;
+		}
+	}
+
+	public int hashCode() {
+		return ( name == null ? super.hashCode() : name.hashCode() );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/User.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/compositeid/ManyToManyAssociationClassCompositeIdTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/compositeid/ManyToManyAssociationClassCompositeIdTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/compositeid/ManyToManyAssociationClassCompositeIdTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,55 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.manytomanyassociationclass.compositeid;
+
+import junit.framework.Test;
+
+import org.hibernate.test.manytomanyassociationclass.AbstractManyToManyAssociationClassTest;
+import org.hibernate.test.manytomanyassociationclass.Membership;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Tests on many-to-many association using an association class with a composite ID containing
+ * the IDs from the associated entities.
+ *
+ * @author Gail Badner
+ */
+public class ManyToManyAssociationClassCompositeIdTest extends AbstractManyToManyAssociationClassTest {
+	public ManyToManyAssociationClassCompositeIdTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "manytomanyassociationclass/compositeid/Mappings.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( ManyToManyAssociationClassCompositeIdTest.class );
+	}
+
+	public Membership createMembership( String name ) {
+		return new MembershipWithCompositeId( name );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/compositeid/ManyToManyAssociationClassCompositeIdTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/compositeid/Mappings.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/compositeid/Mappings.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/compositeid/Mappings.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,66 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+  ~ Hibernate, Relational Persistence for Idiomatic Java
+  ~
+  ~ Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+  ~ indicated by the @author tags or express copyright attribution
+  ~ statements applied by the authors.  All third-party contributions are
+  ~ distributed under license by Red Hat Middleware LLC.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, as published by the Free Software Foundation.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  ~ or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+  ~ for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public License
+  ~ along with this distribution; if not, write to:
+  ~ Free Software Foundation, Inc.
+  ~ 51 Franklin Street, Fifth Floor
+  ~ Boston, MA  02110-1301  USA
+  ~
+  -->
+
+<hibernate-mapping package="org.hibernate.test.manytomanyassociationclass.compositeid">
+
+    <class name="org.hibernate.test.manytomanyassociationclass.User" table="HB_USER">
+		<id name="id" column="ID" type="long">
+            <generator class="native"/>
+        </id>
+        <property name="name" column="NAME" type="string" length="40" not-null="true"/>
+        <set name="memberships" cascade="all, delete-orphan" inverse="true" lazy="true">
+            <key column="USER_ID"/>
+            <one-to-many class="MembershipWithCompositeId"/>
+        </set>
+    </class>
+
+    <class name="org.hibernate.test.manytomanyassociationclass.Group" table="HB_GROUP">
+		<id name="id" column="ID" type="long">
+            <generator class="native"/>
+        </id>
+        <property name="name" column="NAME" type="string" length="40" not-null="true"/>
+        <set name="memberships" cascade="all, delete-orphan" inverse="true" lazy="true">
+            <key column="GROUP_ID"/>
+            <one-to-many class="MembershipWithCompositeId"/>
+        </set>
+    </class>
+
+    <class name="MembershipWithCompositeId" table="HB_MEMBERSHIP">
+        <composite-id name="id"
+             class="MembershipWithCompositeId$Id">
+             <key-property name="userId" type="long" column="USER_ID"/>
+             <key-property name="groupId" type="long" column="GROUP_ID"/>          
+        </composite-id>
+        <property name="name" column="NAME" type="string" length="40" not-null="true"/>
+        <many-to-one column="USER_ID" name="user" class="org.hibernate.test.manytomanyassociationclass.User"
+                not-null="true" insert="false" update="false"/>
+        <many-to-one column="GROUP_ID" name="group" class="org.hibernate.test.manytomanyassociationclass.Group"
+                not-null="true" insert="false" update="false"/>
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/compositeid/Mappings.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/compositeid/MembershipWithCompositeId.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/compositeid/MembershipWithCompositeId.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/compositeid/MembershipWithCompositeId.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,101 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.manytomanyassociationclass.compositeid;
+
+import java.io.Serializable;
+
+import org.hibernate.test.manytomanyassociationclass.Group;
+import org.hibernate.test.manytomanyassociationclass.Membership;
+import org.hibernate.test.manytomanyassociationclass.User;
+
+/**
+ * Models a user's membership in a group.
+ *
+ * @author Gail Badner
+ */
+public class MembershipWithCompositeId extends Membership {
+
+	public static class Id implements Serializable {
+		private Long userId;
+		private Long groupId;
+
+		public Id() {
+		}
+
+		public Id(Long userId, Long groupId) {
+			this.userId = userId;
+			this.groupId = groupId;
+		}
+
+		public Long getUserId() {
+			return userId;
+		}
+
+		public void setUserId(Long userId) {
+			this.userId = userId;
+		}
+
+		public Long getGroupId() {
+			return groupId;
+		}
+
+		public void setGroupId(Long groupId) {
+			this.groupId = groupId;
+		}
+
+		public boolean equals(Object o) {
+			if ( o != null && o instanceof Id ) {
+				Id that = ( Id ) o;
+				return this.userId.equals( that.userId ) &&
+						this.groupId.equals( that.groupId );
+			}
+			else {
+				return false;
+			}
+		}
+
+		public int hashCode() {
+			return userId.hashCode() + groupId.hashCode();
+		}
+	}
+
+	public MembershipWithCompositeId() {
+		super( new Id() );
+	}
+
+	public MembershipWithCompositeId(String name) {
+		super( new Id(), name );
+	}
+
+	public void setGroup(Group group) {
+		( (Id) getId() ).setGroupId( ( group == null ? null : group.getId() ) );
+		super.setGroup( group );
+	}
+
+	public void setUser(User user) {
+		( (Id) getId() ).setUserId( user == null ? null : user.getId() );
+		super.setUser( user );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/compositeid/MembershipWithCompositeId.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/surrogateid/assigned/ManyToManyAssociationClassAssignedIdTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/surrogateid/assigned/ManyToManyAssociationClassAssignedIdTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/surrogateid/assigned/ManyToManyAssociationClassAssignedIdTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,54 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.manytomanyassociationclass.surrogateid.assigned;
+
+import junit.framework.Test;
+
+import org.hibernate.test.manytomanyassociationclass.AbstractManyToManyAssociationClassTest;
+import org.hibernate.test.manytomanyassociationclass.Membership;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Tests on many-to-many association using an association class with a surrogate ID that is assigned.
+ *
+ * @author Gail Badner
+ */
+public class ManyToManyAssociationClassAssignedIdTest extends AbstractManyToManyAssociationClassTest {
+	public ManyToManyAssociationClassAssignedIdTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "manytomanyassociationclass/surrogateid/assigned/Mappings.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( ManyToManyAssociationClassAssignedIdTest.class );
+	}
+
+	public Membership createMembership(String name) {
+		return new Membership( new Long( 1000 ), name );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/surrogateid/assigned/ManyToManyAssociationClassAssignedIdTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/surrogateid/assigned/Mappings.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/surrogateid/assigned/Mappings.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/surrogateid/assigned/Mappings.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,62 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+  ~ Hibernate, Relational Persistence for Idiomatic Java
+  ~
+  ~ Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+  ~ indicated by the @author tags or express copyright attribution
+  ~ statements applied by the authors.  All third-party contributions are
+  ~ distributed under license by Red Hat Middleware LLC.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, as published by the Free Software Foundation.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  ~ or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+  ~ for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public License
+  ~ along with this distribution; if not, write to:
+  ~ Free Software Foundation, Inc.
+  ~ 51 Franklin Street, Fifth Floor
+  ~ Boston, MA  02110-1301  USA
+  ~
+  -->
+
+<hibernate-mapping package="org.hibernate.test.manytomanyassociationclass">
+
+    <class name="User" table="HB_USER">
+		<id name="id" column="ID" type="long">
+            <generator class="native"/>
+        </id>
+        <property name="name" column="NAME" type="string" length="40" not-null="true"/>
+        <set name="memberships" cascade="all, delete-orphan" inverse="true" lazy="true">
+            <key column="USER_ID"/>
+            <one-to-many class="Membership"/>
+        </set>
+    </class>
+
+    <class name="Group" table="HB_GROUP">
+		<id name="id" column="ID" type="long">
+            <generator class="native"/>
+        </id>
+        <property name="name" column="NAME" type="string" length="40" not-null="true"/>
+        <set name="memberships" cascade="all, delete-orphan" inverse="true" lazy="true">
+            <key column="GROUP_ID"/>
+            <one-to-many class="Membership"/>
+        </set>
+    </class>
+
+    <class name="Membership" table="HB_MEMBERSHIP">
+		<id name="id" column="ID" type="long">
+            <generator class="assigned"/>
+        </id>
+        <property name="name" column="NAME" type="string" length="40" not-null="true"/>
+        <many-to-one column="USER_ID" name="user" class="User" not-null="true" unique-key="UK_MEMBERSHIP"/>
+        <many-to-one column="GROUP_ID" name="group" class="Group" not-null="true" unique-key="UK_MEMBERSHIP"/>
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/surrogateid/assigned/Mappings.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/surrogateid/generated/ManyToManyAssociationClassGeneratedIdTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/surrogateid/generated/ManyToManyAssociationClassGeneratedIdTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/surrogateid/generated/ManyToManyAssociationClassGeneratedIdTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,137 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.manytomanyassociationclass.surrogateid.generated;
+
+import java.util.HashSet;
+
+import junit.framework.Test;
+
+import org.hibernate.exception.ConstraintViolationException;
+import org.hibernate.test.manytomanyassociationclass.AbstractManyToManyAssociationClassTest;
+import org.hibernate.test.manytomanyassociationclass.Membership;
+import org.hibernate.Session;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Tests on many-to-many association using an association class with a surrogate ID that is generated.
+ *
+ * @author Gail Badner
+ */
+public class ManyToManyAssociationClassGeneratedIdTest extends AbstractManyToManyAssociationClassTest {
+	public ManyToManyAssociationClassGeneratedIdTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "manytomanyassociationclass/surrogateid/generated/Mappings.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( ManyToManyAssociationClassGeneratedIdTest.class );
+	}
+
+	public Membership createMembership(String name) {
+		return new Membership( name );
+	}
+
+	public void testRemoveAndAddEqualElement() {
+		deleteMembership( getUser(), getGroup(), getMembership() );
+		addMembership( getUser(), getGroup(), createMembership( "membership" ) );
+
+		Session s = openSession();
+		s.beginTransaction();
+		try {
+			// The new membership is transient (it has a null surrogate ID), so
+			// Hibernate assumes that it should be added to the collection.
+			// Inserts are done before deletes, so a ConstraintViolationException
+			// will be thrown on the insert because the unique constraint on the
+			// user and group IDs in the join table is violated. See HHH-2801.
+			s.merge( getUser() );
+			s.getTransaction().commit();
+			fail( "should have failed because inserts are before deletes");
+		}
+		catch( ConstraintViolationException ex ) {
+			// expected
+			s.getTransaction().rollback();
+		}
+		finally {
+			s.close();
+		}
+	}
+
+	public void testRemoveAndAddEqualCollection() {
+		deleteMembership( getUser(), getGroup(), getMembership() );
+		getUser().setMemberships( new HashSet() );
+		getGroup().setMemberships( new HashSet() );
+		addMembership( getUser(), getGroup(), createMembership( "membership" ) );
+
+		Session s = openSession();
+		s.beginTransaction();
+		try {
+			// The new membership is transient (it has a null surrogate ID), so
+			// Hibernate assumes that it should be added to the collection.
+			// Inserts are done before deletes, so a ConstraintViolationException
+			// will be thrown on the insert because the unique constraint on the
+			// user and group IDs in the join table is violated. See HHH-2801.
+			s.merge( getUser() );
+			s.getTransaction().commit();
+			fail( "should have failed because inserts are before deletes");
+		}
+		catch( ConstraintViolationException ex ) {
+			// expected
+			s.getTransaction().rollback();
+		}
+		finally {
+			s.close();
+		}
+	}
+
+	public void testRemoveAndAddEqualElementNonKeyModified() {
+		deleteMembership( getUser(), getGroup(), getMembership() );
+		Membership membershipNew = createMembership( "membership" );
+		addMembership( getUser(), getGroup(), membershipNew );
+		membershipNew.setName( "membership1" );
+
+		Session s = openSession();
+		s.beginTransaction();
+		try {
+			// The new membership is transient (it has a null surrogate ID), so
+			// Hibernate assumes that it should be added to the collection.
+			// Inserts are done before deletes, so a ConstraintViolationException
+			// will be thrown on the insert because the unique constraint on the
+			// user and group IDs in the join table is violated. See HHH-2801.
+			s.merge( getUser() );
+			s.getTransaction().commit();
+			fail( "should have failed because inserts are before deletes");
+		}
+		catch( ConstraintViolationException ex ) {
+			// expected
+			s.getTransaction().rollback();
+		}
+		finally {
+			s.close();
+		}
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/surrogateid/generated/ManyToManyAssociationClassGeneratedIdTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/surrogateid/generated/Mappings.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/surrogateid/generated/Mappings.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/surrogateid/generated/Mappings.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,66 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+  ~ Hibernate, Relational Persistence for Idiomatic Java
+  ~
+  ~ Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+  ~ indicated by the @author tags or express copyright attribution
+  ~ statements applied by the authors.  All third-party contributions are
+  ~ distributed under license by Red Hat Middleware LLC.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, as published by the Free Software Foundation.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  ~ or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+  ~ for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public License
+  ~ along with this distribution; if not, write to:
+  ~ Free Software Foundation, Inc.
+  ~ 51 Franklin Street, Fifth Floor
+  ~ Boston, MA  02110-1301  USA
+  ~
+  -->
+
+<hibernate-mapping package="org.hibernate.test.manytomanyassociationclass">
+
+    <class name="User" table="HB_USER">
+		<id name="id" column="ID" type="long">
+            <generator class="native"/>
+        </id>
+        <property name="name" column="NAME" type="string" length="40" not-null="true"/>
+        <set name="memberships" cascade="all, delete-orphan" inverse="true" lazy="true">
+            <key column="USER_ID"/>
+            <one-to-many class="Membership"/>
+        </set>
+    </class>
+
+    <class name="Group" table="HB_GROUP">
+		<id name="id" column="ID" type="long">
+            <generator class="native"/>
+        </id>
+        <property name="name" column="NAME" type="string" length="40" not-null="true"/>
+        <set name="memberships" cascade="all, delete-orphan" inverse="true" lazy="true">
+            <key column="GROUP_ID"/>
+            <one-to-many class="Membership"/>
+        </set>
+    </class>
+
+    <class name="Membership" table="HB_MEMBERSHIP">
+		<id name="id" column="ID" type="long">
+            <generator class="native"/>
+        </id>
+        <property name="name" column="NAME" type="string" length="40" not-null="true"/>
+        <many-to-one column="USER_ID" name="user"
+            class="User"
+            not-null="true" unique-key="UK_MEMBERSHIP"/>
+        <many-to-one column="GROUP_ID" name="group"
+            class="Group"
+            not-null="true" unique-key="UK_MEMBERSHIP"/>
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/manytomanyassociationclass/surrogateid/generated/Mappings.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/map/Group.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/map/Group.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/map/Group.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,29 @@
+//$Id: Group.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.map;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author Gavin King
+ */
+public class Group {
+	private String name;
+	private Map users = new HashMap();
+	Group() {}
+	public Group(String n) {
+		name = n;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public Map getUsers() {
+		return users;
+	}
+	public void setUsers(Map users) {
+		this.users = users;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/map/Group.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/map/MapIndexFormulaTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/map/MapIndexFormulaTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/map/MapIndexFormulaTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,120 @@
+//$Id: MapIndexFormulaTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.map;
+
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class MapIndexFormulaTest extends FunctionalTestCase {
+	
+	public MapIndexFormulaTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "map/UserGroup.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( MapIndexFormulaTest.class );
+	}
+
+	public void testIndexFunctionOnManyToManyMap() {
+		Session s = openSession();
+		s.beginTransaction();
+		s.createQuery( "from Group g join g.users u where g.name = 'something' and index(u) = 'nada'" )
+				.list();
+		s.createQuery( "from Group g join g.users u where g.name = 'something' and minindex(u) = 'nada'" )
+				.list();
+		s.createQuery( "from Group g join g.users u where g.name = 'something' and maxindex(u) = 'nada'" )
+				.list();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testIndexFormulaMap() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		User gavin = new User("gavin", "secret");
+		User turin = new User("turin", "tiger");
+		Group g = new Group("developers");
+		g.getUsers().put("gavin", gavin);
+		g.getUsers().put("turin", turin);
+		s.persist(g);
+		gavin.getSession().put( "foo", new SessionAttribute("foo", "foo bar baz") );
+		gavin.getSession().put( "bar", new SessionAttribute("bar", "foo bar baz 2") );
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		g = (Group) s.get(Group.class, "developers");
+		assertEquals( g.getUsers().size(), 2 );
+		g.getUsers().remove("turin");
+		Map smap = ( (User) g.getUsers().get("gavin") ).getSession();
+		assertEquals(smap.size(), 2);
+		smap.remove("bar");
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		g = (Group) s.get(Group.class, "developers");
+		assertEquals( g.getUsers().size(), 1 );
+		smap = ( (User) g.getUsers().get("gavin") ).getSession();
+		assertEquals(smap.size(), 1);
+		gavin = (User) g.getUsers().put("gavin", turin);
+		s.delete(gavin);
+		assertEquals( s.createQuery("select count(*) from SessionAttribute").uniqueResult(), new Long(0) );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		g = (Group) s.get(Group.class, "developers");
+		assertEquals( g.getUsers().size(), 1 );
+		turin = (User) g.getUsers().get("turin");
+		smap = turin.getSession();
+		assertEquals(smap.size(), 0);
+		assertEquals( s.createQuery("select count(*) from User").uniqueResult(), new Long(1) );
+		s.delete(g);
+		s.delete(turin);
+		assertEquals( s.createQuery("select count(*) from User").uniqueResult(), new Long(0) );
+		t.commit();
+		s.close();
+	}
+	
+	public void testSQLQuery() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		User gavin = new User("gavin", "secret");
+		User turin = new User("turin", "tiger");
+		gavin.getSession().put( "foo", new SessionAttribute("foo", "foo bar baz") );
+		gavin.getSession().put( "bar", new SessionAttribute("bar", "foo bar baz 2") );
+		s.persist(gavin);
+		s.persist(turin);
+		s.flush();
+		s.clear();
+		List results = s.getNamedQuery("userSessionData").setParameter("uname", "%in").list();
+		assertEquals( results.size(), 2 );
+		gavin = (User) ( (Object[]) results.get(0) )[0];
+		assertEquals( gavin.getName(), "gavin" );
+		assertEquals( gavin.getSession().size(), 2 );
+		s.createQuery("delete SessionAttribute").executeUpdate();
+		s.createQuery("delete User").executeUpdate();
+		t.commit();
+		s.close();
+		
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/map/MapIndexFormulaTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/map/SessionAttribute.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/map/SessionAttribute.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/map/SessionAttribute.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,41 @@
+//$Id: SessionAttribute.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.map;
+
+import java.io.Serializable;
+
+/**
+ * @author Gavin King
+ */
+public class SessionAttribute {
+	private Long id;
+	private String name;
+	private String stringData;
+	private Serializable objectData;
+	SessionAttribute() {}
+	public SessionAttribute(String name, Serializable obj) {
+		this.name = name;
+		this.objectData = obj;
+	}
+	public SessionAttribute(String name, String str) {
+		this.name = name;
+		this.stringData = str;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public Serializable getObjectData() {
+		return objectData;
+	}
+	public void setObjectData(Serializable objectData) {
+		this.objectData = objectData;
+	}
+	public String getStringData() {
+		return stringData;
+	}
+	public void setStringData(String stringData) {
+		this.stringData = stringData;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/map/SessionAttribute.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/map/User.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/map/User.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/map/User.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,37 @@
+//$Id: User.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.map;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author Gavin King
+ */
+public class User {
+	private String name;
+	private String password;
+	private Map session = new HashMap();
+	User() {}
+	public User(String n, String pw) {
+		name=n;
+		password = pw;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public String getPassword() {
+		return password;
+	}
+	public void setPassword(String password) {
+		this.password = password;
+	}
+	public Map getSession() {
+		return session;
+	}
+	public void setSession(Map session) {
+		this.session = session;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/map/User.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/map/UserGroup.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/map/UserGroup.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/map/UserGroup.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,53 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+     
+-->
+
+<hibernate-mapping package="org.hibernate.test.map">
+	
+	<class name="Group" table="groups">
+		<id name="name"/>
+		<map name="users" cascade="persist" table="group_user">
+			<key column="groupName"/>
+			<map-key formula="lower(personName)" type="string"/>
+			<many-to-many column="personName" class="User"/>
+		</map>
+	</class>
+	
+	<class name="User" table="users">
+		<id name="name"/>
+		<property name="password"/>
+		<map name="session" cascade="persist,save-update,delete,delete-orphan">
+			<key column="userName" not-null="true"/>
+			<map-key formula="lower(name)" type="string"/>
+			<one-to-many class="SessionAttribute"/>
+		</map>
+	</class>
+	
+	<class name="SessionAttribute" table="session_attributes">
+		<id name="id" access="field">
+			<generator class="native"/>
+		</id>
+		<property name="name" not-null="true" update="false"/>
+		<property name="stringData"/>
+		<property name="objectData"/>
+	</class>
+	
+	<sql-query name="userSessionData">
+		<return alias="u" class="User"/>
+		<return-join alias="s" property="u.session"/>
+		select 
+			lower(u.name) as {u.name}, lower(u.password) as {u.password}, 
+			lower(s.userName) as {s.key}, lower(s.name) as {s.index}, s.id as {s.element}, 
+			{s.element.*}
+		from users u 
+		join session_attributes s on lower(s.userName) = lower(u.name)
+		where u.name like :uname
+	</sql-query>	
+	
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/map/UserGroup.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapcompelem/Item.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapcompelem/Item.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapcompelem/Item.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,35 @@
+//$Id: Item.java 6236 2005-03-29 03:20:23Z oneovthafew $
+package org.hibernate.test.mapcompelem;
+
+/**
+ * @author Gavin King
+ */
+public class Item {
+
+	private String code;
+	private Product product;
+	
+	
+	Item() {}
+	public Item(String code, Product p) {
+		this.code = code;
+		this.product = p;
+	}
+
+	public String getCode() {
+		return code;
+	}
+	
+	public void setCode(String code) {
+		this.code = code;
+	}
+	
+	public Product getProduct() {
+		return product;
+	}
+	
+	public void setProduct(Product product) {
+		this.product = product;
+	}
+	
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapcompelem/Item.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapcompelem/MapCompositeElementTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapcompelem/MapCompositeElementTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapcompelem/MapCompositeElementTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,116 @@
+//$Id: MapCompositeElementTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.mapcompelem;
+
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class MapCompositeElementTest extends FunctionalTestCase {
+	
+	public MapCompositeElementTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "mapcompelem/ProductPart.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( MapCompositeElementTest.class );
+	}
+	
+	public void testMapCompositeElementWithFormula() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Part top = new Part("top", "The top part");
+		Part bottom = new Part("bottom", "The bottom part");
+		Product prod = new Product("Some Thing");
+		prod.getParts().put("Top", top);
+		prod.getParts().put("Bottom", bottom);
+		s.persist(prod);
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		prod = (Product) s.get(Product.class, "Some Thing");
+		assertEquals( prod.getParts().size(), 2 );
+		prod.getParts().remove("Bottom");
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		prod = (Product) s.get(Product.class, "Some Thing");
+		assertEquals( prod.getParts().size(), 1 );
+		prod.getParts().put("Top", new Part("top", "The brand new top part"));
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		prod = (Product) s.get(Product.class, "Some Thing");
+		assertEquals( prod.getParts().size(), 1 );
+		assertEquals(  ( (Part) prod.getParts().get("Top") ).getDescription(), "The brand new top part");
+		s.delete(prod);
+		t.commit();
+		s.close();
+	}
+	
+	public void testQueryMapCompositeElement() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Part top = new Part("top", "The top part");
+		Part bottom = new Part("bottom", "The bottom part");
+		Product prod = new Product("Some Thing");
+		prod.getParts().put("Top", top);
+		prod.getParts().put("Bottom", bottom);
+		s.persist(prod);
+		
+		Item item = new Item("123456", prod);
+		s.persist(item);
+
+		List list = s.createQuery("select new Part( part.name, part.description ) from Product prod join prod.parts part order by part.name desc").list();
+		assertEquals( list.size(), 2 );
+		assertTrue( list.get(0) instanceof Part );
+		assertTrue( list.get(1) instanceof Part );
+		Part part = (Part) list.get(0);
+		assertEquals( part.getName(), "top" );
+		assertEquals( part.getDescription(), "The top part" );
+		
+		list = s.createQuery("select new Part( part.name, part.description ) from Product prod join prod.parts part where index(part) = 'Top'").list();
+		assertEquals( list.size(), 1 );
+		assertTrue( list.get(0) instanceof Part );
+		part = (Part) list.get(0);
+		assertEquals( part.getName(), "top" );
+		assertEquals( part.getDescription(), "The top part" );
+		
+		list = s.createQuery("from Product p where 'Top' in indices(p.parts)").list();
+		assertEquals( list.size(), 1 );
+		assertSame( list.get(0), prod );
+		
+		list = s.createQuery("select i from Item i join i.product p where 'Top' in indices(p.parts)").list();
+		assertEquals( list.size(), 1 );
+		assertSame( list.get(0), item );
+		
+		list = s.createQuery("from Item i where 'Top' in indices(i.product.parts)").list();
+		assertEquals( list.size(), 1 );
+		assertSame( list.get(0), item );
+		
+		s.delete(item);
+		s.delete(prod);
+		t.commit();
+		s.close();
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapcompelem/MapCompositeElementTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapcompelem/Part.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapcompelem/Part.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapcompelem/Part.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,37 @@
+//$Id: Part.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.mapcompelem;
+
+
+/**
+ * @author Gavin King
+ */
+public class Part {
+	private String name;
+	private String description;
+	Part() {}
+	public Part(String n, String pw) {
+		name=n;
+		description = pw;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public String getDescription() {
+		return description;
+	}
+	public void setDescription(String password) {
+		this.description = password;
+	}
+	public boolean equals(Object that) {
+		return ( (Part) that ).getName().equals(name);
+	}
+	public int hashCode() {
+		return name.hashCode();
+	}
+	public String toString() {
+		return name + ":" + description;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapcompelem/Part.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapcompelem/Product.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapcompelem/Product.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapcompelem/Product.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,29 @@
+//$Id: Product.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.mapcompelem;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author Gavin King
+ */
+public class Product {
+	private String name;
+	private Map parts = new HashMap();
+	Product() {}
+	public Product(String n) {
+		name = n;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public Map getParts() {
+		return parts;
+	}
+	public void setParts(Map users) {
+		this.parts = users;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapcompelem/Product.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapcompelem/ProductPart.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapcompelem/ProductPart.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapcompelem/ProductPart.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+     
+-->
+
+<hibernate-mapping package="org.hibernate.test.mapcompelem">
+	
+	<import class="Part"/>
+
+	<class name="Product" table="Products">
+		<id name="name" column="productName"/>
+		<map name="parts" table="Parts">
+			<key column="productName"/>
+			<map-key column="partName" type="string"/>
+			<composite-element class="Part">
+				<property name="name" formula="lower(partName)"/>
+				<property name="description" column="partDescription"/>
+			</composite-element>
+		</map>
+	</class>
+	
+	<class name="Item" table="Items">
+		<id name="code"/>
+		<many-to-one name="product" column="productName"/>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapcompelem/ProductPart.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapelemformula/Group.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapelemformula/Group.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapelemformula/Group.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,29 @@
+//$Id: Group.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.mapelemformula;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author Gavin King
+ */
+public class Group {
+	private String name;
+	private Map users = new HashMap();
+	Group() {}
+	public Group(String n) {
+		name = n;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public Map getUsers() {
+		return users;
+	}
+	public void setUsers(Map users) {
+		this.users = users;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapelemformula/Group.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapelemformula/MapElementFormulaTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapelemformula/MapElementFormulaTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapelemformula/MapElementFormulaTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,60 @@
+//$Id: MapElementFormulaTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.mapelemformula;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class MapElementFormulaTest extends FunctionalTestCase {
+	
+	public MapElementFormulaTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "mapelemformula/UserGroup.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( MapElementFormulaTest.class );
+	}
+
+	public void testManyToManyFormula() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		User gavin = new User("gavin", "secret");
+		User turin = new User("turin", "tiger");
+		Group g = new Group("users");
+		g.getUsers().put("Gavin", gavin);
+		g.getUsers().put("Turin", turin);
+		s.persist(g);
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		g = (Group) s.get(Group.class, "users");
+		assertEquals( g.getUsers().size(), 2 );
+		g.getUsers().remove("Turin");
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		g = (Group) s.get(Group.class, "users");
+		assertEquals( g.getUsers().size(), 1 );
+		s.delete(g);
+		s.delete( g.getUsers().get("Gavin") );
+		s.delete( s.get(User.class, "turin") );
+		t.commit();
+		s.close();
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapelemformula/MapElementFormulaTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapelemformula/User.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapelemformula/User.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapelemformula/User.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,28 @@
+//$Id: User.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.mapelemformula;
+
+
+/**
+ * @author Gavin King
+ */
+public class User {
+	private String name;
+	private String password;
+	User() {}
+	public User(String n, String pw) {
+		name=n;
+		password = pw;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public String getPassword() {
+		return password;
+	}
+	public void setPassword(String password) {
+		this.password = password;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapelemformula/User.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapelemformula/UserGroup.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapelemformula/UserGroup.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapelemformula/UserGroup.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+     
+-->
+
+<hibernate-mapping package="org.hibernate.test.mapelemformula">
+	
+	<class name="Group" table="groups">
+		<id name="name"/>
+		<map name="users" cascade="persist" table="group_user">
+			<key column="groupName"/>
+			<map-key column="personName" type="string"/>
+			<many-to-many formula="lower(personName)" class="User" fetch="select"/>
+		</map>
+	</class>
+	
+	<class name="User" table="users">
+		<id name="name"/>
+		<property name="password" column="`password`"/>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapelemformula/UserGroup.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapping/PersistentClassVisitorTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapping/PersistentClassVisitorTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapping/PersistentClassVisitorTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,78 @@
+/*
+* Created on 06-Dec-2004
+*
+*/
+package org.hibernate.test.mapping;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.hibernate.mapping.JoinedSubclass;
+import org.hibernate.mapping.PersistentClassVisitor;
+import org.hibernate.mapping.RootClass;
+import org.hibernate.mapping.SingleTableSubclass;
+import org.hibernate.mapping.Subclass;
+import org.hibernate.mapping.UnionSubclass;
+import org.hibernate.testing.junit.UnitTestCase;
+
+/**
+ * @author max
+ * 
+ */
+public class PersistentClassVisitorTest extends UnitTestCase {
+
+	public PersistentClassVisitorTest(String string) {
+		super( string );
+	}
+
+	static public class PersistentClassVisitorValidator implements PersistentClassVisitor {
+
+		private Object validate(Class expectedClass, Object visitee) {
+			if (!visitee.getClass().getName().equals(expectedClass.getName())) {
+				throw new IllegalStateException(visitee.getClass().getName()
+						+ " did not call proper accept method. Was "
+						+ expectedClass.getName());
+			}
+			return null;
+		}
+
+		public Object accept(RootClass class1) {
+			return validate(RootClass.class, class1);
+		}
+
+		public Object accept(UnionSubclass subclass) {
+			return validate(UnionSubclass.class, subclass);
+		}
+
+		public Object accept(SingleTableSubclass subclass) {
+			return validate(SingleTableSubclass.class, subclass);
+		}
+
+		public Object accept(JoinedSubclass subclass) {
+			return validate(JoinedSubclass.class, subclass);
+		}
+
+		public Object accept(Subclass subclass) {
+			return validate(Subclass.class, subclass);
+		}
+
+
+	};
+
+	public void testProperCallbacks() {
+
+		PersistentClassVisitorValidator vv = new PersistentClassVisitorValidator();
+
+		new RootClass().accept(vv);
+		new Subclass(new RootClass()).accept(vv);
+		new JoinedSubclass(new RootClass()).accept(vv);
+		new SingleTableSubclass(new RootClass()).accept(vv);
+		new UnionSubclass(new RootClass()).accept(vv);
+
+	}
+
+	public static Test suite() {
+		return new TestSuite(PersistentClassVisitorTest.class);
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapping/PersistentClassVisitorTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapping/ValueVisitorTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapping/ValueVisitorTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapping/ValueVisitorTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,204 @@
+/*
+ * Created on 06-Dec-2004
+ *
+ */
+package org.hibernate.test.mapping;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Mappings;
+import org.hibernate.mapping.Any;
+import org.hibernate.mapping.Array;
+import org.hibernate.mapping.Bag;
+import org.hibernate.mapping.Component;
+import org.hibernate.mapping.DependantValue;
+import org.hibernate.mapping.IdentifierBag;
+import org.hibernate.mapping.List;
+import org.hibernate.mapping.ManyToOne;
+import org.hibernate.mapping.Map;
+import org.hibernate.mapping.OneToMany;
+import org.hibernate.mapping.OneToOne;
+import org.hibernate.mapping.PrimitiveArray;
+import org.hibernate.mapping.RootClass;
+import org.hibernate.mapping.Set;
+import org.hibernate.mapping.SimpleValue;
+import org.hibernate.mapping.Table;
+import org.hibernate.mapping.ValueVisitor;
+import org.hibernate.testing.junit.UnitTestCase;
+
+/**
+ * @author max
+ * 
+ */
+public class ValueVisitorTest extends UnitTestCase {
+
+	public ValueVisitorTest(String string) {
+		super( string );
+	}
+
+	static public class ValueVisitorValidator implements ValueVisitor {
+
+		/* (non-Javadoc)
+		 * @see org.hibernate.mapping.ValueVisitor#accept(org.hibernate.mapping.PrimitiveArray)
+		 */
+		public Object accept(PrimitiveArray primitiveArray) {
+			return validate(PrimitiveArray.class,primitiveArray);
+		}
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.hibernate.mapping.ValueVisitor#accept(org.hibernate.mapping.Bag)
+		 */
+		public Object accept(Bag bag) {
+			return validate(Bag.class, bag);
+		}
+
+		/* (non-Javadoc)
+		 * @see org.hibernate.mapping.ValueVisitor#accept(org.hibernate.mapping.DependantValue)
+		 */
+		public Object accept(DependantValue value) {
+			return validate(DependantValue.class, value);
+		}
+		/**
+		 * @param expectedClass
+		 * @param visitee
+		 */
+		private Object validate(Class expectedClass, Object visitee) {
+			if (!visitee.getClass().getName().equals(expectedClass.getName())) {
+				throw new IllegalStateException(visitee.getClass().getName()
+						+ " did not call proper accept method. Was "
+						+ expectedClass.getName());
+			}
+			return null;
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.hibernate.mapping.ValueVisitor#accept(org.hibernate.mapping.IdentifierBag)
+		 */
+		public Object accept(IdentifierBag bag) {
+			return validate(IdentifierBag.class, bag);
+
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.hibernate.mapping.ValueVisitor#accept(org.hibernate.mapping.List)
+		 */
+		public Object accept(List list) {
+			return validate(List.class, list);
+
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.hibernate.mapping.ValueVisitor#accept(org.hibernate.mapping.Map)
+		 */
+		public Object accept(Map map) {
+			return validate(Map.class, map);
+
+		}
+
+		/* (non-Javadoc)
+		 * @see org.hibernate.mapping.ValueVisitor#accept(org.hibernate.mapping.Array)
+		 */
+		public Object accept(Array list) {
+			return validate(Array.class, list);
+		}
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.hibernate.mapping.ValueVisitor#accept(org.hibernate.mapping.OneToMany)
+		 */
+		public Object accept(OneToMany many) {
+			return validate(OneToMany.class, many);
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.hibernate.mapping.ValueVisitor#accept(org.hibernate.mapping.Set)
+		 */
+		public Object accept(Set set) {
+			return validate(Set.class, set);
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.hibernate.mapping.ValueVisitor#accept(org.hibernate.mapping.Any)
+		 */
+		public Object accept(Any any) {
+			return validate(Any.class, any);
+			
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.hibernate.mapping.ValueVisitor#accept(org.hibernate.mapping.SimpleValue)
+		 */
+		public Object accept(SimpleValue value) {
+			return validate(SimpleValue.class, value);
+
+		}
+
+		/* (non-Javadoc)
+		 * @see org.hibernate.mapping.ValueVisitor#accept(org.hibernate.mapping.Component)
+		 */
+		public Object accept(Component component) {
+			return validate(Component.class, component);
+		}
+
+		/* (non-Javadoc)
+		 * @see org.hibernate.mapping.ValueVisitor#accept(org.hibernate.mapping.ManyToOne)
+		 */
+		public Object accept(ManyToOne mto) {
+			return validate(ManyToOne.class, mto);
+		}
+
+		/* (non-Javadoc)
+		 * @see org.hibernate.mapping.ValueVisitor#accept(org.hibernate.mapping.OneToOne)
+		 */
+		public Object accept(OneToOne oto) {
+			return validate(OneToOne.class, oto);
+		}
+
+	};
+
+	public void testProperCallbacks() {
+		final Mappings mappings = new Configuration().createMappings();
+		final Table tbl = new Table();
+		final RootClass rootClass = new RootClass();
+
+		ValueVisitor vv = new ValueVisitorValidator();
+		
+		new Any( mappings, tbl ).accept(vv);
+		new Array( mappings, rootClass ).accept(vv);
+		new Bag( mappings, rootClass ).accept(vv);
+		new Component( mappings, rootClass ).accept(vv);
+		new DependantValue( mappings, tbl, null ).accept(vv);
+		new IdentifierBag( mappings, rootClass ).accept(vv);
+		new List( mappings, rootClass ).accept(vv);
+		new ManyToOne( mappings, tbl ).accept(vv);
+		new Map( mappings, rootClass ).accept(vv);
+		new OneToMany( mappings, rootClass ).accept(vv);
+		new OneToOne( mappings, tbl, rootClass ).accept(vv);
+		new PrimitiveArray( mappings, rootClass ).accept(vv);
+		new Set( mappings, rootClass ).accept(vv);
+		new SimpleValue( mappings ).accept(vv);
+	
+		
+	}
+
+	public static Test suite() {
+		return new TestSuite(ValueVisitorTest.class);
+	}
+
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mapping/ValueVisitorTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mappingexception/InvalidMapping.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mappingexception/InvalidMapping.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mappingexception/InvalidMapping.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+This File Intentionally Left Blank
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mappingexception/InvalidMapping.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mappingexception/InvalidMapping.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mappingexception/InvalidMapping.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mappingexception/InvalidMapping.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,5 @@
+package org.hibernate.test.mappingexception;
+
+public class InvalidMapping {
+// This Class Intentionally Left Blank
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mappingexception/InvalidMapping.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mappingexception/MappingExceptionTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mappingexception/MappingExceptionTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mappingexception/MappingExceptionTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,253 @@
+// $Id: SQLExceptionConversionTest.java 6847 2005-05-21 15:46:41Z oneovthafew $
+package org.hibernate.test.mappingexception;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.hibernate.DuplicateMappingException;
+import org.hibernate.Hibernate;
+import org.hibernate.InvalidMappingException;
+import org.hibernate.MappingException;
+import org.hibernate.MappingNotFoundException;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.testing.junit.UnitTestCase;
+import org.hibernate.util.ConfigHelper;
+
+/**
+ * Test for various mapping exceptions thrown when mappings are not found or invalid.
+ *
+ * @author Max Rydahl Andersen
+ */
+public class MappingExceptionTest extends UnitTestCase {
+
+	public MappingExceptionTest(String name) {
+		super( name );
+	}
+
+	public static Test suite() {
+		return new TestSuite( MappingExceptionTest.class );
+	}
+
+	public void testNotFound() throws MappingException, MalformedURLException {
+		Configuration cfg = new Configuration();
+
+		try {
+			cfg.addCacheableFile( "completelybogus.hbm.xml" );
+			fail();
+		}
+		catch ( MappingNotFoundException e ) {
+			assertEquals( e.getType(), "file" );
+			assertEquals( e.getPath(), "completelybogus.hbm.xml" );
+		}
+
+		try {
+			cfg.addCacheableFile( new File( "completelybogus.hbm.xml" ) );
+			fail();
+		}
+		catch ( MappingNotFoundException e ) {
+			assertEquals( e.getType(), "file" );
+			assertEquals( e.getPath(), "completelybogus.hbm.xml" );
+		}
+
+		try {
+			cfg.addClass( Hibernate.class ); // TODO: String.class result in npe, because no classloader exists for it
+			fail();
+		}
+		catch ( MappingNotFoundException inv ) {
+			assertEquals( inv.getType(), "resource" );
+			assertEquals( inv.getPath(), "org/hibernate/Hibernate.hbm.xml" );
+		}
+
+		try {
+			cfg.addFile( "completelybogus.hbm.xml" );
+			fail();
+		}
+		catch ( MappingNotFoundException e ) {
+			assertEquals( e.getType(), "file" );
+			assertEquals( e.getPath(), "completelybogus.hbm.xml" );
+		}
+
+		try {
+			cfg.addFile( new File( "completelybogus.hbm.xml" ) );
+			fail();
+		}
+		catch ( MappingNotFoundException inv ) {
+			assertEquals( inv.getType(), "file" );
+			assertEquals( inv.getPath(), "completelybogus.hbm.xml" );
+		}
+
+		try {
+			cfg.addInputStream( new ByteArrayInputStream( new byte[0] ) );
+			fail();
+		}
+		catch ( InvalidMappingException inv ) {
+			assertEquals( inv.getType(), "input stream" );
+			assertEquals( inv.getPath(), null );
+		}
+
+		try {
+			cfg.addResource( "nothere" );
+			fail();
+		}
+		catch ( MappingNotFoundException inv ) {
+			assertEquals( inv.getType(), "resource" );
+			assertEquals( inv.getPath(), "nothere" );
+		}
+
+		try {
+			cfg.addResource( "nothere", getClass().getClassLoader() );
+			fail();
+		}
+		catch ( MappingNotFoundException inv ) {
+			assertEquals( inv.getType(), "resource" );
+			assertEquals( inv.getPath(), "nothere" );
+		}
+
+		try {
+			cfg.addURL( new URL( "file://nothere" ) );
+			fail();
+		}
+		catch ( InvalidMappingException inv ) {
+			assertEquals( inv.getType(), "URL" );
+			assertEquals( inv.getPath(), "file://nothere" );
+		}
+	}
+
+	public void testDuplicateMapping() {
+		String resourceName = "org/hibernate/test/mappingexception/User.hbm.xml";
+		Configuration cfg = new Configuration();
+		cfg.addResource( resourceName );
+		try {
+			cfg.addResource( resourceName );
+			fail();
+		}
+		catch ( InvalidMappingException inv ) {
+			assertEquals( inv.getType(), "resource" );
+			assertEquals( inv.getPath(), resourceName );
+			assertClassAssignability( inv.getCause().getClass(), DuplicateMappingException.class );
+		}
+	}
+
+	public void testInvalidMapping() throws MappingException, IOException {
+		String resourceName = "org/hibernate/test/mappingexception/InvalidMapping.hbm.xml";
+		File file = File.createTempFile( "TempInvalidMapping", ".hbm.xml" );
+		file.deleteOnExit();
+		copy( ConfigHelper.getConfigStream( resourceName ), file );
+
+		Configuration cfg = new Configuration();
+		try {
+			cfg.addCacheableFile( file.getAbsolutePath() );
+			fail();
+		}
+		catch ( InvalidMappingException inv ) {
+			assertEquals( inv.getType(), "file" );
+			assertNotNull( inv.getPath() );
+			assertTrue( inv.getPath().endsWith( ".hbm.xml" ) );
+			assertTrue( !( inv.getCause() instanceof MappingNotFoundException ) );
+		}
+
+		try {
+			cfg.addCacheableFile( file );
+			fail();
+		}
+		catch ( InvalidMappingException inv ) {
+			assertEquals( inv.getType(), "file" );
+			assertNotNull( inv.getPath() );
+			assertTrue( inv.getPath().endsWith( ".hbm.xml" ) );
+			assertTrue( !( inv.getCause() instanceof MappingNotFoundException ) );
+		}
+
+		try {
+			cfg.addClass( InvalidMapping.class );
+			fail();
+		}
+		catch ( InvalidMappingException inv ) {
+			assertEquals( inv.getType(), "resource" );
+			assertEquals( inv.getPath(), "org/hibernate/test/mappingexception/InvalidMapping.hbm.xml" );
+			assertTrue( !( inv.getCause() instanceof MappingNotFoundException ) );
+		}
+
+		try {
+			cfg.addFile( file.getAbsolutePath() );
+			fail();
+		}
+		catch ( InvalidMappingException inv ) {
+			assertEquals( inv.getType(), "file" );
+			assertEquals( inv.getPath(), file.getPath() );
+			assertTrue( !( inv.getCause() instanceof MappingNotFoundException ) );
+		}
+
+		try {
+			cfg.addFile( file );
+			fail();
+		}
+		catch ( InvalidMappingException inv ) {
+			assertEquals( inv.getType(), "file" );
+			assertEquals( inv.getPath(), file.getPath() );
+			assertTrue( !( inv.getCause() instanceof MappingNotFoundException ) );
+		}
+
+
+		try {
+			cfg.addInputStream( ConfigHelper.getResourceAsStream( resourceName ) );
+			fail();
+		}
+		catch ( InvalidMappingException inv ) {
+			assertEquals( inv.getType(), "input stream" );
+			assertEquals( inv.getPath(), null );
+			assertTrue( !( inv.getCause() instanceof MappingNotFoundException ) );
+		}
+
+		try {
+			cfg.addResource( resourceName );
+			fail();
+		}
+		catch ( InvalidMappingException inv ) {
+			assertEquals( inv.getType(), "resource" );
+			assertEquals( inv.getPath(), resourceName );
+			assertTrue( !( inv.getCause() instanceof MappingNotFoundException ) );
+		}
+
+		try {
+			cfg.addResource( resourceName, getClass().getClassLoader() );
+			fail();
+		}
+		catch ( InvalidMappingException inv ) {
+			assertEquals( inv.getType(), "resource" );
+			assertEquals( inv.getPath(), resourceName );
+			assertTrue( !( inv.getCause() instanceof MappingNotFoundException ) );
+		}
+
+		try {
+			cfg.addURL( ConfigHelper.findAsResource( resourceName ) );
+			fail();
+		}
+		catch ( InvalidMappingException inv ) {
+			assertEquals( inv.getType(), "URL" );
+			assertTrue( inv.getPath().endsWith( "InvalidMapping.hbm.xml" ) );
+			assertTrue( !( inv.getCause() instanceof MappingNotFoundException ) );
+		}
+	}
+
+	void copy(InputStream in, File dst) throws IOException {
+		OutputStream out = new FileOutputStream( dst );
+
+		// Transfer bytes from in to out
+		byte[] buf = new byte[1024];
+		int len;
+		while ( ( len = in.read( buf ) ) > 0 ) {
+			out.write( buf, 0, len );
+		}
+		in.close();
+		out.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mappingexception/MappingExceptionTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mappingexception/User.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mappingexception/User.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mappingexception/User.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<hibernate-mapping package="org.hibernate.test.exception" >
+	<class name="User" table="T_USER" >
+		<id name="id" unsaved-value="null" column="user_id" >
+			<generator class="native"/>
+		</id>
+		<property name="username" type="string" column="user_name" />		
+	</class>
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mappingexception/User.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mappingexception/User.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mappingexception/User.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mappingexception/User.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,31 @@
+// $Id: User.java 4746 2004-11-11 20:57:28Z steveebersole $
+package org.hibernate.test.mappingexception;
+
+import java.util.Set;
+import java.util.HashSet;
+
+/**
+ * 
+ *
+ * @author Max Rydahl Andersen
+ */
+public class User {
+	private Long id;
+	private String username;
+	
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getUsername() {
+		return username;
+	}
+
+	public void setUsername(String username) {
+		this.username = username;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mappingexception/User.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mixed/Document.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mixed/Document.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mixed/Document.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,83 @@
+//$Id: Document.java 8670 2005-11-25 17:36:29Z epbernard $
+
+package org.hibernate.test.mixed;
+
+
+import java.sql.Blob;
+import java.util.Calendar;
+
+
+/**
+ * @author Gavin King
+ */
+
+public class Document extends Item {
+
+	private Blob content;
+
+	private Calendar modified;
+
+	private Calendar created;
+
+	/**
+	 * @return Returns the created.
+	 */
+
+	public Calendar getCreated() {
+
+		return created;
+
+	}
+
+	/**
+	 * @param created The created to set.
+	 */
+
+	public void setCreated(Calendar created) {
+
+		this.created = created;
+
+	}
+
+	/**
+	 * @return Returns the modified.
+	 */
+
+	public Calendar getModified() {
+
+		return modified;
+
+	}
+
+	/**
+	 * @param modified The modified to set.
+	 */
+
+	public void setModified(Calendar modified) {
+
+		this.modified = modified;
+
+	}
+
+	/**
+	 * @return Returns the content.
+	 */
+
+	public Blob getContent() {
+
+		return content;
+
+	}
+
+	/**
+	 * @param content The content to set.
+	 */
+
+	public void setContent(Blob content) {
+
+		this.content = content;
+
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mixed/Document.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mixed/DocumentInterceptor.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mixed/DocumentInterceptor.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mixed/DocumentInterceptor.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,116 @@
+//$Id: DocumentInterceptor.java 8670 2005-11-25 17:36:29Z epbernard $
+package org.hibernate.test.mixed;
+
+import java.io.Serializable;
+import java.util.Calendar;
+import java.util.Iterator;
+
+import org.hibernate.CallbackException;
+import org.hibernate.EntityMode;
+import org.hibernate.Interceptor;
+import org.hibernate.Transaction;
+import org.hibernate.type.Type;
+
+/**
+ * @author Gavin King
+ */
+public class DocumentInterceptor implements Interceptor {
+
+
+	public boolean onLoad(
+			Object entity, Serializable id, Object[] state,
+			String[] propertyNames, Type[] types
+	) throws CallbackException {
+		return false;
+	}
+
+	public boolean onFlushDirty(
+			Object entity, Serializable id,
+			Object[] currentState, Object[] previousState,
+			String[] propertyNames, Type[] types
+	) throws CallbackException {
+		if ( entity instanceof Document ) {
+			currentState[3] = Calendar.getInstance();
+			return true;
+		}
+		else {
+			return false;
+		}
+	}
+
+	public boolean onSave(
+			Object entity, Serializable id, Object[] state,
+			String[] propertyNames, Type[] types
+	) throws CallbackException {
+		if ( entity instanceof Document ) {
+			state[4] = state[3] = Calendar.getInstance();
+			return true;
+		}
+		else {
+			return false;
+		}
+	}
+
+	public void onDelete(
+			Object entity, Serializable id, Object[] state,
+			String[] propertyNames, Type[] types
+	) throws CallbackException {
+
+	}
+
+	public void preFlush(Iterator entities) throws CallbackException {
+
+	}
+
+	public void postFlush(Iterator entities) throws CallbackException {
+
+	}
+
+	public Boolean isTransient(Object entity) {
+		return null;
+	}
+
+	public int[] findDirty(
+			Object entity, Serializable id,
+			Object[] currentState, Object[] previousState,
+			String[] propertyNames, Type[] types
+	) {
+		return null;
+	}
+
+	public Object instantiate(String entityName, EntityMode entityMode, Serializable id) throws CallbackException {
+		return null;
+	}
+
+	public String getEntityName(Object object) throws CallbackException {
+		return null;
+	}
+
+	public Object getEntity(String entityName, Serializable id)
+			throws CallbackException {
+		return null;
+	}
+
+	public void afterTransactionBegin(Transaction tx) {
+	}
+
+	public void afterTransactionCompletion(Transaction tx) {
+	}
+
+	public void beforeTransactionCompletion(Transaction tx) {
+	}
+
+	public String onPrepareStatement(String sql) {
+		return sql;
+	}
+
+	public void onCollectionRecreate(Object collection, Serializable key) throws CallbackException {
+	}
+
+	public void onCollectionRemove(Object collection, Serializable key) throws CallbackException {
+	}
+
+	public void onCollectionUpdate(Object collection, Serializable key) throws CallbackException {
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mixed/DocumentInterceptor.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mixed/Folder.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mixed/Folder.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mixed/Folder.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,13 @@
+//$Id: Folder.java 8670 2005-11-25 17:36:29Z epbernard $
+
+package org.hibernate.test.mixed;
+
+
+/**
+ * @author Gavin King
+ */
+
+public class Folder extends Item {
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mixed/Folder.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mixed/Item.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mixed/Item.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mixed/Item.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,135 @@
+<?xml version="1.0"?>
+
+<!DOCTYPE hibernate-mapping PUBLIC
+
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+
+<!--
+
+
+
+  This mapping demonstrates a mixed inheritance strategy,
+
+  with one subclass acting like a joined-subclass via
+
+  use of a <join>. Also notice the fields which are initialized 
+
+  by an interceptor.
+
+  
+
+-->
+
+
+<hibernate-mapping
+
+        package="org.hibernate.test.mixed">
+
+
+    <class name="Item"
+
+           table="Files"
+
+           discriminator-value="I">
+
+
+        <id name="id">
+
+            <generator class="native"/>
+
+        </id>
+
+
+        <discriminator type="character"
+
+                       column="itemType"/>
+
+
+        <property name="name">
+
+            <column name="name"
+
+                    not-null="true"
+
+                    />
+            <!--unique-key="folder-parent"-->
+
+        </property>
+
+
+        <many-to-one name="parent"
+
+                     class="Folder">
+
+            <column name="parentFolderId"
+
+                    />
+            <!--unique-key="folder-parent"-->
+
+        </many-to-one>
+
+
+        <subclass name="Document"
+
+                  discriminator-value="D"
+
+                  lazy="true"
+
+                  dynamic-update="true">
+
+
+            <property name="content"/>
+
+
+            <!-- managed by DocumentInterceptor -->
+
+            <property name="modified"/>
+
+            <property name="created"/>
+
+
+            <subclass name="SecureDocument"
+
+                      discriminator-value="S"
+
+                      dynamic-update="true"
+
+                      lazy="true">
+
+
+                <join table="SecureDocument">
+
+
+                    <key column="documentId"/>
+
+
+                    <property name="permissionBits"
+
+                              not-null="true"/>
+
+                    <property name="owner"
+
+                              not-null="true"/>
+
+
+                </join>
+
+
+            </subclass>
+
+
+        </subclass>
+
+
+        <subclass name="Folder"
+
+                  discriminator-value="F"/>
+
+
+    </class>
+
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mixed/Item.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mixed/Item.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mixed/Item.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mixed/Item.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,79 @@
+//$Id: Item.java 8670 2005-11-25 17:36:29Z epbernard $
+
+package org.hibernate.test.mixed;
+
+
+/**
+ * @author Gavin King
+ */
+
+public abstract class Item {
+
+	private Long id;
+
+	private String name;
+
+	private Folder parent;
+
+	/**
+	 * @return Returns the parent.
+	 */
+
+	public Folder getParent() {
+
+		return parent;
+
+	}
+
+	/**
+	 * @param parent The parent to set.
+	 */
+
+	public void setParent(Folder parent) {
+
+		this.parent = parent;
+
+	}
+
+	/**
+	 * @return Returns the id.
+	 */
+
+	public Long getId() {
+
+		return id;
+
+	}
+
+	/**
+	 * @param id The id to set.
+	 */
+
+	public void setId(Long id) {
+
+		this.id = id;
+
+	}
+
+	/**
+	 * @return Returns the name.
+	 */
+
+	public String getName() {
+
+		return name;
+
+	}
+
+	/**
+	 * @param name The name to set.
+	 */
+
+	public void setName(String name) {
+
+		this.name = name;
+
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mixed/Item.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mixed/MixedTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mixed/MixedTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mixed/MixedTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,134 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.mixed;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class MixedTest extends FunctionalTestCase {
+
+	public MixedTest(String str) {
+		super( str );
+	}
+
+	public String[] getMappings() {
+		return new String[]{"mixed/Item.hbm.xml"};
+	}
+
+	public String getCacheConcurrencyStrategy() {
+		return null;
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( MixedTest.class );
+	}
+
+	public void testMixedInheritance() {
+		Session s = openSession( new DocumentInterceptor() );
+		Transaction t = s.beginTransaction();
+		Folder f = new Folder();
+		f.setName( "/" );
+		s.save( f );
+
+		Document d = new Document();
+		d.setName( "Hibernate in Action" );
+		d.setContent( s.getLobHelper().createBlob( "blah blah blah".getBytes() ) );
+		d.setParent( f );
+		Long did = (Long) s.save( d );
+
+		SecureDocument d2 = new SecureDocument();
+		d2.setName( "Secret" );
+		d2.setContent( s.getLobHelper().createBlob( "wxyz wxyz".getBytes() ) );
+		// SybaseASE15Dialect only allows 7-bits in a byte to be inserted into a tinyint 
+		// column (0 <= val < 128)
+		d2.setPermissionBits( (byte) 127 );
+		d2.setOwner( "gavin" );
+		d2.setParent( f );
+		Long d2id = (Long) s.save( d2 );
+
+		t.commit();
+		s.close();
+
+		if ( ! getDialect().supportsExpectedLobUsagePattern() ) {
+			reportSkip( "database/driver does not support expected LOB usage pattern", "LOB support" );
+			return;
+		}
+
+		s = openSession( new DocumentInterceptor() );
+		t = s.beginTransaction();
+		Item id = (Item) s.load( Item.class, did );
+		assertEquals( did, id.getId() );
+		assertEquals( "Hibernate in Action", id.getName() );
+		assertEquals( "/", id.getParent().getName() );
+
+		Item id2 = (Item) s.load( Item.class, d2id );
+		assertEquals( d2id, id2.getId() );
+		assertEquals( "Secret", id2.getName() );
+		assertEquals( "/", id2.getParent().getName() );
+
+		id.setName( "HiA" );
+
+		d2 = (SecureDocument) s.load( SecureDocument.class, d2id );
+		d2.setOwner( "max" );
+
+		s.flush();
+
+		s.clear();
+
+		d = (Document) s.load( Document.class, did );
+		assertEquals( did, d.getId() );
+		assertEquals( "HiA", d.getName() );
+		assertNotNull( d.getContent() );
+		assertEquals( "/", d.getParent().getName() );
+		assertNotNull( d.getCreated() );
+		assertNotNull( d.getModified() );
+
+		d2 = (SecureDocument) s.load( SecureDocument.class, d2id );
+		assertEquals( d2id, d2.getId() );
+		assertEquals( "Secret", d2.getName() );
+		assertNotNull( d2.getContent() );
+		assertEquals( "max", d2.getOwner() );
+		assertEquals( "/", d2.getParent().getName() );
+		// SybaseASE15Dialect only allows 7-bits in a byte to be inserted into a tinyint 
+		// column (0 <= val < 128)
+		assertEquals( (byte) 127, d2.getPermissionBits() );
+		assertNotNull( d2.getCreated() );
+		assertNotNull( d2.getModified() );
+
+		s.delete( d.getParent() );
+		s.delete( d );
+		s.delete( d2 );
+
+		t.commit();
+		s.close();
+	}
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mixed/MixedTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mixed/SecureDocument.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mixed/SecureDocument.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mixed/SecureDocument.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,57 @@
+//$Id: SecureDocument.java 8670 2005-11-25 17:36:29Z epbernard $
+
+package org.hibernate.test.mixed;
+
+
+/**
+ * @author Gavin King
+ */
+
+public class SecureDocument extends Document {
+
+	private byte permissionBits;
+
+	private String owner;
+
+	/**
+	 * @return Returns the owner.
+	 */
+
+	public String getOwner() {
+
+		return owner;
+
+	}
+
+	/**
+	 * @param owner The owner to set.
+	 */
+
+	public void setOwner(String owner) {
+
+		this.owner = owner;
+
+	}
+
+	/**
+	 * @return Returns the permissionBits.
+	 */
+
+	public byte getPermissionBits() {
+
+		return permissionBits;
+
+	}
+
+	/**
+	 * @param permissionBits The permissionBits to set.
+	 */
+
+	public void setPermissionBits(byte permissionBits) {
+
+		this.permissionBits = permissionBits;
+
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/mixed/SecureDocument.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/namingstrategy/Customers.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/namingstrategy/Customers.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/namingstrategy/Customers.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping
+        package="org.hibernate.test.namingstrategy">
+    <class name="Customers">
+        <id name="id" column="id" type="int"/>
+        <property name="specified_column" column="specified_column"/>
+    </class>
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/namingstrategy/Customers.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/namingstrategy/Customers.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/namingstrategy/Customers.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/namingstrategy/Customers.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,25 @@
+package org.hibernate.test.namingstrategy;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Customers implements java.io.Serializable {
+	private int id;
+	private String specified_column;
+
+	public int getId() {
+		return id;
+	}
+
+	public void setId(int id) {
+		this.id = id;
+	}
+
+	public String getSpecified_column() {
+		return specified_column;
+	}
+
+	public void setSpecified_column(String specified_column) {
+		this.specified_column = specified_column;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/namingstrategy/Customers.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/namingstrategy/NamingStrategyTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/namingstrategy/NamingStrategyTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/namingstrategy/NamingStrategyTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,33 @@
+package org.hibernate.test.namingstrategy;
+
+import org.hibernate.cfg.Configuration;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.mapping.Column;
+import org.hibernate.mapping.PersistentClass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class NamingStrategyTest extends FunctionalTestCase {
+	public void testCorrectDatabase() {
+		PersistentClass classMapping = getCfg().getClassMapping( Customers.class.getName() );
+		Column stateColumn = (Column) classMapping.getProperty( "specified_column" ).getColumnIterator().next();
+		assertEquals( "CN_specified_column", stateColumn.getName() );
+	}
+
+	@Override
+	public void configure(Configuration cfg) {
+		super.configure( cfg );
+		cfg.setNamingStrategy( new TestNamingStrategy() );
+	}
+
+	public NamingStrategyTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] {
+				"namingstrategy/Customers.hbm.xml"
+		};
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/namingstrategy/NamingStrategyTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/namingstrategy/TestNamingStrategy.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/namingstrategy/TestNamingStrategy.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/namingstrategy/TestNamingStrategy.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,21 @@
+package org.hibernate.test.namingstrategy;
+
+import org.hibernate.cfg.DefaultNamingStrategy;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class TestNamingStrategy extends DefaultNamingStrategy {
+	public String propertyToColumnName(String propertyName) {
+		return "PTCN_" + propertyName;
+	}
+
+	public String columnName(String columnName) {
+		return "CN_" + columnName;
+	}
+
+	public String logicalColumnName(String columnName, String
+			propertyName) {
+		return "LCN_" + super.logicalColumnName( columnName, propertyName );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/namingstrategy/TestNamingStrategy.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/immutable/Child.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/immutable/Child.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/immutable/Child.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,43 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.naturalid.immutable;
+
+/**
+ * @author Alex Burgel
+ */
+public class Child {
+	
+	private Long id;
+    private Parent parent;
+	private String name;
+	
+	Child() {}
+
+	public Child(String name, Parent parent) {
+		this.name = name;
+        this.parent = parent;
+	}
+	
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/immutable/Child.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/immutable/ImmutableEntityNaturalIdTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/immutable/ImmutableEntityNaturalIdTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/immutable/ImmutableEntityNaturalIdTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,144 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.naturalid.immutable;
+
+import java.lang.reflect.Field;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.hibernate.FetchMode;
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+
+/**
+ * @author Alex Burgel
+ */
+public class ImmutableEntityNaturalIdTest extends FunctionalTestCase {
+
+    public ImmutableEntityNaturalIdTest(String str) {
+        super(str);
+    }
+
+	public void testNaturalIdCheck() throws Exception {
+        Session s = openSession();
+        Transaction t = s.beginTransaction();
+        Parent p = new Parent("alex");
+        Child c = new Child("billy", p);
+        s.persist(p);
+        s.persist(c);
+		t.commit();
+		s.close();
+
+        Field name = c.getClass().getDeclaredField("name");
+        name.setAccessible(true);
+        name.set(c, "phil");
+
+		s = openSession();
+		t = s.beginTransaction();
+        try {
+            s.saveOrUpdate( c );
+			s.flush();
+            fail( "should have failed because immutable natural ID was altered");
+        }
+        catch (HibernateException he) {
+			// expected
+		}
+		finally {
+			t.rollback();
+			s.close();
+		}
+
+        name.set(c, "billy");
+
+		s = openSession();
+		t = s.beginTransaction();
+        s.delete(c);
+        s.delete(p);
+        t.commit();
+        s.close();
+    }
+
+    public void testSaveParentWithDetachedChildren() throws Exception {
+        Session s = openSession();
+        Transaction t = s.beginTransaction();
+
+        Parent p = new Parent("alex");
+        Child c = new Child("billy", p);
+
+        s.persist(p);
+        s.persist(c);
+        t.commit();
+        s.close();
+
+        s = openSession();
+        t = s.beginTransaction();
+
+        p = (Parent) s.createCriteria(Parent.class)
+				.add( Restrictions.eq("name", "alex") )
+				.setFetchMode("children", FetchMode.JOIN)
+        .setCacheable(true)
+        .uniqueResult();
+
+        t.commit();
+        s.close();
+
+        s = openSession();
+        t = s.beginTransaction();
+
+        Child c2 = new Child("joey", p);
+        p.getChildren().add(c2);
+
+        s.update(p);
+
+        // this fails if AbstractEntityPersister returns identifiers instead of entities from
+        // AbstractEntityPersister.getNaturalIdSnapshot()
+        s.flush();
+
+        s.delete(p);
+        t.commit();
+        s.close();
+    }
+
+    public void configure(Configuration cfg) {
+        cfg.setProperty(Environment.USE_SECOND_LEVEL_CACHE, "true");
+        cfg.setProperty(Environment.USE_QUERY_CACHE, "true");
+        cfg.setProperty(Environment.GENERATE_STATISTICS, "true");
+    }
+
+    public String[] getMappings() {
+        return new String[] { "naturalid/immutable/ParentChildWithManyToOne.hbm.xml" };
+    }
+
+    public static Test suite() {
+        return new TestSuite( ImmutableEntityNaturalIdTest.class);
+    }
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/immutable/ImmutableEntityNaturalIdTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/immutable/ImmutableNaturalIdTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/immutable/ImmutableNaturalIdTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/immutable/ImmutableNaturalIdTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,158 @@
+/*
+ * Copyright (c) 2007, Red Hat Middleware, LLC. All rights reserved.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, v. 2.1. This program is distributed in the
+ * hope that it will be useful, but WITHOUT A WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details. You should have received a
+ * copy of the GNU Lesser General Public License, v.2.1 along with this
+ * distribution; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Red Hat Author(s): Steve Ebersole
+ */
+package org.hibernate.test.naturalid.immutable;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.HibernateException;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class ImmutableNaturalIdTest extends FunctionalTestCase {
+	public ImmutableNaturalIdTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "naturalid/immutable/User.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( ImmutableNaturalIdTest.class );
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setProperty( Environment.USE_SECOND_LEVEL_CACHE, "true" );
+		cfg.setProperty( Environment.USE_QUERY_CACHE, "true" );
+		cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
+	}
+
+	public void testUpdate() {
+		// prepare some test data...
+		Session session = openSession();
+    	session.beginTransaction();
+	  	User user = new User();
+    	user.setUserName( "steve" );
+    	user.setEmail( "steve at hibernate.org" );
+    	user.setPassword( "brewhaha" );
+		session.save( user );
+    	session.getTransaction().commit();
+    	session.close();
+
+		// 'user' is now a detached entity, so lets change a property and reattch...
+		user.setPassword( "homebrew" );
+		session = openSession();
+		session.beginTransaction();
+		session.update( user );
+		session.getTransaction().commit();
+		session.close();
+
+		// clean up
+		session = openSession();
+		session.beginTransaction();
+		session.delete( user );
+		session.getTransaction().commit();
+		session.close();
+	}
+
+	public void testNaturalIdCheck() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		User u = new User( "steve", "superSecret" );
+		s.persist( u );
+		u.setUserName( "Steve" );
+		try {
+			s.flush();
+			fail();
+		}
+		catch ( HibernateException he ) {
+		}
+		u.setUserName( "steve" );
+		s.delete( u );
+		t.commit();
+		s.close();
+	}
+
+	public void testNaturalIdCache() {
+		Session s = openSession();
+		s.beginTransaction();
+		User u = new User( "steve", "superSecret" );
+		s.persist( u );
+		s.getTransaction().commit();
+		s.close();
+
+		getSessions().getStatistics().clear();
+
+		s = openSession();
+		s.beginTransaction();
+		u = ( User ) s.createCriteria( User.class )
+				.add( Restrictions.naturalId().set( "userName", "steve" ) )
+				.setCacheable( true )
+				.uniqueResult();
+		assertNotNull( u );
+		s.getTransaction().commit();
+		s.close();
+
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 1 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryCachePutCount(), 1 );
+
+		s = openSession();
+		s.beginTransaction();
+		User v = new User( "gavin", "supsup" );
+		s.persist( v );
+		s.getTransaction().commit();
+		s.close();
+
+		getSessions().getStatistics().clear();
+
+		s = openSession();
+		s.beginTransaction();
+		u = ( User ) s.createCriteria( User.class )
+				.add( Restrictions.naturalId().set( "userName", "steve" ) )
+				.setCacheable( true )
+				.uniqueResult();
+		assertNotNull( u );
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 1 );
+		u = ( User ) s.createCriteria( User.class )
+				.add( Restrictions.naturalId().set( "userName", "steve" ) )
+				.setCacheable( true )
+				.uniqueResult();
+		assertNotNull( u );
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 2 );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.createQuery( "delete User" ).executeUpdate();
+		s.getTransaction().commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/immutable/ImmutableNaturalIdTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/immutable/Parent.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/immutable/Parent.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/immutable/Parent.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,58 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.naturalid.immutable;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Alex Burgel
+ */
+public class Parent {
+	
+	private Long id;
+	private String name;
+	private List children = new ArrayList();
+
+	Parent() {}
+
+	public Parent(String name) {
+		this.name = name;
+	}
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public List getChildren() {
+        return children;
+    }
+
+    public void setChildren(List children) {
+        this.children = children;
+    }
+
+    
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/immutable/Parent.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/immutable/ParentChildWithManyToOne.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/immutable/ParentChildWithManyToOne.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/immutable/ParentChildWithManyToOne.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,41 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+  This mapping illustrates use of <natural-id> with a many-to-one.
+  
+-->
+
+<hibernate-mapping 
+	package="org.hibernate.test.naturalid.immutable"
+	default-access="field">
+	
+	<class name="Parent" table="Parent">
+		<id name="id">
+			<generator class="increment"/>
+		</id>
+		
+		<property name="name"/>
+		
+		<bag name="children" inverse="true" cascade="all">
+			<key column="parent" />
+			<one-to-many class="Child" />
+		</bag>
+
+	</class>
+
+	<class name="Child" table="Child">
+		<id name="id">
+			<generator class="increment"/>
+		</id>
+		
+		<natural-id mutable="false">
+			<many-to-one name="parent" class="Parent" />
+			<property name="name"/>
+		</natural-id>
+	</class>
+	
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/immutable/ParentChildWithManyToOne.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/immutable/User.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/immutable/User.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/immutable/User.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,42 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+  ~ Copyright (c) 2007, Red Hat Middleware, LLC. All rights reserved.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, v. 2.1. This program is distributed in the
+  ~ hope that it will be useful, but WITHOUT A WARRANTY; without even the implied
+  ~ warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  ~ Lesser General Public License for more details. You should have received a
+  ~ copy of the GNU Lesser General Public License, v.2.1 along with this
+  ~ distribution; if not, write to the Free Software Foundation, Inc.,
+  ~ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+  ~
+  ~ Red Hat Author(s): Steve Ebersole
+  -->
+
+<!--
+
+  This mapping illustrates use of <natural-id mutable="false"/>
+
+-->
+<hibernate-mapping package="org.hibernate.test.naturalid.immutable">
+
+    <class name="User" table="IMM_NAT_ID_USER" lazy="true">
+        <comment>Users may bid for or sell auction items.</comment>
+        <id name="myUserId" type="java.lang.Integer">
+            <generator class="increment"/>
+        </id>
+        <natural-id mutable="false">
+            <property name="userName" length="10"/>
+        </natural-id>
+        <version name="version"/>
+        <property name="password" not-null="true" length="15" column="`password`"/>
+        <property name="email"/>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/immutable/User.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/immutable/User.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/immutable/User.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/immutable/User.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2007, Red Hat Middleware, LLC. All rights reserved.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, v. 2.1. This program is distributed in the
+ * hope that it will be useful, but WITHOUT A WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details. You should have received a
+ * copy of the GNU Lesser General Public License, v.2.1 along with this
+ * distribution; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Red Hat Author(s): Steve Ebersole
+ */
+package org.hibernate.test.naturalid.immutable;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class User implements java.io.Serializable {
+
+	private Integer myUserId;
+	private Integer version;
+	private String userName;
+	private String password;
+	private String email;
+
+	public User() {
+	}
+
+	public User(String userName, String password) {
+		this.userName = userName;
+		this.password = password;
+	}
+
+	public Integer getMyUserId() {
+		return this.myUserId;
+	}
+
+	public void setMyUserId(Integer myUserId) {
+		this.myUserId = myUserId;
+	}
+
+	public String getUserName() {
+		return this.userName;
+	}
+
+	public void setUserName(String userName) {
+		this.userName = userName;
+	}
+
+	public String getPassword() {
+		return this.password;
+	}
+
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+	public String getEmail() {
+		return this.email;
+	}
+
+	public void setEmail(String email) {
+		this.email = email;
+	}
+
+	public Integer getVersion() {
+		return this.version;
+	}
+
+	public void setVersion(Integer version) {
+		this.version = version;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/immutable/User.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/mutable/MutableNaturalIdTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/mutable/MutableNaturalIdTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/mutable/MutableNaturalIdTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,269 @@
+//$Id: MutableNaturalIdTest.java 11645 2007-06-06 21:33:31Z steve.ebersole at jboss.com $
+package org.hibernate.test.naturalid.mutable;
+
+import java.lang.reflect.Field;
+
+import junit.framework.Test;
+
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class MutableNaturalIdTest extends FunctionalTestCase {
+
+	public MutableNaturalIdTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "naturalid/mutable/User.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setProperty(Environment.USE_SECOND_LEVEL_CACHE, "true");
+		cfg.setProperty(Environment.USE_QUERY_CACHE, "true");
+		cfg.setProperty(Environment.GENERATE_STATISTICS, "true");
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( MutableNaturalIdTest.class );
+	}
+
+	public void testReattachmentNaturalIdCheck() throws Throwable {
+		Session s = openSession();
+		s.beginTransaction();
+		User u = new User( "gavin", "hb", "secret" );
+		s.persist( u );
+		s.getTransaction().commit();
+		s.close();
+
+		Field name = u.getClass().getDeclaredField("name");
+		name.setAccessible(true);
+		name.set(u, "Gavin");
+		s = openSession();
+		s.beginTransaction();
+		try {
+			s.update( u );
+			s.getTransaction().commit();
+		}
+		catch( HibernateException expected ) {
+			s.getTransaction().rollback();
+		}
+		catch( Throwable t ) {
+			try {
+				s.getTransaction().rollback();
+			}
+			catch ( Throwable ignore ) {
+			}
+			throw t;
+		}
+		finally {
+			s.close();
+		}
+
+		s = openSession();
+		s.beginTransaction();
+		s.delete( u );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testNonexistentNaturalIdCache() {
+		getSessions().getStatistics().clear();
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Object nullUser = s.createCriteria(User.class)
+			.add( Restrictions.naturalId()
+				.set("name", "gavin")
+				.set("org", "hb")
+			)
+			.setCacheable(true)
+			.uniqueResult();
+
+		assertNull(nullUser);
+
+		t.commit();
+		s.close();
+
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 1 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryCachePutCount(), 0 );
+
+		s = openSession();
+		t = s.beginTransaction();
+
+		User u = new User("gavin", "hb", "secret");
+		s.persist(u);
+
+		t.commit();
+		s.close();
+
+		getSessions().getStatistics().clear();
+
+		s = openSession();
+		t = s.beginTransaction();
+
+		u = (User) s.createCriteria(User.class)
+			.add( Restrictions.naturalId()
+				.set("name", "gavin")
+				.set("org", "hb")
+			)
+			.setCacheable(true)
+			.uniqueResult();
+
+		assertNotNull(u);
+
+		t.commit();
+		s.close();
+
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 1 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryCachePutCount(), 1 );
+
+		getSessions().getStatistics().clear();
+
+		s = openSession();
+		t = s.beginTransaction();
+
+		u = (User) s.createCriteria(User.class)
+			.add( Restrictions.naturalId()
+				.set("name", "gavin")
+				.set("org", "hb")
+			).setCacheable(true)
+			.uniqueResult();
+
+		s.delete(u);
+
+		t.commit();
+		s.close();
+
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 1 );
+
+		getSessions().getStatistics().clear();
+
+		s = openSession();
+		t = s.beginTransaction();
+
+		nullUser = s.createCriteria(User.class)
+			.add( Restrictions.naturalId()
+				.set("name", "gavin")
+				.set("org", "hb")
+			)
+			.setCacheable(true)
+			.uniqueResult();
+
+		assertNull(nullUser);
+
+		t.commit();
+		s.close();
+
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 1 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryCachePutCount(), 0 );
+
+	}
+
+	public void testNaturalIdCache() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		User u = new User( "gavin", "hb", "secret" );
+		s.persist( u );
+		t.commit();
+		s.close();
+
+		getSessions().getStatistics().clear();
+
+		s = openSession();
+		t = s.beginTransaction();
+		u = ( User ) s.createCriteria( User.class )
+				.add( Restrictions.naturalId()
+						.set( "name", "gavin" )
+						.set( "org", "hb" )
+				)
+				.setCacheable( true )
+				.uniqueResult();
+		assertNotNull( u );
+		t.commit();
+		s.close();
+
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 1 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryCachePutCount(), 1 );
+
+		s = openSession();
+		t = s.beginTransaction();
+		User v = new User("xam", "hb", "foobar");
+		s.persist(v);
+		t.commit();
+		s.close();
+
+		getSessions().getStatistics().clear();
+
+		s = openSession();
+		t = s.beginTransaction();
+		u = ( User ) s.createCriteria( User.class )
+				.add( Restrictions.naturalId()
+						.set("name", "gavin")
+						.set("org", "hb")
+				)
+				.setCacheable( true )
+				.uniqueResult();
+		assertNotNull(u);
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 1 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 0 );
+
+		u = ( User ) s.createCriteria( User.class )
+				.add( Restrictions.naturalId()
+						.set("name", "gavin")
+						.set("org", "hb")
+				)
+				.setCacheable( true )
+				.uniqueResult();
+		assertNotNull(u);
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 1 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 1 );
+
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery("delete User").executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	public void testQuerying() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		User u = new User("emmanuel", "hb", "bh");
+		s.persist(u);
+
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+
+		u = (User) s.createQuery( "from User u where u.name = :name" )
+			.setParameter( "name", "emmanuel" ).uniqueResult();
+		assertEquals( "emmanuel", u.getName() );
+		s.delete( u );
+
+		t.commit();
+		s.close();
+	}
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/mutable/MutableNaturalIdTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/mutable/User.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/mutable/User.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/mutable/User.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+  This mapping illustrates use of <natural-id mutable="true"/>
+
+-->
+
+<hibernate-mapping
+	package="org.hibernate.test.naturalid"
+	default-access="field">
+
+	<class name="org.hibernate.test.naturalid.mutable.User" table="SystemUserInfo">
+		<id name="id">
+			<generator class="increment"/>
+		</id>
+		<natural-id mutable="true">
+			<property name="name"/>
+			<property name="org"/>
+		</natural-id>
+		<property name="password" column="`password`"/>
+	</class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/mutable/User.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/mutable/User.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/mutable/User.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/mutable/User.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,34 @@
+//$Id: User.java 6900 2005-05-25 01:24:22Z oneovthafew $
+package org.hibernate.test.naturalid.mutable;
+
+/**
+ * @author Gavin King
+ */
+public class User {
+	
+	private Long id;
+	private String name;
+	private String org;
+	private String password;
+	
+	User() {}
+
+	public User(String name, String org, String password) {
+		this.name = name;
+		this.org = org;
+		this.password = password;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+	public String getOrg() {
+		return org;
+	}
+	
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/naturalid/mutable/User.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/AbstractOperationTestCase.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/AbstractOperationTestCase.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/AbstractOperationTestCase.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,130 @@
+package org.hibernate.test.nonflushedchanges;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.hibernate.ConnectionReleaseMode;
+import org.hibernate.Session;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.engine.EntityKey;
+import org.hibernate.engine.NonFlushedChanges;
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.engine.StatefulPersistenceContext;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.tm.ConnectionProviderImpl;
+import org.hibernate.testing.tm.TransactionManagerLookupImpl;
+import org.hibernate.transaction.CMTTransactionFactory;
+import org.hibernate.util.SerializationHelper;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole, Gail Badner (adapted this from "ops" tests version)
+ */
+public abstract class AbstractOperationTestCase extends FunctionalTestCase {
+	private Map oldToNewEntityRefs = new HashMap();
+
+	public AbstractOperationTestCase(String name) {
+		super( name );
+	}
+
+	public void configure(Configuration cfg) {
+		super.configure( cfg );
+		cfg.setProperty( Environment.CONNECTION_PROVIDER, ConnectionProviderImpl.class.getName() );
+		cfg.setProperty( Environment.TRANSACTION_MANAGER_STRATEGY, TransactionManagerLookupImpl.class.getName() );
+		cfg.setProperty( Environment.TRANSACTION_STRATEGY, CMTTransactionFactory.class.getName() );
+		cfg.setProperty( Environment.AUTO_CLOSE_SESSION, "true" );
+		cfg.setProperty( Environment.FLUSH_BEFORE_COMPLETION, "true" );
+		cfg.setProperty( Environment.RELEASE_CONNECTIONS, ConnectionReleaseMode.AFTER_STATEMENT.toString() );
+		cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
+		cfg.setProperty( Environment.STATEMENT_BATCH_SIZE, "0" );
+	}
+
+	public String[] getMappings() {
+		return new String[] {
+				"nonflushedchanges/Node.hbm.xml",
+				"nonflushedchanges/Employer.hbm.xml",
+				"nonflushedchanges/OptLockEntity.hbm.xml",
+				"nonflushedchanges/OneToOne.hbm.xml",
+				"nonflushedchanges/Competition.hbm.xml"
+		};
+	}
+
+	public String getCacheConcurrencyStrategy() {
+		return null;
+	}
+
+	protected void clearCounts() {
+		getSessions().getStatistics().clear();
+	}
+
+	protected void assertInsertCount(int expected) {
+		int inserts = ( int ) getSessions().getStatistics().getEntityInsertCount();
+		assertEquals( "unexpected insert count", expected, inserts );
+	}
+
+	protected void assertUpdateCount(int expected) {
+		int updates = ( int ) getSessions().getStatistics().getEntityUpdateCount();
+		assertEquals( "unexpected update counts", expected, updates );
+	}
+
+	protected void assertDeleteCount(int expected) {
+		int deletes = ( int ) getSessions().getStatistics().getEntityDeleteCount();
+		assertEquals( "unexpected delete counts", expected, deletes );
+	}
+
+	protected void assertFetchCount(int count) {
+		int fetches = ( int ) getSessions().getStatistics().getEntityFetchCount();
+		assertEquals( count, fetches );
+	}
+
+	protected Session applyNonFlushedChangesToNewSessionCloseOldSession(Session oldSession) {
+		NonFlushedChanges nfc = ( ( SessionImplementor ) oldSession ).getNonFlushedChanges();
+		byte[] bytes = SerializationHelper.serialize( nfc );
+		NonFlushedChanges nfc2 = ( NonFlushedChanges ) SerializationHelper.deserialize( bytes );
+		Session newSession = openSession();
+		( ( SessionImplementor ) newSession ).applyNonFlushedChanges( nfc2 );
+		oldToNewEntityRefs.clear();
+		for ( Iterator it = ( ( SessionImplementor ) oldSession ).getPersistenceContext()
+				.getEntitiesByKey()
+				.entrySet()
+				.iterator(); it.hasNext(); ) {
+			Map.Entry entry = ( Map.Entry ) it.next();
+			EntityKey entityKey = ( EntityKey ) entry.getKey();
+			Object oldEntityRef = entry.getValue();
+			oldToNewEntityRefs.put(
+					oldEntityRef, ( ( SessionImplementor ) newSession ).getPersistenceContext().getEntity( entityKey )
+			);
+		}
+		for ( Iterator it = ( ( StatefulPersistenceContext ) ( ( SessionImplementor ) oldSession ).getPersistenceContext() )
+				.getProxiesByKey()
+				.entrySet()
+				.iterator(); it.hasNext(); ) {
+			Map.Entry entry = ( Map.Entry ) it.next();
+			EntityKey entityKey = ( EntityKey ) entry.getKey();
+			Object oldProxyRef = entry.getValue();
+			oldToNewEntityRefs.put(
+					oldProxyRef, ( ( SessionImplementor ) newSession ).getPersistenceContext().getProxy( entityKey )
+			);
+		}
+
+		oldSession.clear();
+		oldSession.close();
+		return newSession;
+	}
+
+	protected void applyNonFlushedChangesToClearedSession(Session s) {
+		NonFlushedChanges nfc = ( ( SessionImplementor ) s ).getNonFlushedChanges();
+		byte[] bytes = SerializationHelper.serialize( nfc );
+		NonFlushedChanges nfc2 = ( NonFlushedChanges ) SerializationHelper.deserialize( bytes );
+		s.clear();
+		( ( SessionImplementor ) s ).applyNonFlushedChanges( nfc2 );
+	}
+
+	protected Map getOldToNewEntityRefMap() {
+		return Collections.unmodifiableMap( oldToNewEntityRefs );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/AbstractOperationTestCase.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Address.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Address.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Address.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,67 @@
+package org.hibernate.test.nonflushedchanges;
+
+import java.io.Serializable;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole, Gail Badner (adapted this from "ops" tests version)
+ */
+public class Address implements Serializable {
+	private Long id;
+	private String streetAddress;
+	private String city;
+	private String country;
+	private Person resident;
+
+	public Address() {
+	}
+
+	public Address(String streetAddress, String city, String country, Person resident) {
+		this.streetAddress = streetAddress;
+		this.city = city;
+		this.country = country;
+		this.resident = resident;
+		resident.setAddress( this );
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getStreetAddress() {
+		return streetAddress;
+	}
+
+	public void setStreetAddress(String streetAddress) {
+		this.streetAddress = streetAddress;
+	}
+
+	public String getCity() {
+		return city;
+	}
+
+	public void setCity(String city) {
+		this.city = city;
+	}
+
+	public String getCountry() {
+		return country;
+	}
+
+	public void setCountry(String country) {
+		this.country = country;
+	}
+
+	public Person getResident() {
+		return resident;
+	}
+
+	public void setResident(Person resident) {
+		this.resident = resident;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Address.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Competition.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Competition.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Competition.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+  
+-->
+
+<hibernate-mapping package="org.hibernate.test.nonflushedchanges">
+
+    <class name="Competition">
+        <id name="id">
+            <generator class="native"/>
+        </id>
+        <list name="competitors" table="COMPET_ION_OR" cascade="persist,merge,delete">
+            <key column="TION_ID"/>
+            <list-index column="INDEX_COL"/>
+            <many-to-many class="Competitor" column="TOR_ID"/>
+        </list>
+    </class>
+
+    <class name="Competitor">
+        <id name="id">
+            <generator class="native"/>
+        </id>
+        <property name="name"/>
+    </class>
+
+</hibernate-mapping>
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Competition.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Competition.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Competition.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Competition.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,32 @@
+//$Id: $
+package org.hibernate.test.nonflushedchanges;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Emmanuel Bernard, Gail Badner (adapted this from "ops" tests version)
+ */
+public class Competition implements Serializable {
+	private Integer id;
+
+	private List competitors = new ArrayList();
+
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public List getCompetitors() {
+		return competitors;
+	}
+
+	public void setCompetitors(List competitors) {
+		this.competitors = competitors;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Competition.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Competitor.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Competitor.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Competitor.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,36 @@
+//$Id: $
+package org.hibernate.test.nonflushedchanges;
+
+import java.io.Serializable;
+
+/**
+ * @author Emmanuel Bernard, Gail Badner (adapted this from "ops" tests version)
+ */
+public class Competitor implements Serializable {
+	public Integer id;
+	private String name;
+
+
+	public Competitor() {
+	}
+
+	public Competitor(String name) {
+		this.name = name;
+	}
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Competitor.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/CreateTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/CreateTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/CreateTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,250 @@
+//$Id: CreateTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.nonflushedchanges;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.PersistentObjectException;
+import org.hibernate.Session;
+import org.hibernate.exception.ConstraintViolationException;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.testing.tm.SimpleJtaTransactionManagerImpl;
+
+/**
+ * @author Gavin King, Gail Badner (adapted this from "ops" tests version)
+ */
+public class CreateTest extends AbstractOperationTestCase {
+
+	public CreateTest(String str) {
+		super( str );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( CreateTest.class );
+	}
+
+	public void testNoUpdatesOnCreateVersionedWithCollection() throws Exception {
+		clearCounts();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		VersionedEntity root = new VersionedEntity( "root", "root" );
+		VersionedEntity child = new VersionedEntity( "c1", "child-1" );
+		root.getChildren().add( child );
+		child.setParent( root );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		s.save( root );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( VersionedEntity ) getOldToNewEntityRefMap().get( root );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( VersionedEntity ) getOldToNewEntityRefMap().get( root );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		assertDeleteCount( 0 );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s.delete( root );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( VersionedEntity ) getOldToNewEntityRefMap().get( root );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 2 );
+	}
+
+	public void testCreateTree() throws Exception {
+
+		clearCounts();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		Node root = new Node( "root" );
+		Node child = new Node( "child" );
+		root.addChild( child );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		s.persist( root );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		System.out.println( "getting" );
+		root = ( Node ) s.get( Node.class, "root" );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( Node ) getOldToNewEntityRefMap().get( root );
+		Node child2 = new Node( "child2" );
+		root.addChild( child2 );
+		System.out.println( "committing" );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 3 );
+		assertUpdateCount( 0 );
+	}
+
+	public void testCreateTreeWithGeneratedId() throws Exception {
+
+		clearCounts();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		NumberedNode root = new NumberedNode( "root" );
+		NumberedNode child = new NumberedNode( "child" );
+		root.addChild( child );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		s.persist( root );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( NumberedNode ) s.get( NumberedNode.class, new Long( root.getId() ) );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		NumberedNode child2 = new NumberedNode( "child2" );
+		root = ( NumberedNode ) getOldToNewEntityRefMap().get( root );
+		root.addChild( child2 );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 3 );
+		assertUpdateCount( 0 );
+	}
+
+	public void testCreateException() throws Exception {
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		Node dupe = new Node( "dupe" );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		s.persist( dupe );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		dupe = ( Node ) getOldToNewEntityRefMap().get( dupe );
+		s.persist( dupe );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		s.persist( dupe );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		try {
+			SimpleJtaTransactionManagerImpl.getInstance().commit();
+			assertFalse( true );
+		}
+		catch ( ConstraintViolationException cve ) {
+			//verify that an exception is thrown!
+		}
+		SimpleJtaTransactionManagerImpl.getInstance().rollback();
+
+		Node nondupe = new Node( "nondupe" );
+		nondupe.addChild( dupe );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		s.persist( nondupe );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		try {
+			SimpleJtaTransactionManagerImpl.getInstance().commit();
+			assertFalse( true );
+		}
+		catch ( ConstraintViolationException cve ) {
+			//verify that an exception is thrown!
+		}
+		SimpleJtaTransactionManagerImpl.getInstance().rollback();
+	}
+
+	public void testCreateExceptionWithGeneratedId() throws Exception {
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		NumberedNode dupe = new NumberedNode( "dupe" );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		s.persist( dupe );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		dupe = ( NumberedNode ) getOldToNewEntityRefMap().get( dupe );
+		s.persist( dupe );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		try {
+			s.persist( dupe );
+			assertFalse( true );
+		}
+		catch ( PersistentObjectException poe ) {
+			//verify that an exception is thrown!
+		}
+		SimpleJtaTransactionManagerImpl.getInstance().rollback();
+
+		NumberedNode nondupe = new NumberedNode( "nondupe" );
+		nondupe.addChild( dupe );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		try {
+			s.persist( nondupe );
+			assertFalse( true );
+		}
+		catch ( PersistentObjectException poe ) {
+			//verify that an exception is thrown!
+		}
+		SimpleJtaTransactionManagerImpl.getInstance().rollback();
+	}
+
+	public void testBasic() throws Exception {
+		Session s;
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		Employer er = new Employer();
+		Employee ee = new Employee();
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		s.persist( ee );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		ee = ( Employee ) getOldToNewEntityRefMap().get( ee );
+		Collection erColl = new ArrayList();
+		Collection eeColl = new ArrayList();
+		erColl.add( ee );
+		eeColl.add( er );
+		er.setEmployees( erColl );
+		ee.setEmployers( eeColl );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		ee = ( Employee ) getOldToNewEntityRefMap().get( ee );
+		er = ( Employer ) ee.getEmployers().iterator().next();
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		er = ( Employer ) s.load( Employer.class, er.getId() );
+		assertNotNull( er );
+		assertFalse( Hibernate.isInitialized( er ) );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		er = ( Employer ) getOldToNewEntityRefMap().get( er );
+		assertNotNull( er );
+		assertFalse( Hibernate.isInitialized( er ) );
+		assertNotNull( er.getEmployees() );
+		assertEquals( 1, er.getEmployees().size() );
+		Employee eeFromDb = ( Employee ) er.getEmployees().iterator().next();
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		eeFromDb = ( Employee ) getOldToNewEntityRefMap().get( eeFromDb );
+		assertEquals( ee.getId(), eeFromDb.getId() );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/CreateTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/DeleteTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/DeleteTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/DeleteTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,94 @@
+package org.hibernate.test.nonflushedchanges;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.testing.tm.SimpleJtaTransactionManagerImpl;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole, Gail Badner (adapted this from "ops" tests version)
+ */
+public class DeleteTest extends AbstractOperationTestCase {
+	public DeleteTest(String name) {
+		super( name );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( DeleteTest.class );
+	}
+
+	public void testDeleteVersionedWithCollectionNoUpdate() throws Exception {
+		// test adapted from HHH-1564...
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		VersionedEntity c = new VersionedEntity( "c1", "child-1" );
+		VersionedEntity p = new VersionedEntity( "root", "root" );
+		p.getChildren().add( c );
+		c.setParent( p );
+		s.save( p );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		clearCounts();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		VersionedEntity loadedParent = ( VersionedEntity ) s.get( VersionedEntity.class, "root" );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		loadedParent = ( VersionedEntity ) getOldToNewEntityRefMap().get( loadedParent );
+		s.delete( loadedParent );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 0 );
+		assertUpdateCount( 0 );
+		assertDeleteCount( 2 );
+	}
+
+	public void testNoUpdateOnDelete() throws Exception {
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		Node node = new Node( "test" );
+		s.persist( node );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		clearCounts();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		s.delete( node );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertUpdateCount( 0 );
+		assertInsertCount( 0 );
+	}
+
+	public void testNoUpdateOnDeleteWithCollection() throws Exception {
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		Node parent = new Node( "parent" );
+		Node child = new Node( "child" );
+		parent.getCascadingChildren().add( child );
+		s.persist( parent );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		clearCounts();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		parent = ( Node ) s.get( Node.class, "parent" );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		parent = ( Node ) getOldToNewEntityRefMap().get( parent );
+		s.delete( parent );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertUpdateCount( 0 );
+		assertInsertCount( 0 );
+		assertDeleteCount( 2 );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/DeleteTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Employee.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Employee.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Employee.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,35 @@
+//$Id: Employee.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.nonflushedchanges;
+
+import java.io.Serializable;
+import java.util.Collection;
+
+
+/**
+ * Employee in an Employer-Employee relationship
+ *
+ * @author Emmanuel Bernard, Gail Badner (adapted this from "ops" tests version)
+ */
+
+public class Employee implements Serializable {
+	private Integer id;
+	private Collection employers;
+
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer integer) {
+		id = integer;
+	}
+
+
+	public Collection getEmployers() {
+		return employers;
+	}
+
+	public void setEmployers(Collection employers) {
+		this.employers = employers;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Employee.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Employer.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Employer.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Employer.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,39 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+  
+-->
+
+<hibernate-mapping package="org.hibernate.test.nonflushedchanges">
+
+    <class name="Employer" polymorphism="explicit">
+        <id name="id">
+            <generator class="native"/>
+        </id>
+        <version column="vers" name="vers"/>
+        <bag name="employees"
+             cascade="persist,merge"
+             table="EMPLOYER_EMPLOYEE">
+            <key column="EMPER_ID"/>
+            <many-to-many class="Employee" column="EMPEE_ID"/>
+        </bag>
+    </class>
+
+    <class name="Employee" polymorphism="explicit">
+        <id name="id">
+            <generator class="native"/>
+        </id>
+        <bag name="employers"
+             inverse="true"
+             cascade="persist,merge,save-update"
+             table="EMPLOYER_EMPLOYEE">
+            <key column="EMPEE_ID"/>
+            <many-to-many class="Employer" column="EMPER_ID"/>
+        </bag>
+    </class>
+
+</hibernate-mapping>
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Employer.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Employer.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Employer.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Employer.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,44 @@
+//$Id: Employer.java 8670 2005-11-25 17:36:29Z epbernard $
+package org.hibernate.test.nonflushedchanges;
+
+import java.io.Serializable;
+import java.util.Collection;
+
+
+/**
+ * Employer in a employer-Employee relationship
+ *
+ * @author Emmanuel Bernard, Gail Badner (adapted this from "ops" tests version)
+ */
+
+public class Employer implements Serializable {
+	private Integer id;
+	private Collection employees;
+	private Integer vers;
+
+	public Integer getVers() {
+		return vers;
+	}
+
+	public void setVers(Integer vers) {
+		this.vers = vers;
+	}
+
+
+	public Collection getEmployees() {
+		return employees;
+	}
+
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setEmployees(Collection set) {
+		employees = set;
+	}
+
+	public void setId(Integer integer) {
+		id = integer;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Employer.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/GetLoadTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/GetLoadTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/GetLoadTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,254 @@
+//$Id: GetLoadTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.nonflushedchanges;
+
+import java.util.Iterator;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.testing.tm.SimpleJtaTransactionManagerImpl;
+
+
+/**
+ * @author Gavin King, Gail Badner (adapted this from "ops" tests version)
+ */
+public class GetLoadTest extends AbstractOperationTestCase {
+
+	public GetLoadTest(String str) {
+		super( str );
+	}
+
+	public void testGetLoad() throws Exception {
+		clearCounts();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		Employer emp = new Employer();
+		s.persist( emp );
+		Node node = new Node( "foo" );
+		Node parent = new Node( "bar" );
+		parent.addChild( node );
+		s.persist( parent );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		emp = ( Employer ) s.get( Employer.class, emp.getId() );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		emp = ( Employer ) getOldToNewEntityRefMap().get( emp );
+		assertTrue( Hibernate.isInitialized( emp ) );
+		assertFalse( Hibernate.isInitialized( emp.getEmployees() ) );
+		node = ( Node ) s.get( Node.class, node.getName() );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		node = ( Node ) getOldToNewEntityRefMap().get( node );
+		emp = ( Employer ) getOldToNewEntityRefMap().get( emp );
+		assertTrue( Hibernate.isInitialized( node ) );
+		assertFalse( Hibernate.isInitialized( node.getChildren() ) );
+		assertFalse( Hibernate.isInitialized( node.getParent() ) );
+		assertNull( s.get( Node.class, "xyz" ) );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		emp = ( Employer ) s.load( Employer.class, emp.getId() );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		emp = ( Employer ) getOldToNewEntityRefMap().get( emp );
+		emp.getId();
+		assertFalse( Hibernate.isInitialized( emp ) );
+		node = ( Node ) s.load( Node.class, node.getName() );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		node = ( Node ) getOldToNewEntityRefMap().get( node );
+		assertEquals( node.getName(), "foo" );
+		assertFalse( Hibernate.isInitialized( node ) );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		emp = ( Employer ) s.get( "org.hibernate.test.nonflushedchanges.Employer", emp.getId() );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		emp = ( Employer ) getOldToNewEntityRefMap().get( emp );
+		assertTrue( Hibernate.isInitialized( emp ) );
+		node = ( Node ) s.get( "org.hibernate.test.nonflushedchanges.Node", node.getName() );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		node = ( Node ) getOldToNewEntityRefMap().get( node );
+		assertTrue( Hibernate.isInitialized( node ) );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		emp = ( Employer ) s.load( "org.hibernate.test.nonflushedchanges.Employer", emp.getId() );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		emp = ( Employer ) getOldToNewEntityRefMap().get( emp );
+		emp.getId();
+		assertFalse( Hibernate.isInitialized( emp ) );
+		node = ( Node ) s.load( "org.hibernate.test.nonflushedchanges.Node", node.getName() );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		emp = ( Employer ) getOldToNewEntityRefMap().get( emp );
+		node = ( Node ) getOldToNewEntityRefMap().get( node );
+		assertEquals( node.getName(), "foo" );
+		assertFalse( Hibernate.isInitialized( node ) );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertFetchCount( 0 );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s.createQuery( "delete from Employer" ).executeUpdate();
+		List list = s.createQuery( "from Node" ).list();
+		for ( Iterator it=list.iterator(); it.hasNext(); ) {
+			s.delete( it.next() );
+		}
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+	}
+
+	public void testGetReadOnly() throws Exception {
+		clearCounts();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		Employer emp = new Employer();
+		s.persist( emp );
+		Node node = new Node( "foo" );
+		Node parent = new Node( "bar" );
+		parent.addChild( node );
+		s.persist( parent );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		assertFalse( s.isDefaultReadOnly() );
+		s.setDefaultReadOnly( true );
+		emp = ( Employer ) s.get( Employer.class, emp.getId() );
+		assertTrue( s.isDefaultReadOnly() );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		assertTrue( s.isDefaultReadOnly() );
+		emp = ( Employer ) getOldToNewEntityRefMap().get( emp );
+		assertTrue( Hibernate.isInitialized( emp ) );
+		assertFalse( Hibernate.isInitialized( emp.getEmployees() ) );
+		node = ( Node ) s.get( Node.class, node.getName() );
+		assertTrue( s.isReadOnly( emp ) );
+		assertTrue( s.isReadOnly( node ) );
+		s.setDefaultReadOnly( false );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		assertFalse( s.isDefaultReadOnly() );
+		node = ( Node ) getOldToNewEntityRefMap().get( node );
+		emp = ( Employer ) getOldToNewEntityRefMap().get( emp );
+		assertTrue( Hibernate.isInitialized( node ) );
+		assertTrue( s.isReadOnly( node ) );
+		assertFalse( Hibernate.isInitialized( node.getParent() ) );
+		assertTrue( s.isReadOnly( emp ) );
+		assertFalse( Hibernate.isInitialized( node.getChildren() ) );
+		Hibernate.initialize( node.getChildren() );
+		for ( Iterator it=node.getChildren().iterator(); it.hasNext(); ) {
+			assertFalse( s.isReadOnly( it.next() ) );
+		}
+		assertFalse( Hibernate.isInitialized( node.getParent() ) );
+		assertNull( s.get( Node.class, "xyz" ) );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		assertFalse( s.isDefaultReadOnly() );
+		emp = ( Employer ) s.get( "org.hibernate.test.nonflushedchanges.Employer", emp.getId() );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		assertFalse( s.isDefaultReadOnly() );
+		emp = ( Employer ) getOldToNewEntityRefMap().get( emp );
+		assertTrue( Hibernate.isInitialized( emp ) );
+		assertFalse( s.isReadOnly( emp ) );
+		s.setReadOnly( emp, true );
+		node = ( Node ) s.get( "org.hibernate.test.nonflushedchanges.Node", node.getName() );
+		assertFalse( s.isReadOnly( node ) );
+		s.setReadOnly( node, true );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		emp = ( Employer ) getOldToNewEntityRefMap().get( emp );
+		assertTrue( s.isReadOnly( emp ) );
+		node = ( Node ) getOldToNewEntityRefMap().get( node );
+		assertTrue( Hibernate.isInitialized( node ) );
+		assertTrue( s.isReadOnly( node ) );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertFetchCount( 0 );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s.createQuery( "delete from Employer" ).executeUpdate();
+		List list = s.createQuery( "from Node" ).list();
+		for ( Iterator it=list.iterator(); it.hasNext(); ) {
+			s.delete( it.next() );
+		}
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+	}
+
+	public void testLoadReadOnly() throws Exception {
+		clearCounts();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		Employer emp = new Employer();
+		s.persist( emp );
+		Node node = new Node( "foo" );
+		Node parent = new Node( "bar" );
+		parent.addChild( node );
+		s.persist( parent );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		assertFalse( s.isDefaultReadOnly() );
+		s.setDefaultReadOnly( true );
+		emp = ( Employer ) s.load( Employer.class, emp.getId() );
+		assertFalse( Hibernate.isInitialized( emp ) );
+		assertTrue( s.isReadOnly( emp ) );
+		assertTrue( s.isDefaultReadOnly() );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		assertTrue( s.isDefaultReadOnly() );
+		emp = ( Employer ) getOldToNewEntityRefMap().get( emp );
+		assertFalse( Hibernate.isInitialized( emp ) );
+		assertTrue( s.isReadOnly( emp ) );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s.createQuery( "delete from Employer" ).executeUpdate();
+		List list = s.createQuery( "from Node" ).list();
+		for ( Iterator it=list.iterator(); it.hasNext(); ) {
+			s.delete( it.next() );
+		}
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+	}
+
+	public void testGetAfterDelete() throws Exception {
+		clearCounts();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		Employer emp = new Employer();
+		s.persist( emp );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s.delete( emp );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		emp = ( Employer ) s.get( Employee.class, emp.getId() );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertNull( "get did not return null after delete", emp );
+	}
+
+	public void configure(Configuration cfg) {
+		super.configure( cfg );
+		cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
+		cfg.setProperty( Environment.STATEMENT_BATCH_SIZE, "0" );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( GetLoadTest.class );
+	}
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/GetLoadTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/MergeTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/MergeTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/MergeTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,844 @@
+//$Id: MergeTest.java 11037 2007-01-09 16:04:16Z steve.ebersole at jboss.com $
+package org.hibernate.test.nonflushedchanges;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.NonUniqueObjectException;
+import org.hibernate.Session;
+import org.hibernate.StaleObjectStateException;
+import org.hibernate.criterion.Projections;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.testing.tm.SimpleJtaTransactionManagerImpl;
+
+/**
+ * @author Gavin King, Gail Badner (adapted this from "ops" tests version)
+ */
+public class MergeTest extends AbstractOperationTestCase {
+
+	public MergeTest(String str) {
+		super( str );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( MergeTest.class );
+	}
+
+	public void testMergeStaleVersionFails() throws Exception {
+
+		clearCounts();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		VersionedEntity entity = new VersionedEntity( "entity", "entity" );
+		s.persist( entity );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		// make the detached 'entity' reference stale...
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		VersionedEntity entity2 = ( VersionedEntity ) s.get( VersionedEntity.class, entity.getId() );
+		entity2.setName( "entity-name" );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		// now try to reattch it
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		try {
+			s.merge( entity );
+			s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+			entity = ( VersionedEntity ) getOldToNewEntityRefMap().get( entity );
+			SimpleJtaTransactionManagerImpl.getInstance().commit();
+			fail( "was expecting staleness error" );
+		}
+		catch ( StaleObjectStateException expected ) {
+			// expected outcome...
+		}
+		finally {
+			SimpleJtaTransactionManagerImpl.getInstance().rollback();
+		}
+	}
+
+	public void testMergeBidiPrimayKeyOneToOne() throws Exception {
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		Person p = new Person( "steve" );
+		new PersonalDetails( "I have big feet", p );
+		s.persist( p );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		clearCounts();
+
+		p.getDetails().setSomePersonalDetail( p.getDetails().getSomePersonalDetail() + " and big hands too" );
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		p = ( Person ) s.merge( p );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		p = ( Person ) getOldToNewEntityRefMap().get( p );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 0 );
+		assertUpdateCount( 1 );
+		assertDeleteCount( 0 );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s.delete( p );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+	}
+
+	public void testMergeBidiForeignKeyOneToOne() throws Exception {
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		Person p = new Person( "steve" );
+		Address a = new Address( "123 Main", "Austin", "US", p );
+		s.persist( a );
+		s.persist( p );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		clearCounts();
+
+		p.getAddress().setStreetAddress( "321 Main" );
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		p = ( Person ) s.merge( p );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 0 );
+		assertUpdateCount( 0 ); // no cascade
+		assertDeleteCount( 0 );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s.delete( a );
+		s.delete( p );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+	}
+
+	public void testNoExtraUpdatesOnMerge() throws Exception {
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		Node node = new Node( "test" );
+		s.persist( node );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		clearCounts();
+
+		// node is now detached, but we have made no changes.  so attempt to merge it
+		// into this new session; this should cause no updates...
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		node = ( Node ) s.merge( node );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertUpdateCount( 0 );
+		assertInsertCount( 0 );
+
+		///////////////////////////////////////////////////////////////////////
+		// as a control measure, now update the node while it is detached and
+		// make sure we get an update as a result...
+		node.setDescription( "new description" );
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		node = ( Node ) s.merge( node );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+		assertUpdateCount( 1 );
+		assertInsertCount( 0 );
+		///////////////////////////////////////////////////////////////////////
+
+		cleanup();
+	}
+
+	public void testNoExtraUpdatesOnMergeWithCollection() throws Exception {
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		Node parent = new Node( "parent" );
+		Node child = new Node( "child" );
+		parent.getChildren().add( child );
+		child.setParent( parent );
+		s.persist( parent );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		clearCounts();
+
+		// parent is now detached, but we have made no changes.  so attempt to merge it
+		// into this new session; this should cause no updates...
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		parent = ( Node ) s.merge( parent );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertUpdateCount( 0 );
+		assertInsertCount( 0 );
+
+		///////////////////////////////////////////////////////////////////////
+		// as a control measure, now update the node while it is detached and
+		// make sure we get an update as a result...
+		( ( Node ) parent.getChildren().iterator().next() ).setDescription( "child's new description" );
+		parent.addChild( new Node( "second child" ) );
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		parent = ( Node ) s.merge( parent );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+		assertUpdateCount( 1 );
+		assertInsertCount( 1 );
+		///////////////////////////////////////////////////////////////////////
+
+		cleanup();
+	}
+
+	public void testNoExtraUpdatesOnMergeVersioned() throws Exception {
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		VersionedEntity entity = new VersionedEntity( "entity", "entity" );
+		s.persist( entity );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		clearCounts();
+
+		// entity is now detached, but we have made no changes.  so attempt to merge it
+		// into this new session; this should cause no updates...
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		VersionedEntity mergedEntity = ( VersionedEntity ) s.merge( entity );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		mergedEntity = ( VersionedEntity ) getOldToNewEntityRefMap().get( mergedEntity );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertUpdateCount( 0 );
+		assertInsertCount( 0 );
+		assertEquals( "unexpected version increment", entity.getVersion(), mergedEntity.getVersion() );
+
+
+		///////////////////////////////////////////////////////////////////////
+		// as a control measure, now update the node while it is detached and
+		// make sure we get an update as a result...
+		entity.setName( "new name" );
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		entity = ( VersionedEntity ) s.merge( entity );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+		assertUpdateCount( 1 );
+		assertInsertCount( 0 );
+		///////////////////////////////////////////////////////////////////////
+
+		cleanup();
+	}
+
+	public void testNoExtraUpdatesOnMergeVersionedWithCollection() throws Exception {
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		VersionedEntity parent = new VersionedEntity( "parent", "parent" );
+		VersionedEntity child = new VersionedEntity( "child", "child" );
+		parent.getChildren().add( child );
+		child.setParent( parent );
+		s.persist( parent );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		clearCounts();
+
+		// parent is now detached, but we have made no changes.  so attempt to merge it
+		// into this new session; this should cause no updates...
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		VersionedEntity mergedParent = ( VersionedEntity ) s.merge( parent );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		mergedParent = ( VersionedEntity ) getOldToNewEntityRefMap().get( mergedParent );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertUpdateCount( 0 );
+		assertInsertCount( 0 );
+		assertEquals( "unexpected parent version increment", parent.getVersion(), mergedParent.getVersion() );
+		VersionedEntity mergedChild = ( VersionedEntity ) mergedParent.getChildren().iterator().next();
+		assertEquals( "unexpected child version increment", child.getVersion(), mergedChild.getVersion() );
+
+		///////////////////////////////////////////////////////////////////////
+		// as a control measure, now update the node while it is detached and
+		// make sure we get an update as a result...
+		mergedParent.setName( "new name" );
+		mergedParent.getChildren().add( new VersionedEntity( "child2", "new child" ) );
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		parent = ( VersionedEntity ) s.merge( mergedParent );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		parent = ( VersionedEntity ) getOldToNewEntityRefMap().get( parent );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+		assertUpdateCount( 1 );
+		assertInsertCount( 1 );
+		///////////////////////////////////////////////////////////////////////
+
+		cleanup();
+	}
+
+	public void testNoExtraUpdatesOnPersistentMergeVersionedWithCollection() throws Exception {
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		VersionedEntity parent = new VersionedEntity( "parent", "parent" );
+		VersionedEntity child = new VersionedEntity( "child", "child" );
+		parent.getChildren().add( child );
+		child.setParent( parent );
+		s.persist( parent );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		clearCounts();
+
+		// parent is now detached, but we have made no changes. so attempt to merge it
+		// into this new session; this should cause no updates...
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		// load parent so that merge will follow entityIsPersistent path
+		VersionedEntity persistentParent = ( VersionedEntity ) s.get( VersionedEntity.class, parent.getId() );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		persistentParent = ( VersionedEntity ) getOldToNewEntityRefMap().get( persistentParent );
+		// load children
+		VersionedEntity persistentChild = ( VersionedEntity ) persistentParent.getChildren().iterator().next();
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		persistentParent = ( VersionedEntity ) getOldToNewEntityRefMap().get( persistentParent );
+		VersionedEntity mergedParent = ( VersionedEntity ) s.merge( persistentParent ); // <-- This merge leads to failure
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		mergedParent = ( VersionedEntity ) getOldToNewEntityRefMap().get( mergedParent );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertUpdateCount( 0 );
+		assertInsertCount( 0 );
+		assertEquals( "unexpected parent version increment", parent.getVersion(), mergedParent.getVersion() );
+		VersionedEntity mergedChild = ( VersionedEntity ) mergedParent.getChildren().iterator().next();
+		assertEquals( "unexpected child version increment", child.getVersion(), mergedChild.getVersion() );
+
+		///////////////////////////////////////////////////////////////////////
+		// as a control measure, now update the node once it is loaded and
+		// make sure we get an update as a result...
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		persistentParent = ( VersionedEntity ) s.get( VersionedEntity.class, parent.getId() );
+		persistentParent.setName( "new name" );
+		persistentParent.getChildren().add( new VersionedEntity( "child2", "new child" ) );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		persistentParent = ( VersionedEntity ) getOldToNewEntityRefMap().get( persistentParent );
+		persistentParent = ( VersionedEntity ) s.merge( persistentParent );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+		assertUpdateCount( 1 );
+		assertInsertCount( 1 );
+		///////////////////////////////////////////////////////////////////////
+
+		// cleanup();
+	}
+
+	public void testPersistThenMergeInSameTxnWithVersion() throws Exception {
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		VersionedEntity entity = new VersionedEntity( "test", "test" );
+		s.persist( entity );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		s.merge( new VersionedEntity( "test", "test-2" ) );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+
+		try {
+			// control operation...
+			s.saveOrUpdate( new VersionedEntity( "test", "test-3" ) );
+			fail( "saveOrUpdate() should fail here" );
+		}
+		catch ( NonUniqueObjectException expected ) {
+			// expected behavior
+		}
+
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		cleanup();
+	}
+
+	public void testPersistThenMergeInSameTxnWithTimestamp() throws Exception {
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		TimestampedEntity entity = new TimestampedEntity( "test", "test" );
+		s.persist( entity );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		s.merge( new TimestampedEntity( "test", "test-2" ) );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+
+		try {
+			// control operation...
+			s.saveOrUpdate( new TimestampedEntity( "test", "test-3" ) );
+			fail( "saveOrUpdate() should fail here" );
+		}
+		catch ( NonUniqueObjectException expected ) {
+			// expected behavior
+		}
+
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		cleanup();
+	}
+
+	public void testMergeDeepTree() throws Exception {
+
+		clearCounts();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		Node root = new Node( "root" );
+		Node child = new Node( "child" );
+		Node grandchild = new Node( "grandchild" );
+		root.addChild( child );
+		child.addChild( grandchild );
+		s.merge( root );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 3 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		grandchild.setDescription( "the grand child" );
+		Node grandchild2 = new Node( "grandchild2" );
+		child.addChild( grandchild2 );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s.merge( root );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( 1 );
+		clearCounts();
+
+		Node child2 = new Node( "child2" );
+		Node grandchild3 = new Node( "grandchild3" );
+		child2.addChild( grandchild3 );
+		root.addChild( child2 );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s.merge( root );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s.delete( grandchild );
+		s.delete( grandchild2 );
+		s.delete( grandchild3 );
+		s.delete( child );
+		s.delete( child2 );
+		s.delete( root );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+	}
+
+	public void testMergeDeepTreeWithGeneratedId() throws Exception {
+
+		clearCounts();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		NumberedNode root = new NumberedNode( "root" );
+		NumberedNode child = new NumberedNode( "child" );
+		NumberedNode grandchild = new NumberedNode( "grandchild" );
+		root.addChild( child );
+		child.addChild( grandchild );
+		root = ( NumberedNode ) s.merge( root );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( NumberedNode ) getOldToNewEntityRefMap().get( root );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 3 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		child = ( NumberedNode ) root.getChildren().iterator().next();
+		grandchild = ( NumberedNode ) child.getChildren().iterator().next();
+		grandchild.setDescription( "the grand child" );
+		NumberedNode grandchild2 = new NumberedNode( "grandchild2" );
+		child.addChild( grandchild2 );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		root = ( NumberedNode ) s.merge( root );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( NumberedNode ) getOldToNewEntityRefMap().get( root );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( 1 );
+		clearCounts();
+
+		getSessions().evict( NumberedNode.class );
+
+		NumberedNode child2 = new NumberedNode( "child2" );
+		NumberedNode grandchild3 = new NumberedNode( "grandchild3" );
+		child2.addChild( grandchild3 );
+		root.addChild( child2 );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		root = ( NumberedNode ) s.merge( root );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( NumberedNode ) getOldToNewEntityRefMap().get( root );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s.createQuery( "delete from NumberedNode where name like 'grand%'" ).executeUpdate();
+		s.createQuery( "delete from NumberedNode where name like 'child%'" ).executeUpdate();
+		s.createQuery( "delete from NumberedNode" ).executeUpdate();
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+	}
+
+	public void testMergeTree() throws Exception {
+
+		clearCounts();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		Node root = new Node( "root" );
+		Node child = new Node( "child" );
+		root.addChild( child );
+		s.persist( root );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( Node ) getOldToNewEntityRefMap().get( root );
+		child = ( Node ) root.getChildren().iterator().next();
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 2 );
+		clearCounts();
+
+		root.setDescription( "The root node" );
+		child.setDescription( "The child node" );
+
+		Node secondChild = new Node( "second child" );
+
+		root.addChild( secondChild );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s.merge( root );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( 2 );
+
+		cleanup();
+	}
+
+	public void testMergeTreeWithGeneratedId() throws Exception {
+
+		clearCounts();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		NumberedNode root = new NumberedNode( "root" );
+		NumberedNode child = new NumberedNode( "child" );
+		root.addChild( child );
+		s.persist( root );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( NumberedNode ) getOldToNewEntityRefMap().get( root );
+		child = ( NumberedNode ) root.getChildren().iterator().next();
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 2 );
+		clearCounts();
+
+		root.setDescription( "The root node" );
+		child.setDescription( "The child node" );
+
+		NumberedNode secondChild = new NumberedNode( "second child" );
+
+		root.addChild( secondChild );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s.merge( root );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( 2 );
+
+		cleanup();
+	}
+
+	public void testMergeManaged() throws Exception {
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		NumberedNode root = new NumberedNode( "root" );
+		s.persist( root );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( NumberedNode ) getOldToNewEntityRefMap().get( root );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		clearCounts();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		NumberedNode child = new NumberedNode( "child" );
+		root = ( NumberedNode ) s.merge( root );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( NumberedNode ) getOldToNewEntityRefMap().get( root );
+		root.addChild( child );
+		assertSame( root, s.merge( root ) );
+		Object mergedChild = root.getChildren().iterator().next();
+		assertNotSame( mergedChild, child );
+		assertTrue( s.contains( mergedChild ) );
+		assertFalse( s.contains( child ) );
+		assertEquals( root.getChildren().size(), 1 );
+		assertTrue( root.getChildren().contains( mergedChild ) );
+		//assertNotSame( mergedChild, s.merge(child) ); //yucky :(
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( NumberedNode ) getOldToNewEntityRefMap().get( root );
+		mergedChild = root.getChildren().iterator().next();
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( 0 );
+
+		assertEquals( root.getChildren().size(), 1 );
+		assertTrue( root.getChildren().contains( mergedChild ) );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		assertEquals(
+				s.createCriteria( NumberedNode.class )
+						.setProjection( Projections.rowCount() )
+						.uniqueResult(),
+				new Long( 2 )
+		);
+
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		cleanup();
+	}
+
+	public void testMergeManagedUninitializedCollection() throws Exception {
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		NumberedNode root = new NumberedNode( "root" );
+		root.addChild( new NumberedNode( "child" ) );
+		s.persist( root );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		clearCounts();
+
+		NumberedNode newRoot = new NumberedNode( "root" );
+		newRoot.setId( root.getId() );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		root = ( NumberedNode ) s.get( NumberedNode.class, root.getId() );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( NumberedNode ) getOldToNewEntityRefMap().get( root );
+		Set managedChildren = root.getChildren();
+		assertFalse( Hibernate.isInitialized( managedChildren ) );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( NumberedNode ) getOldToNewEntityRefMap().get( root );
+		managedChildren = root.getChildren();
+		newRoot.setChildren( managedChildren );
+		assertSame( root, s.merge( newRoot ) );
+		assertSame( managedChildren, root.getChildren() );
+		assertFalse( Hibernate.isInitialized( managedChildren ) );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 0 );
+		assertUpdateCount( 0 );
+		assertDeleteCount( 0 );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		assertEquals(
+				s.createCriteria( NumberedNode.class )
+						.setProjection( Projections.rowCount() )
+						.uniqueResult(),
+				new Long( 2 )
+		);
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		cleanup();
+	}
+
+	public void testMergeManagedInitializedCollection() throws Exception {
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		NumberedNode root = new NumberedNode( "root" );
+		root.addChild( new NumberedNode( "child" ) );
+		s.persist( root );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		clearCounts();
+
+		NumberedNode newRoot = new NumberedNode( "root" );
+		newRoot.setId( root.getId() );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		root = ( NumberedNode ) s.get( NumberedNode.class, root.getId() );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( NumberedNode ) getOldToNewEntityRefMap().get( root );
+		Set managedChildren = root.getChildren();
+		Hibernate.initialize( managedChildren );
+		assertTrue( Hibernate.isInitialized( managedChildren ) );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( NumberedNode ) getOldToNewEntityRefMap().get( root );
+		managedChildren = root.getChildren();
+		newRoot.setChildren( managedChildren );
+		assertSame( root, s.merge( newRoot ) );
+		assertSame( managedChildren, root.getChildren() );
+		assertTrue( Hibernate.isInitialized( managedChildren ) );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 0 );
+		assertUpdateCount( 0 );
+		assertDeleteCount( 0 );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		assertEquals(
+				s.createCriteria( NumberedNode.class )
+						.setProjection( Projections.rowCount() )
+						.uniqueResult(),
+				new Long( 2 )
+		);
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		cleanup();
+	}
+
+	public void testRecursiveMergeTransient() throws Exception {
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		Employer jboss = new Employer();
+		Employee gavin = new Employee();
+		jboss.setEmployees( new ArrayList() );
+		jboss.getEmployees().add( gavin );
+		s.merge( jboss );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		s.flush();
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		jboss = ( Employer ) s.createQuery( "from Employer e join fetch e.employees" ).uniqueResult();
+		assertTrue( Hibernate.isInitialized( jboss.getEmployees() ) );
+		assertEquals( 1, jboss.getEmployees().size() );
+		s.clear();
+		s.merge( jboss.getEmployees().iterator().next() );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		cleanup();
+	}
+
+	public void testDeleteAndMerge() throws Exception {
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		Employer jboss = new Employer();
+		s.persist( jboss );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		Employer otherJboss;
+		otherJboss = ( Employer ) s.get( Employer.class, jboss.getId() );
+		s.delete( otherJboss );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		jboss.setVers( new Integer( 1 ) );
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s.merge( jboss );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		cleanup();
+	}
+
+	public void testMergeManyToManyWithCollectionDeference() throws Exception {
+		// setup base data...
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		Competition competition = new Competition();
+		competition.getCompetitors().add( new Competitor( "Name" ) );
+		competition.getCompetitors().add( new Competitor() );
+		competition.getCompetitors().add( new Competitor() );
+		s.persist( competition );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		// the competition graph is now detached:
+		//   1) create a new List reference to represent the competitors
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		List newComp = new ArrayList();
+		Competitor originalCompetitor = ( Competitor ) competition.getCompetitors().get( 0 );
+		originalCompetitor.setName( "Name2" );
+		newComp.add( originalCompetitor );
+		newComp.add( new Competitor() );
+		//   2) set that new List reference unto the Competition reference
+		competition.setCompetitors( newComp );
+		//   3) attempt the merge
+		Competition competition2 = ( Competition ) s.merge( competition );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		Competition competition2copy = ( Competition ) getOldToNewEntityRefMap().get( competition2 );
+
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertFalse( competition == competition2 );
+		assertFalse( competition2 == competition2copy );
+		assertFalse( competition.getCompetitors() == competition2.getCompetitors() );
+		assertEquals( 2, competition2.getCompetitors().size() );
+		assertEquals( 2, competition2copy.getCompetitors().size() );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		competition = ( Competition ) s.get( Competition.class, competition.getId() );
+		assertEquals( 2, competition.getCompetitors().size() );
+		s.delete( competition );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		cleanup();
+	}
+
+	private void cleanup() throws Exception {
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		s.createQuery( "delete from NumberedNode where parent is not null" ).executeUpdate();
+		s.createQuery( "delete from NumberedNode" ).executeUpdate();
+
+		s.createQuery( "delete from Node where parent is not null" ).executeUpdate();
+		s.createQuery( "delete from Node" ).executeUpdate();
+
+		s.createQuery( "delete from VersionedEntity where parent is not null" ).executeUpdate();
+		s.createQuery( "delete from VersionedEntity" ).executeUpdate();
+		s.createQuery( "delete from TimestampedEntity" ).executeUpdate();
+
+		s.createQuery( "delete from Competitor" ).executeUpdate();
+		s.createQuery( "delete from Competition" ).executeUpdate();
+
+		Iterator itr = s.createQuery( "from Employer" ).list().iterator();
+		while ( itr.hasNext() ) {
+			final Employer employer = ( Employer ) itr.next();
+			s.delete( employer );
+		}
+
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+	}
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/MergeTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Node.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Node.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Node.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,51 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.nonflushedchanges">
+
+    <class name="Node" polymorphism="explicit">
+        <id name="name">
+            <generator class="assigned"/>
+        </id>
+        <property name="description"/>
+        <many-to-one name="parent"/>
+        <property name="created" not-null="true"/>
+        <set name="children"
+             inverse="true"
+             cascade="persist,merge,save-update,evict">
+            <key column="parent"/>
+            <one-to-many class="Node"/>
+        </set>
+        <set name="cascadingChildren" inverse="false" cascade="persist,merge,save-update,evict,delete">
+            <key column="CASC_PARENT"/>
+            <one-to-many class="Node"/>
+        </set>
+    </class>
+
+    <class name="NumberedNode" polymorphism="explicit">
+        <id name="id" unsaved-value="0">
+            <generator class="native"/>
+        </id>
+        <property name="name">
+            <column name="name" index="iname" not-null="true"/>
+        </property>
+        <property name="description"/>
+        <property name="created" not-null="true"
+                  type="imm_date"/>
+        <many-to-one name="parent" class="NumberedNode"/>
+        <set name="children"
+             inverse="true"
+             cascade="persist,merge,save-update">
+            <key column="parent"/>
+            <one-to-many class="NumberedNode"/>
+        </set>
+    </class>
+
+</hibernate-mapping>
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Node.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Node.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Node.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Node.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,89 @@
+//$Id: Node.java 10759 2006-11-08 00:00:53Z steve.ebersole at jboss.com $
+package org.hibernate.test.nonflushedchanges;
+
+import java.io.Serializable;
+import java.sql.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author Gavin King, Gail Badner (adapted this from "ops" tests version)
+ */
+public class Node implements Serializable {
+
+	private String name;
+	private String description;
+	private Date created;
+	private Node parent;
+	private Set children = new HashSet();
+	private Set cascadingChildren = new HashSet();
+
+	public Node() {
+	}
+
+	public Node(String name) {
+		this.name = name;
+		created = generateCurrentDate();
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getDescription() {
+		return description;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
+	public Date getCreated() {
+		return created;
+	}
+
+	public void setCreated(Date created) {
+		this.created = created;
+	}
+
+	public Node getParent() {
+		return parent;
+	}
+
+	public void setParent(Node parent) {
+		this.parent = parent;
+	}
+
+	public Set getChildren() {
+		return children;
+	}
+
+	public void setChildren(Set children) {
+		this.children = children;
+	}
+
+	public Node addChild(Node child) {
+		children.add( child );
+		child.setParent( this );
+		return this;
+	}
+
+	public Set getCascadingChildren() {
+		return cascadingChildren;
+	}
+
+	public void setCascadingChildren(Set cascadingChildren) {
+		this.cascadingChildren = cascadingChildren;
+	}
+
+	private Date generateCurrentDate() {
+		// Note : done as java.sql.Date mainly to work around issue with
+		// MySQL and its lack of milli-second precision on its DATETIME
+		// and TIMESTAMP datatypes.
+		return new Date( new java.util.Date().getTime() );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Node.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/NumberedNode.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/NumberedNode.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/NumberedNode.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,83 @@
+//$Id: NumberedNode.java 7236 2005-06-20 03:19:34Z oneovthafew $
+package org.hibernate.test.nonflushedchanges;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author Gavin King, Gail Badner (adapted this from "ops" tests version)
+ */
+public class NumberedNode implements Serializable {
+
+	private long id;
+	private String name;
+	private NumberedNode parent;
+	private Set children = new HashSet();
+	private String description;
+	private Date created;
+
+	public NumberedNode() {
+		super();
+	}
+
+	public NumberedNode(String name) {
+		this.name = name;
+		created = new Date();
+	}
+
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	public Set getChildren() {
+		return children;
+	}
+
+	public void setChildren(Set children) {
+		this.children = children;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public NumberedNode getParent() {
+		return parent;
+	}
+
+	public void setParent(NumberedNode parent) {
+		this.parent = parent;
+	}
+
+	public NumberedNode addChild(NumberedNode child) {
+		children.add( child );
+		child.setParent( this );
+		return this;
+	}
+
+	public String getDescription() {
+		return description;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
+	public Date getCreated() {
+		return created;
+	}
+
+	public void setCreated(Date created) {
+		this.created = created;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/NumberedNode.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/OneToOne.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/OneToOne.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/OneToOne.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,43 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+ Mappings demonstrating bidirectional one-to-one mappings for testing
+ with various operations.
+
+ Person -> Address is modeled as a bidirectional one to one based on FK.
+ Person -> Details is modeled as a bidirectional one to one based on PK.
+-->
+
+<hibernate-mapping package="org.hibernate.test.nonflushedchanges">
+
+    <class name="Person" table="OPS_PERSON">
+        <id name="id" column="ID" type="long">
+            <generator class="increment"/>
+        </id>
+        <property name="name" column="NAME" type="string"/>
+        <one-to-one name="address" class="Address" property-ref="resident"/>
+        <one-to-one name="details" class="PersonalDetails" cascade="all"/>
+    </class>
+
+    <class name="Address" table="OPS_ADDRESS">
+        <id name="id" column="ID" type="long">
+            <generator class="increment"/>
+        </id>
+        <property name="streetAddress" column="STREET" type="string"/>
+        <property name="city" column="CITY" type="string"/>
+        <property name="country" column="CTRY" type="string"/>
+        <many-to-one name="resident" column="RESIDENT" class="Person"/>
+    </class>
+
+    <class name="PersonalDetails" table="OPS_PERS_DETAIL">
+        <id name="id" column="ID" type="long">
+            <generator class="increment"/>
+        </id>
+        <property name="somePersonalDetail" column="SOME_DETAIL" type="string"/>
+        <one-to-one name="person" class="Person" cascade="none" constrained="true"/>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/OneToOne.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/OptLockEntity.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/OptLockEntity.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/OptLockEntity.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.nonflushedchanges">
+
+    <class name="VersionedEntity" table="V_ENTITY">
+        <id name="id" column="ID" type="string">
+            <generator class="assigned"/>
+        </id>
+        <version name="version" column="VERS" type="long"/>
+        <property name="name" column="NAME" type="string"/>
+        <many-to-one name="parent" class="VersionedEntity"/>
+        <set name="children"
+             inverse="true"
+             cascade="persist,merge,save-update,evict,delete">
+            <key column="parent"/>
+            <one-to-many class="VersionedEntity"/>
+        </set>
+    </class>
+
+    <class name="TimestampedEntity" table="T_ENTITY">
+        <id name="id" column="ID" type="string">
+            <generator class="assigned"/>
+        </id>
+        <timestamp name="timestamp" column="TS"/>
+        <property name="name" column="NAME" type="string"/>
+    </class>
+
+</hibernate-mapping>
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/OptLockEntity.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,54 @@
+package org.hibernate.test.nonflushedchanges;
+
+import java.io.Serializable;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole, Gail Badner (adapted this from "ops" tests version)
+ */
+public class Person implements Serializable {
+	private Long id;
+	private String name;
+	private Address address;
+	private PersonalDetails details;
+
+	public Person() {
+	}
+
+	public Person(String name) {
+		this.name = name;
+	}
+
+	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 Address getAddress() {
+		return address;
+	}
+
+	public void setAddress(Address address) {
+		this.address = address;
+	}
+
+	public PersonalDetails getDetails() {
+		return details;
+	}
+
+	public void setDetails(PersonalDetails details) {
+		this.details = details;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/Person.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/PersonalDetails.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/PersonalDetails.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/PersonalDetails.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,47 @@
+package org.hibernate.test.nonflushedchanges;
+
+import java.io.Serializable;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole, Gail Badner (adapted this from "ops" tests version)
+ */
+public class PersonalDetails implements Serializable {
+	private Long id;
+	private String somePersonalDetail;
+	private Person person;
+
+	public PersonalDetails() {
+	}
+
+	public PersonalDetails(String somePersonalDetail, Person person) {
+		this.somePersonalDetail = somePersonalDetail;
+		this.person = person;
+		person.setDetails( this );
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getSomePersonalDetail() {
+		return somePersonalDetail;
+	}
+
+	public void setSomePersonalDetail(String somePersonalDetail) {
+		this.somePersonalDetail = somePersonalDetail;
+	}
+
+	public Person getPerson() {
+		return person;
+	}
+
+	public void setPerson(Person person) {
+		this.person = person;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/PersonalDetails.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/SaveOrUpdateTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/SaveOrUpdateTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/SaveOrUpdateTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,510 @@
+//$Id: SaveOrUpdateTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.nonflushedchanges;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.HibernateException;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.criterion.Projections;
+import org.hibernate.intercept.FieldInterceptionHelper;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.proxy.HibernateProxy;
+import org.hibernate.testing.tm.SimpleJtaTransactionManagerImpl;
+
+/**
+ * @author Gavin King, Gail Badner (adapted this from "ops" tests version)
+ */
+public class SaveOrUpdateTest extends AbstractOperationTestCase {
+
+	public SaveOrUpdateTest(String str) {
+		super( str );
+	}
+
+	public void testSaveOrUpdateDeepTree() throws Exception {
+		clearCounts();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		Node root = new Node( "root" );
+		Node child = new Node( "child" );
+		Node grandchild = new Node( "grandchild" );
+		root.addChild( child );
+		child.addChild( grandchild );
+		s.saveOrUpdate( root );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( Node ) getOldToNewEntityRefMap().get( root );
+		child = ( Node ) getOldToNewEntityRefMap().get( child );
+		grandchild = ( Node ) getOldToNewEntityRefMap().get( grandchild );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 3 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		grandchild.setDescription( "the grand child" );
+		Node grandchild2 = new Node( "grandchild2" );
+		child.addChild( grandchild2 );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s.saveOrUpdate( root );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( Node ) getOldToNewEntityRefMap().get( root );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( 1 );
+		clearCounts();
+
+		Node child2 = new Node( "child2" );
+		Node grandchild3 = new Node( "grandchild3" );
+		child2.addChild( grandchild3 );
+		root.addChild( child2 );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s.saveOrUpdate( root );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s.delete( grandchild );
+		s.delete( grandchild2 );
+		s.delete( grandchild3 );
+		s.delete( child );
+		s.delete( child2 );
+		s.delete( root );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+	}
+
+	public void testSaveOrUpdateDeepTreeWithGeneratedId() throws Exception {
+		boolean instrumented = FieldInterceptionHelper.isInstrumented( new NumberedNode() );
+		clearCounts();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		NumberedNode root = new NumberedNode( "root" );
+		NumberedNode child = new NumberedNode( "child" );
+		NumberedNode grandchild = new NumberedNode( "grandchild" );
+		root.addChild( child );
+		child.addChild( grandchild );
+		s.saveOrUpdate( root );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( NumberedNode ) getOldToNewEntityRefMap().get( root );
+		child = ( NumberedNode ) getOldToNewEntityRefMap().get( child );
+		grandchild = ( NumberedNode ) getOldToNewEntityRefMap().get( grandchild );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 3 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		child = ( NumberedNode ) root.getChildren().iterator().next();
+		grandchild = ( NumberedNode ) child.getChildren().iterator().next();
+		grandchild.setDescription( "the grand child" );
+		NumberedNode grandchild2 = new NumberedNode( "grandchild2" );
+		child.addChild( grandchild2 );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s.saveOrUpdate( root );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( NumberedNode ) getOldToNewEntityRefMap().get( root );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( instrumented ? 1 : 3 );
+		clearCounts();
+
+		NumberedNode child2 = new NumberedNode( "child2" );
+		NumberedNode grandchild3 = new NumberedNode( "grandchild3" );
+		child2.addChild( grandchild3 );
+		root.addChild( child2 );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s.saveOrUpdate( root );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( instrumented ? 0 : 4 );
+		clearCounts();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s.createQuery( "delete from NumberedNode where name like 'grand%'" ).executeUpdate();
+		s.createQuery( "delete from NumberedNode where name like 'child%'" ).executeUpdate();
+		s.createQuery( "delete from NumberedNode" ).executeUpdate();
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+	}
+
+	public void testSaveOrUpdateTree() throws Exception {
+		clearCounts();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		Node root = new Node( "root" );
+		Node child = new Node( "child" );
+		root.addChild( child );
+		s.saveOrUpdate( root );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( Node ) getOldToNewEntityRefMap().get( root );
+		child = ( Node ) getOldToNewEntityRefMap().get( child );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 2 );
+		clearCounts();
+
+		root.setDescription( "The root node" );
+		child.setDescription( "The child node" );
+
+		Node secondChild = new Node( "second child" );
+
+		root.addChild( secondChild );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s.saveOrUpdate( root );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( 2 );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s.createQuery( "delete from Node where parent is not null" ).executeUpdate();
+		s.createQuery( "delete from Node" ).executeUpdate();
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+	}
+
+	public void testSaveOrUpdateTreeWithGeneratedId() throws Exception {
+		clearCounts();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		NumberedNode root = new NumberedNode( "root" );
+		NumberedNode child = new NumberedNode( "child" );
+		root.addChild( child );
+		s.saveOrUpdate( root );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( NumberedNode ) getOldToNewEntityRefMap().get( root );
+		child = ( NumberedNode ) getOldToNewEntityRefMap().get( child );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 2 );
+		clearCounts();
+
+		root.setDescription( "The root node" );
+		child.setDescription( "The child node" );
+
+		NumberedNode secondChild = new NumberedNode( "second child" );
+
+		root.addChild( secondChild );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s.saveOrUpdate( root );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( 2 );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s.createQuery( "delete from NumberedNode where parent is not null" ).executeUpdate();
+		s.createQuery( "delete from NumberedNode" ).executeUpdate();
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+	}
+
+	public void testSaveOrUpdateManaged() throws Exception {
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		NumberedNode root = new NumberedNode( "root" );
+		s.saveOrUpdate( root );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( NumberedNode ) getOldToNewEntityRefMap().get( root );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		root = ( NumberedNode ) s.get( NumberedNode.class, root.getId() );
+		NumberedNode child = new NumberedNode( "child" );
+		root.addChild( child );
+		s.saveOrUpdate( root );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( NumberedNode ) getOldToNewEntityRefMap().get( root );
+		assertNull( getOldToNewEntityRefMap().get( child ) );
+		s.flush();
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( NumberedNode ) getOldToNewEntityRefMap().get( root );
+		child = ( NumberedNode ) getOldToNewEntityRefMap().get( child );
+		child = ( NumberedNode ) root.getChildren().iterator().next();
+		assertTrue( s.contains( child ) );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( NumberedNode ) getOldToNewEntityRefMap().get( root );
+		child = ( NumberedNode ) getOldToNewEntityRefMap().get( child );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertTrue( root.getChildren().contains( child ) );
+		assertEquals( root.getChildren().size(), 1 );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		assertEquals(
+				s.createCriteria( NumberedNode.class )
+						.setProjection( Projections.rowCount() )
+						.uniqueResult(),
+				new Long( 2 )
+		);
+		s.delete( root );
+		s.delete( child );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+	}
+
+
+	public void testSaveOrUpdateGot() throws Exception {
+		boolean instrumented = FieldInterceptionHelper.isInstrumented( new NumberedNode() );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		NumberedNode root = new NumberedNode( "root" );
+		s.saveOrUpdate( root );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( NumberedNode ) getOldToNewEntityRefMap().get( root );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s.saveOrUpdate( root );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( NumberedNode ) getOldToNewEntityRefMap().get( root );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 0 );
+		assertUpdateCount( instrumented ? 0 : 1 );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		root = ( NumberedNode ) s.get( NumberedNode.class, new Long( root.getId() ) );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( NumberedNode ) getOldToNewEntityRefMap().get( root );
+		Hibernate.initialize( root.getChildren() );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( NumberedNode ) getOldToNewEntityRefMap().get( root );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		clearCounts();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		NumberedNode child = new NumberedNode( "child" );
+		root.addChild( child );
+		s.saveOrUpdate( root );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( NumberedNode ) getOldToNewEntityRefMap().get( root );
+		assertTrue( Hibernate.isInitialized( root.getChildren() ) );
+		child = ( NumberedNode ) root.getChildren().iterator().next();
+		assertTrue( s.contains( child ) );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( instrumented ? 0 : 1 );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		assertEquals(
+				s.createCriteria( NumberedNode.class )
+						.setProjection( Projections.rowCount() )
+						.uniqueResult(),
+				new Long( 2 )
+		);
+		s.delete( root );
+		s.delete( child );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+	}
+
+	public void testSaveOrUpdateGotWithMutableProp() throws Exception {
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		Node root = new Node( "root" );
+		s.saveOrUpdate( root );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( Node ) getOldToNewEntityRefMap().get( root );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s.saveOrUpdate( root );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( Node ) getOldToNewEntityRefMap().get( root );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 0 );
+		assertUpdateCount( 0 );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		root = ( Node ) s.get( Node.class, "root" );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( Node ) getOldToNewEntityRefMap().get( root );
+		Hibernate.initialize( root.getChildren() );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( Node ) getOldToNewEntityRefMap().get( root );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		clearCounts();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		Node child = new Node( "child" );
+		root.addChild( child );
+		s.saveOrUpdate( root );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( Node ) getOldToNewEntityRefMap().get( root );
+		child = ( Node ) root.getChildren().iterator().next();
+		assertTrue( s.contains( child ) );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		root = ( Node ) getOldToNewEntityRefMap().get( root );
+		child = ( Node ) getOldToNewEntityRefMap().get( child );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertInsertCount( 1 );
+		//assertUpdateCount( 1 ); //note: will fail here if no second-level cache
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		assertEquals(
+				s.createCriteria( Node.class )
+						.setProjection( Projections.rowCount() )
+						.uniqueResult(),
+				new Long( 2 )
+		);
+		s.delete( root );
+		s.delete( child );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+	}
+
+	public void testEvictThenSaveOrUpdate() throws Exception {
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		Node parent = new Node( "1:parent" );
+		Node child = new Node( "2:child" );
+		Node grandchild = new Node( "3:grandchild" );
+		parent.addChild( child );
+		child.addChild( grandchild );
+		s.saveOrUpdate( parent );
+		s = applyNonFlushedChangesToNewSessionCloseOldSession( s );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s1 = openSession();
+		child = ( Node ) s1.load( Node.class, "2:child" );
+		s1 = applyNonFlushedChangesToNewSessionCloseOldSession( s1 );
+		child = ( Node ) getOldToNewEntityRefMap().get( child );
+		assertTrue( s1.contains( child ) );
+		assertFalse( Hibernate.isInitialized( child ) );
+		assertTrue( s1.contains( child.getParent() ) );
+		assertTrue( Hibernate.isInitialized( child ) );
+		assertFalse( Hibernate.isInitialized( child.getChildren() ) );
+		assertFalse( Hibernate.isInitialized( child.getParent() ) );
+		assertTrue( s1.contains( child ) );
+		s1 = applyNonFlushedChangesToNewSessionCloseOldSession( s1 );
+		// child is an initialized proxy; after serialization, it is
+		// the proxy is replaced by its implementation
+		// TODO: find out if this is how this should work...
+		child = ( Node ) getOldToNewEntityRefMap().get(
+				( ( HibernateProxy ) child ).getHibernateLazyInitializer().getImplementation()
+		);
+		s1.evict( child );
+		assertFalse( s1.contains( child ) );
+		assertTrue( s1.contains( child.getParent() ) );
+
+		javax.transaction.Transaction tx1 = SimpleJtaTransactionManagerImpl.getInstance().suspend();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s2 = openSession();
+		try {
+			s2.getTransaction().begin();
+			s2.saveOrUpdate( child );
+			fail();
+		}
+		catch ( HibernateException ex ) {
+			// expected because parent is connected to s1
+		}
+		finally {
+			SimpleJtaTransactionManagerImpl.getInstance().rollback();
+		}
+
+		s1.evict( child.getParent() );
+		assertFalse( s1.contains( child.getParent() ) );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s2 = openSession();
+ 		s2.saveOrUpdate( child );
+		s2 = applyNonFlushedChangesToNewSessionCloseOldSession( s2 );
+		child = ( Node ) getOldToNewEntityRefMap().get( child );
+		assertTrue( s2.contains( child ) );
+		assertFalse( s1.contains( child ) );
+		assertTrue( s2.contains( child.getParent() ) );
+		assertFalse( s1.contains( child.getParent() ) );
+		assertFalse( Hibernate.isInitialized( child.getChildren() ) );
+		assertFalse( Hibernate.isInitialized( child.getParent() ) );
+		assertEquals( 1, child.getChildren().size() );
+		assertEquals( "1:parent", child.getParent().getName() );
+		assertTrue( Hibernate.isInitialized( child.getChildren() ) );
+		assertFalse( Hibernate.isInitialized( child.getParent() ) );
+		assertNull( child.getParent().getDescription() );
+		assertTrue( Hibernate.isInitialized( child.getParent() ) );
+		s1 = applyNonFlushedChangesToNewSessionCloseOldSession( s1 );
+		s2 = applyNonFlushedChangesToNewSessionCloseOldSession( s2 );
+
+		javax.transaction.Transaction tx2 = SimpleJtaTransactionManagerImpl.getInstance().suspend();
+		SimpleJtaTransactionManagerImpl.getInstance().resume( tx1 );
+		tx1.commit();
+
+		SimpleJtaTransactionManagerImpl.getInstance().resume( tx2 );
+		tx2.commit();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s.delete( s.get( Node.class, "3:grandchild" ) );
+		s.delete( s.get( Node.class, "2:child" ) );
+		s.delete( s.get( Node.class, "1:parent" ) );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+	}
+
+	public void configure(Configuration cfg) {
+		super.configure( cfg );
+		cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
+		cfg.setProperty( Environment.STATEMENT_BATCH_SIZE, "0" );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "nonflushedchanges/Node.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( SaveOrUpdateTest.class );
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/SaveOrUpdateTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/TimestampedEntity.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/TimestampedEntity.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/TimestampedEntity.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,48 @@
+package org.hibernate.test.nonflushedchanges;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * todo: describe TimestampedEntity
+ *
+ * @author Steve Ebersole, Gail Badner (adapted this from "ops" tests version)
+ */
+public class TimestampedEntity implements Serializable {
+	private String id;
+	private String name;
+	private Date timestamp;
+
+	public TimestampedEntity() {
+	}
+
+	public TimestampedEntity(String id, String name) {
+		this.id = id;
+		this.name = name;
+	}
+
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Date getTimestamp() {
+		return timestamp;
+	}
+
+	public void setTimestamp(Date timestamp) {
+		this.timestamp = timestamp;
+	}
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/TimestampedEntity.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/VersionedEntity.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/VersionedEntity.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/VersionedEntity.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,67 @@
+package org.hibernate.test.nonflushedchanges;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * VersionedEntity
+ *
+ * @author Steve Ebersole, Gail Badner (adapted this from "ops" tests version)
+ */
+public class VersionedEntity implements Serializable {
+	private String id;
+	private String name;
+	private long version;
+
+	private VersionedEntity parent;
+	private Set children = new HashSet();
+
+	public VersionedEntity() {
+	}
+
+	public VersionedEntity(String id, String name) {
+		this.id = id;
+		this.name = name;
+	}
+
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public long getVersion() {
+		return version;
+	}
+
+	public void setVersion(long version) {
+		this.version = version;
+	}
+
+	public VersionedEntity getParent() {
+		return parent;
+	}
+
+	public void setParent(VersionedEntity parent) {
+		this.parent = parent;
+	}
+
+	public Set getChildren() {
+		return children;
+	}
+
+	public void setChildren(Set children) {
+		this.children = children;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/nonflushedchanges/VersionedEntity.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ondelete/Address.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ondelete/Address.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ondelete/Address.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,11 @@
+//$Id: Address.java 7119 2005-06-12 22:03:30Z oneovthafew $
+package org.hibernate.test.ondelete;
+
+/**
+ * @author Gavin King
+ */
+public class Address {
+	public String address;
+	public String zip;
+	public String country;
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ondelete/Address.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ondelete/Employee.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ondelete/Employee.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ondelete/Employee.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,49 @@
+//$Id: Employee.java 7119 2005-06-12 22:03:30Z oneovthafew $
+package org.hibernate.test.ondelete;
+
+import java.math.BigDecimal;
+
+/**
+ * @author Gavin King
+ */
+public class Employee extends Person {
+	private String title;
+	private BigDecimal salary;
+	private Employee manager;
+	/**
+	 * @return Returns the title.
+	 */
+	public String getTitle() {
+		return title;
+	}
+	/**
+	 * @param title The title to set.
+	 */
+	public void setTitle(String title) {
+		this.title = title;
+	}
+	/**
+	 * @return Returns the manager.
+	 */
+	public Employee getManager() {
+		return manager;
+	}
+	/**
+	 * @param manager The manager to set.
+	 */
+	public void setManager(Employee manager) {
+		this.manager = manager;
+	}
+	/**
+	 * @return Returns the salary.
+	 */
+	public BigDecimal getSalary() {
+		return salary;
+	}
+	/**
+	 * @param salary The salary to set.
+	 */
+	public void setSalary(BigDecimal salary) {
+		this.salary = salary;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ondelete/Employee.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ondelete/OnDeleteTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ondelete/OnDeleteTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ondelete/OnDeleteTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,92 @@
+//$Id: OnDeleteTest.java 15728 2008-12-26 22:59:25Z gbadner $
+package org.hibernate.test.ondelete;
+
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.stat.Statistics;
+
+/**
+ * @author Gavin King
+ */
+public class OnDeleteTest extends FunctionalTestCase {
+	
+	public OnDeleteTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "ondelete/Person.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setProperty(Environment.GENERATE_STATISTICS, "true");
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( OnDeleteTest.class );
+	}
+	
+	public void testJoinedSubclass() {
+		if ( ! supportsCircularCascadeDelete() ) {
+			return;
+		}
+
+		Statistics statistics = getSessions().getStatistics();
+		statistics.clear();
+		
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		
+		Salesperson mark = new Salesperson();
+		mark.setName("Mark");
+		mark.setTitle("internal sales");
+		mark.setSex('M');
+		mark.setAddress("buckhead");
+		mark.setZip("30305");
+		mark.setCountry("USA");
+		
+		Person joe = new Person();
+		joe.setName("Joe");
+		joe.setAddress("San Francisco");
+		joe.setZip("XXXXX");
+		joe.setCountry("USA");
+		joe.setSex('M');
+		joe.setSalesperson(mark);
+		mark.getCustomers().add(joe);
+				
+		s.save(mark);
+		
+		t.commit();
+		
+		assertEquals( statistics.getEntityInsertCount(), 2 );
+		assertEquals( statistics.getPrepareStatementCount(), 5 );
+		
+		statistics.clear();
+		
+		t = s.beginTransaction();
+		s.delete(mark);
+		t.commit();
+
+		assertEquals( statistics.getEntityDeleteCount(), 2 );
+		if ( getDialect().supportsCascadeDelete() ) {
+			assertEquals( statistics.getPrepareStatementCount(), 1 );
+		}
+		
+		t = s.beginTransaction();
+		List names = s.createQuery("select name from Person").list();
+		assertTrue( names.isEmpty() );
+		t.commit();
+
+		s.close();
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ondelete/OnDeleteTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ondelete/Person.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ondelete/Person.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ondelete/Person.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,67 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+  This mapping demonstrates the use of database-level
+  cascade delete.
+     
+-->
+
+<hibernate-mapping 
+	package="org.hibernate.test.ondelete"
+	default-access="field">
+	
+	<class name="Person" table="ODPerson">
+		
+		<id name="id" 
+				column="person_id">
+			<generator class="increment"/>
+		</id>
+				
+		<property name="name" 
+				not-null="true"
+				length="80"/>
+		<property name="sex" 
+				not-null="true"
+				update="false"/>
+		
+		<component name="address">
+			<property name="address"/>
+			<property name="zip"/>
+			<property name="country"/>
+		</component>
+		
+		<many-to-one name="salesperson"
+					column="salesperson_id"/>
+		
+		<joined-subclass name="Employee" table="ODEmployee">
+			<key column="person_id" 
+					on-delete="cascade"/>
+			<property name="title" 
+					not-null="true" 
+					length="20"/>
+			<property name="salary" 
+					length="0"/>
+			<many-to-one name="manager"/>
+			
+			<joined-subclass name="Salesperson" table="ODSalesperson">
+				<key column="employee_id" 
+						on-delete="cascade"/>
+				<set name="customers" 
+						inverse="true" 
+						cascade="all">
+					<key column="salesperson_id" 
+							on-delete="cascade"/>
+					<one-to-many class="Person"/>
+				</set>
+			</joined-subclass>
+			
+		</joined-subclass>
+				
+	</class>
+	
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ondelete/Person.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ondelete/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ondelete/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ondelete/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,79 @@
+//$Id: Person.java 7119 2005-06-12 22:03:30Z oneovthafew $
+package org.hibernate.test.ondelete;
+
+
+/**
+ * @author Gavin King
+ */
+public class Person {
+	private long id;
+	private String name;
+	private char sex;
+	private Address address = new Address();
+	private Salesperson salesperson;
+	/**
+	 * @return Returns the address.
+	 */
+	public Address getAddress() {
+		return address;
+	}
+
+	public void setAddress(String string) {
+		this.address.address = string;
+	}
+
+	public void setZip(String string) {
+		this.address.zip = string;
+	}
+
+	public void setCountry(String string) {
+		this.address.country = string;
+	}
+
+	
+	/**
+	 * @return Returns the sex.
+	 */
+	public char getSex() {
+		return sex;
+	}
+	/**
+	 * @param sex The sex to set.
+	 */
+	public void setSex(char sex) {
+		this.sex = sex;
+	}
+	/**
+	 * @return Returns the id.
+	 */
+	public long getId() {
+		return id;
+	}
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(long id) {
+		this.id = id;
+	}
+	/**
+	 * @return Returns the identity.
+	 */
+	public String getName() {
+		return name;
+	}
+	/**
+	 * @param identity The identity to set.
+	 */
+	public void setName(String identity) {
+		this.name = identity;
+	}
+
+	public Salesperson getSalesperson() {
+		return salesperson;
+	}
+
+	public void setSalesperson(Salesperson salesperson) {
+		this.salesperson = salesperson;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ondelete/Person.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ondelete/Salesperson.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ondelete/Salesperson.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ondelete/Salesperson.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,18 @@
+//$Id: Salesperson.java 7119 2005-06-12 22:03:30Z oneovthafew $
+package org.hibernate.test.ondelete;
+
+import java.util.HashSet;
+import java.util.Set;
+
+public class Salesperson extends Employee {
+	private Set customers = new HashSet();
+
+	public Set getCustomers() {
+		return customers;
+	}
+
+	public void setCustomers(Set customers) {
+		this.customers = customers;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ondelete/Salesperson.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/AbstractRecursiveBidirectionalOneToManyTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/AbstractRecursiveBidirectionalOneToManyTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/AbstractRecursiveBidirectionalOneToManyTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,156 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.onetomany;
+
+import java.util.ArrayList;
+
+import org.hibernate.CacheMode;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+
+/**
+ * @author Burkhard Graves, Gail Badner
+ */
+
+public abstract class AbstractRecursiveBidirectionalOneToManyTest extends FunctionalTestCase {
+
+    /*
+	 *  What is done:
+	 *    ___                   ___
+	 *   |   |                 |   |
+	 *    -> 1                  -> 1
+	 *       |   -transform->     / \
+	 *       2                   2   3
+	 *       |
+	 *     	 3
+	 *
+	 */
+
+	public AbstractRecursiveBidirectionalOneToManyTest(String str) {
+		super(str);
+	}
+
+	public org.hibernate.classic.Session openSession() {
+		org.hibernate.classic.Session s = super.openSession();
+		s.setCacheMode( getSessionCacheMode() );
+		return s;
+	}
+
+	protected abstract CacheMode getSessionCacheMode();
+
+	public String[] getMappings() {
+		return new String[] { "onetomany/Node.hbm.xml" };
+	}	
+
+    public void testOneToManyMoveElement() {
+        init();
+        transformMove();
+        check();
+		delete();
+    }
+
+	public void testOneToManyReplaceList() {
+		init();
+		transformReplace();
+		check();
+		delete();
+	}
+
+    void init() {
+
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+
+	    Node node1 = new Node( 1 );
+	    Node node2 = new Node( 2 );
+		Node node3 = new Node( 3 );
+
+	    node1.addSubNode( node2 );
+	    node2.addSubNode( node3 );
+
+	    s.save(node1);
+
+		tx.commit();
+        s.close();
+	}
+
+	void transformMove() {
+
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+
+		Node node3 = (Node) s.load(Node.class, new Integer(3));
+		Node node2 = node3.getParentNode();
+		Node node1 = node2.getParentNode();
+
+		node2.removeSubNode( node3 );
+		node1.addSubNode( node3 );
+
+		tx.commit();
+		s.close();
+	}
+
+	void transformReplace() {
+
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+
+		Node node3 = (Node) s.load(Node.class, new Integer(3));
+		Node node2 = node3.getParentNode();
+		Node node1 = node2.getParentNode();
+
+		node2.removeSubNode( node3 );
+		node1.setSubNodes(  new ArrayList() );
+		node1.addSubNode( node2 );
+		node1.addSubNode( node3 );
+
+		tx.commit();
+		s.close();
+	}
+
+	void check() {
+
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Node node3 = (Node) s.get(Node.class, new Integer(3));
+
+		// fails with 2nd level cache enabled
+		assertEquals(1, node3.getParentNode().getId().intValue());
+
+		tx.commit();
+		s.close();
+	}
+
+	void delete() {
+
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Node node1 = ( Node ) s.get(  Node.class, new Integer( 1 ) );
+		s.delete( node1 );
+		tx.commit();
+		s.close();
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/AbstractRecursiveBidirectionalOneToManyTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/Child.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/Child.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/Child.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,47 @@
+//$Id: Child.java 4378 2004-08-19 10:12:11Z oneovthafew $
+package org.hibernate.test.onetomany;
+
+/**
+ * @author gavin
+ */
+public class Child {
+	private Long id;
+	private String name;
+	private Parent parent;
+	/**
+	 * @return Returns the id.
+	 */
+	public Long getId() {
+		return id;
+	}
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(Long id) {
+		this.id = id;
+	}
+	/**
+	 * @return Returns the name.
+	 */
+	public String getName() {
+		return name;
+	}
+	/**
+	 * @param name The name to set.
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+	/**
+	 * @return Returns the parent.
+	 */
+	public Parent getParent() {
+		return parent;
+	}
+	/**
+	 * @param parent The parent to set.
+	 */
+	public void setParent(Parent parent) {
+		this.parent = parent;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/Child.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/Node.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/Node.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/Node.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.onetomany">
+    <class name="Node"
+           table="Node">
+        <cache usage="read-write" region="Node.entities"/>
+        <id name="id" column="id" type="java.lang.Integer">
+            <!--<generator class="native"/> -->
+        </id>
+        <many-to-one name="parentNode"
+                     class="Node"
+                     column="node_id"
+                     lazy="proxy"
+                     not-null="false"
+                     insert="false"
+                     update="false"
+
+                     />
+        <list name="subNodes" cascade="all">
+            <key column="node_id"/>
+            <list-index column="idx"/>
+            <one-to-many class="Node"/>
+        </list>
+    </class>
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/Node.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/Node.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/Node.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/Node.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,78 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.onetomany;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.ArrayList;
+
+public class Node implements Serializable {
+
+	private Integer id;
+
+	private Node parentNode;
+	private List subNodes = new ArrayList();
+
+	public Node() {
+	}
+
+	public Node(int id) {
+		setId( id );
+	}
+
+    public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public Node getParentNode() {
+		return parentNode;
+	}
+
+	public void setParentNode(Node parentNode) {
+		this.parentNode = parentNode;
+	}
+
+	public List getSubNodes() {
+		return subNodes;
+	}
+
+	public void setSubNodes(List subNodes) {
+		this.subNodes = subNodes;
+	}
+
+	public void addSubNode(Node subNode) {
+		subNodes.add( subNode );
+		subNode.setParentNode( this );
+	}
+
+	public void removeSubNode(Node subNode) {
+		subNodes.remove( subNode );
+		subNode.setParentNode( null );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/Node.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/OneToManyTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/OneToManyTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/OneToManyTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,94 @@
+//$Id: OneToManyTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.onetomany;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class OneToManyTest extends FunctionalTestCase {
+	
+	public OneToManyTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "onetomany/Parent.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( OneToManyTest.class );
+	}
+	
+	public void testOneToManyLinkTable() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Child c = new Child();
+		c.setName("Child One");
+		Parent p = new Parent();
+		p.setName("Parent");
+		p.getChildren().add(c);
+		c.setParent(p);
+		s.save(p);
+		s.flush();
+		
+		p.getChildren().remove(c);
+		c.setParent(null);
+		s.flush();
+		
+		p.getChildren().add(c);
+		c.setParent(p);
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		c.setParent(null);
+		s.update(c);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c.setParent(p);
+		s.update(c);
+		t.commit();
+		s.close();
+
+		
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Child) s.createQuery("from Child").uniqueResult();
+		s.createQuery("from Child c left join fetch c.parent").list();
+		s.createQuery("from Child c inner join fetch c.parent").list();
+		s.clear();
+		p = (Parent) s.createQuery("from Parent p left join fetch p.children").uniqueResult();
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery("delete from Child").executeUpdate();
+		s.createQuery("delete from Parent").executeUpdate();		
+		t.commit();
+		s.close();
+
+	}
+
+	public void testManyToManySize() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		//this test raise an exception right now HHH-570
+		assertEquals( 0, s.createQuery("from Parent p where size(p.children) = 0").list().size() );
+		assertEquals( 0, s.createQuery("from Parent p where p.children.size = 0").list().size() );
+		t.commit();
+		s.close();
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/OneToManyTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/Parent.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/Parent.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/Parent.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,49 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+  This mapping demonstrates how to use an "inverse" join
+  to map an association table as an association with 
+  one-to-many multiplicity at the level of the object
+  model.
+     
+-->
+
+<hibernate-mapping 
+	package="org.hibernate.test.onetomany">
+
+	<class name="Parent">
+		<id name="id" 
+			column="parent_id">
+			<generator class="increment"/>
+		</id>
+		<property name="name"/>
+		<set name="children" 
+			table="ParentChild" 
+			cascade="all"
+			inverse="true">
+			<key column="parent_id"/>
+			<many-to-many column="child_id" 
+				class="Child"/>
+		</set>
+	</class>
+	
+	<class name="Child">
+		<id name="id" 
+			column="child_id">
+			<generator class="increment"/>
+		</id>
+		<property name="name"/>
+		<join table="ParentChild" 
+			optional="true">
+			<key column="child_id"/>
+			<many-to-one name="parent" 
+				column="parent_id" 
+				not-null="true"/>
+		</join>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/Parent.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/Parent.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/Parent.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/Parent.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,50 @@
+//$Id: Parent.java 4378 2004-08-19 10:12:11Z oneovthafew $
+package org.hibernate.test.onetomany;
+
+import java.util.Collection;
+import java.util.HashSet;
+
+/**
+ * @author gavin
+ */
+public class Parent {
+	private Long id;
+	private String name;
+	private Collection children = new HashSet();
+	/**
+	 * @return Returns the children.
+	 */
+	public Collection getChildren() {
+		return children;
+	}
+	/**
+	 * @param children The children to set.
+	 */
+	public void setChildren(Collection children) {
+		this.children = children;
+	}
+	/**
+	 * @return Returns the id.
+	 */
+	public Long getId() {
+		return id;
+	}
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(Long id) {
+		this.id = id;
+	}
+	/**
+	 * @return Returns the name.
+	 */
+	public String getName() {
+		return name;
+	}
+	/**
+	 * @param name The name to set.
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/Parent.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/RecursiveBidirectionalOneToManyCacheTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/RecursiveBidirectionalOneToManyCacheTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/RecursiveBidirectionalOneToManyCacheTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,84 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.onetomany;
+
+import junit.framework.Test;
+
+import org.hibernate.CacheMode;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Burkhard Graves, Gail Badner
+ */
+
+public class RecursiveBidirectionalOneToManyCacheTest extends AbstractRecursiveBidirectionalOneToManyTest {
+
+    /*
+	 *  What is done:
+	 *    ___                   ___
+	 *   |   |                 |   |
+	 *    -> 1                  -> 1
+	 *       |   -transform->     / \
+	 *       2                   2   3
+	 *       |
+	 *     	 3
+	 *
+	 * Commenting out
+	 * @Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
+	 * in Node.java makes the assertion true (in check() below).
+	 */
+
+	public RecursiveBidirectionalOneToManyCacheTest(String str) {
+		super(str);
+	}
+
+	protected CacheMode getSessionCacheMode() {
+			return CacheMode.NORMAL;
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( RecursiveBidirectionalOneToManyCacheTest.class );
+	}
+
+    public void testOneToManyMoveElement() {
+		reportSkip( "non-inverse one-to-many known to fail with 2nd-level cache", "cache support");
+    }
+
+	// HHH-2350
+	public void testOneToManyMoveElementFailureExpected() {
+		super.testOneToManyMoveElement();
+	}
+
+	public void testOneToManyReplaceList() {
+		reportSkip( "non-inverse one-to-many known to fail with 2nd-level cache", "cache support");
+	}
+
+	// HHH-2350
+	public void testOneToManyReplaceListFailureExpected() {
+		super.testOneToManyReplaceList();
+	}
+
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/RecursiveBidirectionalOneToManyCacheTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/RecursiveBidirectionalOneToManyNoCacheTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/RecursiveBidirectionalOneToManyNoCacheTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/RecursiveBidirectionalOneToManyNoCacheTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,68 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.onetomany;
+
+import junit.framework.Test;
+
+import org.hibernate.CacheMode;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Burkhard Graves, Gail Badner
+ */
+
+public class RecursiveBidirectionalOneToManyNoCacheTest extends AbstractRecursiveBidirectionalOneToManyTest {
+
+    /*
+	 *  What is done:
+	 *    ___                   ___
+	 *   |   |                 |   |
+	 *    -> 1                  -> 1
+	 *       |   -transform->     / \
+	 *       2                   2   3
+	 *       |
+	 *     	 3
+	 *
+	 * Commenting out
+	 * @Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
+	 * in Node.java makes the assertion true (in check() below).
+	 */
+
+	public RecursiveBidirectionalOneToManyNoCacheTest(String str) {
+		super(str);
+	}
+
+	public String getCacheConcurrencyStrategy() {
+			return null;
+	}
+	
+	protected CacheMode getSessionCacheMode() {
+			return CacheMode.IGNORE;
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( RecursiveBidirectionalOneToManyNoCacheTest.class );
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetomany/RecursiveBidirectionalOneToManyNoCacheTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/formula/Address.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/formula/Address.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/formula/Address.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,57 @@
+//$Id: Address.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.onetoone.formula;
+
+import java.io.Serializable;
+
+/**
+ * @author Gavin King
+ */
+public class Address implements Serializable {
+	private Person person;
+	private String type;
+	private String street;
+	private String state;
+	private String zip;
+	
+	public Person getPerson() {
+		return person;
+	}
+	public void setPerson(Person person) {
+		this.person = person;
+	}
+	public String getState() {
+		return state;
+	}
+	public void setState(String state) {
+		this.state = state;
+	}
+	public String getStreet() {
+		return street;
+	}
+	public void setStreet(String street) {
+		this.street = street;
+	}
+	public String getType() {
+		return type;
+	}
+	public void setType(String type) {
+		this.type = type;
+	}
+	public String getZip() {
+		return zip;
+	}
+	public void setZip(String zip) {
+		this.zip = zip;
+	}
+	
+	public boolean equals(Object that) {
+		if ( !(that instanceof Address) ) return false;
+		Address address = (Address) that;
+		return address.getType().equals(type) && 
+			address.getPerson().getName().equals( person.getName() );
+	}
+	
+	public int hashCode() {
+		return person.getName().hashCode() + type.hashCode();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/formula/Address.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/formula/OneToOneFormulaTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/formula/OneToOneFormulaTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/formula/OneToOneFormulaTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,164 @@
+//$Id: OneToOneFormulaTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.onetoone.formula;
+
+import junit.framework.Test;
+
+import org.hibernate.FetchMode;
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.criterion.Property;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class OneToOneFormulaTest extends FunctionalTestCase {
+	
+	public OneToOneFormulaTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "onetoone/formula/Person.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setProperty(Environment.USE_SECOND_LEVEL_CACHE, "false");
+		cfg.setProperty(Environment.GENERATE_STATISTICS, "true");
+		cfg.setProperty(Environment.DEFAULT_BATCH_FETCH_SIZE, "2");
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( OneToOneFormulaTest.class );
+	}
+	
+	public void testOneToOneFormula() {
+		Person p = new Person();
+		p.setName("Gavin King");
+		Address a = new Address();
+		a.setPerson(p);
+		a.setType("HOME");
+		a.setZip("3181");
+		a.setState("VIC");
+		a.setStreet("Karbarook Ave");
+		p.setAddress(a);
+		
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(p);
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		p = (Person) s.createQuery("from Person").uniqueResult();
+		
+		assertNotNull( p.getAddress() );
+		assertTrue( Hibernate.isInitialized( p.getAddress() ) );
+		assertNull( p.getMailingAddress() );
+
+		s.clear();
+
+		p = (Person) s.createQuery("from Person p left join fetch p.mailingAddress left join fetch p.address").uniqueResult();
+
+		assertNotNull( p.getAddress() );
+		assertTrue( Hibernate.isInitialized( p.getAddress() ) );
+		assertNull( p.getMailingAddress() );
+
+		s.clear();
+
+		p = (Person) s.createQuery("from Person p left join fetch p.address").uniqueResult();
+
+		assertNotNull( p.getAddress() );
+		assertTrue( Hibernate.isInitialized( p.getAddress() ) );
+		assertNull( p.getMailingAddress() );
+
+		s.clear();
+
+		p = (Person) s.createCriteria(Person.class)
+			.createCriteria("address")
+				.add( Property.forName("zip").eq("3181") )
+			.uniqueResult();
+		assertNotNull(p);
+		
+		s.clear();
+
+		p = (Person) s.createCriteria(Person.class)
+			.setFetchMode("address", FetchMode.JOIN)
+			.uniqueResult();
+
+		assertNotNull( p.getAddress() );
+		assertTrue( Hibernate.isInitialized( p.getAddress() ) );
+		assertNull( p.getMailingAddress() );
+		
+		s.clear();
+
+		p = (Person) s.createCriteria(Person.class)
+			.setFetchMode("mailingAddress", FetchMode.JOIN)
+			.uniqueResult();
+
+		assertNotNull( p.getAddress() );
+		assertTrue( Hibernate.isInitialized( p.getAddress() ) );
+		assertNull( p.getMailingAddress() );
+		
+		s.delete(p);
+		
+		t.commit();
+		s.close();
+		
+	}
+	
+	public void testOneToOneEmbeddedCompositeKey() {
+		Person p = new Person();
+		p.setName("Gavin King");
+		Address a = new Address();
+		a.setPerson(p);
+		a.setType("HOME");
+		a.setZip("3181");
+		a.setState("VIC");
+		a.setStreet("Karbarook Ave");
+		p.setAddress(a);
+		
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(p);
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		
+		a = new Address();
+		a.setType("HOME");
+		a.setPerson(p);
+		a = (Address) s.load(Address.class, a);
+		assertFalse( Hibernate.isInitialized(a) );
+		a.getPerson();
+		a.getType();
+		assertFalse( Hibernate.isInitialized(a) );
+		assertEquals(a.getZip(), "3181");
+		
+		s.clear();
+		
+		a = new Address();
+		a.setType("HOME");
+		a.setPerson(p);
+		Address a2 = (Address) s.get(Address.class, a);
+		assertTrue( Hibernate.isInitialized(a) );
+		assertSame(a2, a);
+		assertSame(a2.getPerson(), p); //this is a little bit desirable
+		assertEquals(a.getZip(), "3181");
+		
+		s.delete(a2);
+		s.delete( s.get( Person.class, p.getName() ) ); //this is certainly undesirable! oh well...
+		
+		t.commit();
+		s.close();
+		
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/formula/OneToOneFormulaTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/formula/Person.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/formula/Person.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/formula/Person.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.onetoone.formula">
+
+	<class name="Person">
+		<id name="name"/>
+		<one-to-one name="address" cascade="all" constrained="false">
+			<formula>name</formula>
+			<formula>'HOME'</formula>
+		</one-to-one>
+		<one-to-one name="mailingAddress" constrained="false">
+			<formula>name</formula>
+			<formula>'MAILING'</formula>
+		</one-to-one>
+	</class>
+	
+	<class name="Address" batch-size="2" 
+			check="addressType in ('MAILING', 'HOME', 'BUSINESS')">
+		<composite-id>
+			<key-many-to-one name="person" 
+					column="personName"/>
+			<key-property name="type" 
+					column="addressType"/>
+		</composite-id>
+		<property name="street" type="text"/>
+		<property name="state"/>
+		<property name="zip"/>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/formula/Person.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/formula/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/formula/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/formula/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,42 @@
+//$Id: Person.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.onetoone.formula;
+
+import java.io.Serializable;
+
+/**
+ * @author Gavin King
+ */
+public class Person implements Serializable {
+	private String name;
+	private Address address;
+	private Address mailingAddress;
+	
+	public Address getAddress() {
+		return address;
+	}
+	public void setAddress(Address address) {
+		this.address = address;
+	}
+	public Address getMailingAddress() {
+		return mailingAddress;
+	}
+	public void setMailingAddress(Address mailingAddress) {
+		this.mailingAddress = mailingAddress;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public boolean equals(Object that) {
+		if ( !(that instanceof Person) ) return false;
+		Person person = (Person) that;
+		return person.getName().equals(name);
+	}
+	
+	public int hashCode() {
+		return name.hashCode();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/formula/Person.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/joined/Address.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/joined/Address.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/joined/Address.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,16 @@
+//$Id: Address.java 9914 2006-05-09 09:37:18Z max.andersen at jboss.com $
+package org.hibernate.test.onetoone.joined;
+
+/**
+ * @author Gavin King
+ */
+public class Address {
+	public String entityName;
+	public String street;
+	public String state;
+	public String zip;
+	
+	public String toString() {
+		return this.getClass() + ":" + street;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/joined/Address.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/joined/Entity.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/joined/Entity.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/joined/Entity.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,9 @@
+//$Id: Entity.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.onetoone.joined;
+
+/**
+ * @author Gavin King
+ */
+public class Entity {
+	public String name;
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/joined/Entity.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/joined/JoinedSubclassOneToOneTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/joined/JoinedSubclassOneToOneTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/joined/JoinedSubclassOneToOneTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,159 @@
+//$Id: JoinedSubclassOneToOneTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.onetoone.joined;
+
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.stat.EntityStatistics;
+
+/**
+ * @author Gavin King
+ */
+public class JoinedSubclassOneToOneTest extends FunctionalTestCase {
+	
+	public JoinedSubclassOneToOneTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "onetoone/joined/Person.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setProperty(Environment.USE_SECOND_LEVEL_CACHE, "false");
+		cfg.setProperty(Environment.GENERATE_STATISTICS, "true");
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( JoinedSubclassOneToOneTest.class );
+	}
+
+	public void testOneToOneOnSubclass() {
+		Person p = new Person();
+		p.name = "Gavin";
+		Address a = new Address();
+		a.entityName = "Gavin";
+		a.zip = "3181";
+		a.state = "VIC";
+		a.street = "Karbarook Ave";
+		p.address = a;
+		
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(p);
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		
+		EntityStatistics addressStats = getSessions().getStatistics().getEntityStatistics( Address.class.getName() );
+		EntityStatistics mailingAddressStats = getSessions().getStatistics().getEntityStatistics("MailingAddress");
+
+		p = (Person) s.createQuery("from Person p join fetch p.address left join fetch p.mailingAddress").uniqueResult();
+		assertNotNull(p.address); assertNull(p.mailingAddress);
+		s.clear();
+
+		p = (Person) s.createQuery("select p from Person p join fetch p.address left join fetch p.mailingAddress").uniqueResult();
+		assertNotNull(p.address); assertNull(p.mailingAddress);
+		s.clear();
+
+		Object[] stuff = (Object[]) s.createQuery("select p.name, p from Person p join fetch p.address left join fetch p.mailingAddress").uniqueResult();
+		assertEquals(stuff.length, 2);
+		p = (Person) stuff[1];
+		assertNotNull(p.address); assertNull(p.mailingAddress);
+		s.clear();
+
+		assertEquals( addressStats.getFetchCount(), 0 );
+		assertEquals( mailingAddressStats.getFetchCount(), 0 );
+		
+		p = (Person) s.createQuery("from Person p join fetch p.address").uniqueResult();
+		assertNotNull(p.address); assertNull(p.mailingAddress);
+		s.clear();
+		
+		assertEquals( addressStats.getFetchCount(), 0 );
+		assertEquals( mailingAddressStats.getFetchCount(), 1 );
+
+		p = (Person) s.createQuery("from Person").uniqueResult();
+		assertNotNull(p.address); assertNull(p.mailingAddress);
+		s.clear();
+		
+		assertEquals( addressStats.getFetchCount(), 0 );
+		assertEquals( mailingAddressStats.getFetchCount(), 2 );
+
+		p = (Person) s.createQuery("from Entity").uniqueResult();
+		assertNotNull(p.address); assertNull(p.mailingAddress);
+		s.clear();
+		
+		assertEquals( addressStats.getFetchCount(), 0 );
+		assertEquals( mailingAddressStats.getFetchCount(), 3 );
+
+		//note that in here join fetch is used for the nullable
+		//one-to-one, due to a very special case of default
+		p = (Person) s.get(Person.class, "Gavin");
+		assertNotNull(p.address); assertNull(p.mailingAddress);
+		s.clear();
+		
+		assertEquals( addressStats.getFetchCount(), 0 );
+		assertEquals( mailingAddressStats.getFetchCount(), 3 );
+
+		p = (Person) s.get(Entity.class, "Gavin");
+		assertNotNull(p.address); assertNull(p.mailingAddress);
+		s.clear();
+		
+		assertEquals( addressStats.getFetchCount(), 0 );
+		assertEquals( mailingAddressStats.getFetchCount(), 3 );
+		
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		Org org = new Org();
+		org.name = "IFA";
+		Address a2 = new Address();
+		a2.entityName = "IFA";
+		a2.zip = "3181";
+		a2.state = "VIC";
+		a2.street = "Orrong Rd";
+		s.persist(org);
+		s.persist(a2);
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		org = (Org) s.get(Entity.class, "IFA");
+		s.clear();
+		
+		List list = s.createQuery("from Entity e order by e.name").list();
+		p = (Person) list.get(0);
+		assertNotNull(p.address); assertNull(p.mailingAddress);
+		org = (Org) list.get(1);
+		s.clear();
+		
+		list = s.createQuery("from Entity e left join fetch e.address left join fetch e.mailingAddress order by e.name").list();
+		p = (Person) list.get(0);
+		org = (Org) list.get(1);
+		assertNotNull(p.address); assertNull(p.mailingAddress);
+		
+		s.clear();
+		s.delete(p);
+		s.delete( p.address );
+		s.delete( org );
+		s.delete( a2 );
+		s.flush();
+		t.commit();
+		s.close();
+		
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/joined/JoinedSubclassOneToOneTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/joined/Org.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/joined/Org.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/joined/Org.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,9 @@
+//$Id: Org.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.onetoone.joined;
+
+
+/**
+ * @author Gavin King
+ */
+public class Org extends Entity {
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/joined/Org.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/joined/Person.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/joined/Person.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/joined/Person.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,40 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping 
+	package="org.hibernate.test.onetoone.joined"
+	default-access="field">
+
+	<class name="Entity">
+		<id name="name"/>
+		<joined-subclass name="Person">
+			<key column="entityName"/>
+			<one-to-one name="address" 
+				cascade="all" 
+				constrained="true"/>
+			<one-to-one name="mailingAddress" 
+				cascade="all"
+				entity-name="MailingAddress"/>
+		</joined-subclass>
+		<joined-subclass name="Org">
+			<key column="entityName"/>
+		</joined-subclass>
+	</class>
+	
+	<class name="Address">
+		<id name="entityName"/>
+		<property name="street"/>
+		<property name="state"/>
+		<property name="zip"/>
+	</class>
+
+	<class name="Address" entity-name="MailingAddress">
+		<id name="entityName"/>
+		<property name="street"/>
+		<property name="state"/>
+		<property name="zip"/>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/joined/Person.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/joined/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/joined/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/joined/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,10 @@
+//$Id: Person.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.onetoone.joined;
+
+/**
+ * @author Gavin King
+ */
+public class Person extends Entity {
+	public Address address;
+	public Address mailingAddress;
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/joined/Person.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/link/Customer.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/link/Customer.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/link/Customer.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,22 @@
+//$Id: Customer.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.onetoone.link;
+
+/**
+ * @author Gavin King
+ */
+public class Customer {
+	private Long id;
+	private Person person;
+	public Person getPerson() {
+		return person;
+	}
+	public void setPerson(Person person) {
+		this.person = person;
+	}
+	public Long getId() {
+		return id;
+	}
+	public void setId(Long id) {
+		this.id = id;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/link/Customer.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/link/Employee.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/link/Employee.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/link/Employee.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,22 @@
+//$Id: Employee.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.onetoone.link;
+
+/**
+ * @author Gavin King
+ */
+public class Employee {
+	private Long id;
+	private Person person;
+	public Person getPerson() {
+		return person;
+	}
+	public void setPerson(Person person) {
+		this.person = person;
+	}
+	public Long getId() {
+		return id;
+	}
+	public void setId(Long id) {
+		this.id = id;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/link/Employee.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/link/OneToOneLinkTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/link/OneToOneLinkTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/link/OneToOneLinkTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,91 @@
+//$Id: OneToOneLinkTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.onetoone.link;
+
+import java.util.Date;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class OneToOneLinkTest extends FunctionalTestCase {
+	
+	public OneToOneLinkTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "onetoone/link/Person.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( OneToOneLinkTest.class );
+	}
+	
+	public void testOneToOneViaAssociationTable() {
+		Person p = new Person();
+		p.setName("Gavin King");
+		p.setDob( new Date() );
+		Employee e = new Employee();
+		p.setEmployee(e);
+		e.setPerson(p);
+		
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(p);
+		t.commit();
+		s.close();
+	
+		s = openSession();
+		t = s.beginTransaction();
+		e = (Employee) s.createQuery("from Employee e where e.person.name like 'Gavin%'").uniqueResult();
+		assertEquals( e.getPerson().getName(), "Gavin King" );
+		assertFalse( Hibernate.isInitialized( e.getPerson() ) );
+		assertNull( e.getPerson().getCustomer() );
+		s.clear();
+
+		e = (Employee) s.createQuery("from Employee e where e.person.dob = :date")
+			.setDate("date", new Date() )
+			.uniqueResult();
+		assertEquals( e.getPerson().getName(), "Gavin King" );
+		assertFalse( Hibernate.isInitialized( e.getPerson() ) );
+		assertNull( e.getPerson().getCustomer() );
+		s.clear();
+		
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+
+		e = (Employee) s.createQuery("from Employee e join fetch e.person p left join fetch p.customer").uniqueResult();
+		assertTrue( Hibernate.isInitialized( e.getPerson() ) );
+		assertNull( e.getPerson().getCustomer() );
+		Customer c = new Customer();
+		e.getPerson().setCustomer(c);
+		c.setPerson( e.getPerson() );
+		
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+
+		e = (Employee) s.createQuery("from Employee e join fetch e.person p left join fetch p.customer").uniqueResult();
+		assertTrue( Hibernate.isInitialized( e.getPerson() ) );
+		assertTrue( Hibernate.isInitialized( e.getPerson().getCustomer() ) );
+		assertNotNull( e.getPerson().getCustomer() );
+		s.delete(e);
+		t.commit();
+		s.close();
+		
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/link/OneToOneLinkTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/link/Person.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/link/Person.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/link/Person.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,69 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+	
+	<!-- 
+		
+		Demonstrates the mapping of two subtyping one-to-one relationships 
+		to association tables using <many-to-one> nested inside <join>.
+		Note that the <join> elements specify optional="true", and that
+		there is an inverse="true" side of both joins.	
+		
+	-->
+
+<hibernate-mapping package="org.hibernate.test.onetoone.link">
+
+	<class name="Person">
+		<id name="name"/>
+		<property name="dob" type="date"/>
+		<join table="employeePerson" 
+		        inverse="true" 
+		        optional="true">
+			<key column="personId" unique="true"/>
+			<many-to-one name="employee" 
+				column="employeeId" 
+				cascade="all" 
+				not-null="true"/>
+		</join>
+		<join table="customerPerson" 
+		        inverse="true" 
+		        optional="true">
+			<key column="personId" unique="true"/>
+			<many-to-one name="customer" 
+				column="customerId" 
+				cascade="all" 
+				not-null="true"/>
+		</join>
+	</class>
+	
+	<class name="Employee">
+		<id name="id" column="employeeId">
+			<generator class="native"/>
+		</id>
+		<join table="employeePerson" 
+		        optional="true">
+			<key column="employeeId"/>
+			<many-to-one name="person" 
+				column="personId" 
+				cascade="all" 
+				not-null="true"
+				unique="true"/>
+		</join>
+	</class>
+
+	<class name="Customer">
+		<id name="id" column="customerId">
+			<generator class="native"/>
+		</id>
+		<join table="customerPerson" optional="true">
+			<key column="customerId"/>
+			<many-to-one name="person" 
+				column="personId" 
+				cascade="all" 
+				not-null="true"
+				unique="true"/>
+		</join>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/link/Person.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/link/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/link/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/link/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,38 @@
+//$Id: Person.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.onetoone.link;
+
+import java.util.Date;
+
+/**
+ * @author Gavin King
+ */
+public class Person {
+	private String name;
+	private Date dob;
+	private Employee employee;
+	private Customer customer;
+	public Customer getCustomer() {
+		return customer;
+	}
+	public void setCustomer(Customer customer) {
+		this.customer = customer;
+	}
+	public Employee getEmployee() {
+		return employee;
+	}
+	public void setEmployee(Employee employee) {
+		this.employee = employee;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public Date getDob() {
+		return dob;
+	}
+	public void setDob(Date dob) {
+		this.dob = dob;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/link/Person.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/nopojo/DynamicMapOneToOneTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/nopojo/DynamicMapOneToOneTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/nopojo/DynamicMapOneToOneTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,82 @@
+//$Id: DynamicMapOneToOneTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.onetoone.nopojo;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import junit.framework.Test;
+
+import org.hibernate.EntityMode;
+import org.hibernate.Session;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.stat.EntityStatistics;
+
+/**
+ * @author Gavin King
+ */
+public class DynamicMapOneToOneTest extends FunctionalTestCase {
+
+	public DynamicMapOneToOneTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "onetoone/nopojo/Person.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setProperty(Environment.USE_SECOND_LEVEL_CACHE, "false");
+		cfg.setProperty(Environment.GENERATE_STATISTICS, "true");
+		cfg.setProperty( Environment.DEFAULT_ENTITY_MODE, EntityMode.MAP.toString() );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( DynamicMapOneToOneTest.class );
+	}
+
+	public void testOneToOneOnSubclass() {
+		Map person = new HashMap();
+		person.put( "name", "Steve" );
+		Map address = new HashMap();
+		address.put( "zip", "12345" );
+		address.put( "state", "TX" );
+		address.put( "street", "123 Main St" );
+
+		person.put( "address", address );
+		address.put( "owner", person );
+
+		Session s = openSession();
+		s.beginTransaction();
+		s.persist( "Person", person );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+
+		EntityStatistics addressStats = getSessions().getStatistics().getEntityStatistics( "Address" );
+
+		person = ( Map ) s.createQuery( "from Person p join fetch p.address" ).uniqueResult();
+		assertNotNull( "could not locate person", person );
+		assertNotNull( "could not locate persons address", person.get( "address" ) );
+		s.clear();
+
+		Object[] tuple = ( Object[] ) s.createQuery( "select p.name, p from Person p join fetch p.address" ).uniqueResult();
+		assertEquals( tuple.length, 2 );
+		person = ( Map ) tuple[1];
+		assertNotNull( "could not locate person", person );
+		assertNotNull( "could not locate persons address", person.get( "address" ) );
+
+		s.delete( "Person", person );
+
+		s.getTransaction().commit();
+		s.close();
+
+		assertEquals( addressStats.getFetchCount(), 0 );
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/nopojo/DynamicMapOneToOneTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/nopojo/Person.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/nopojo/Person.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/nopojo/Person.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.onetoone.nopojo">
+
+	<class entity-name="Person">
+		<id name="id" type="long">
+            <generator class="foreign">
+                <param name="property">address</param>
+            </generator>
+        </id>
+        <property name="name" type="string"/>
+        <one-to-one name="address" cascade="all" entity-name="Address" constrained="true"/>
+	</class>
+	
+	<class entity-name="Address">
+		<id name="id" type="long">
+            <generator class="native"/>
+        </id>
+		<property name="street" type="string"/>
+		<property name="state" type="string"/>
+		<property name="zip" type="string"/>
+        <one-to-one name="owner" entity-name="Person" />
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/nopojo/Person.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/optional/Address.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/optional/Address.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/optional/Address.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,15 @@
+package org.hibernate.test.onetoone.optional;
+
+/**
+ * @author Gavin King
+ */
+public class Address {
+	public String entityName;
+	public String street;
+	public String state;
+	public String zip;
+
+	public String toString() {
+		return this.getClass() + ":" + street;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/optional/Address.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/optional/Entity.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/optional/Entity.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/optional/Entity.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,8 @@
+package org.hibernate.test.onetoone.optional;
+
+/**
+ * @author Gavin King
+ */
+public class Entity {
+	public String name;
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/optional/Entity.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/optional/OptionalOneToOneTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/optional/OptionalOneToOneTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/optional/OptionalOneToOneTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,50 @@
+package org.hibernate.test.onetoone.optional;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.Session;
+
+/**
+ * @author Gavin King
+ */
+public class OptionalOneToOneTest extends FunctionalTestCase {
+
+	public OptionalOneToOneTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "onetoone/optional/Person.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setProperty( Environment.USE_SECOND_LEVEL_CACHE, "false");
+		cfg.setProperty(Environment.GENERATE_STATISTICS, "true");
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( OptionalOneToOneTest.class );
+	}
+
+	public void testOptionalOneToOneRetrieval() {
+		Session s = openSession();
+		s.beginTransaction();
+		Person me = new Person();
+		me.name = "Steve";
+		s.save( me );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		me = ( Person ) s.load( Person.class, me.name );
+		assertNull( me.address );
+		s.delete( me );
+		s.getTransaction().commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/optional/OptionalOneToOneTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/optional/Org.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/optional/Org.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/optional/Org.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,8 @@
+package org.hibernate.test.onetoone.optional;
+
+
+/**
+ * @author Gavin King
+ */
+public class Org extends Entity {
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/optional/Org.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/optional/Person.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/optional/Person.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/optional/Person.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,38 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+    Demonstrates mapping an "optional" one-to-one association.  Basically
+    a (zero or one)-to-one.
+
+    Note that this is only conceptually possible on the non-constrained
+    side of the association (the side without the FK).
+
+    Also, it is impossible that the optional side be lazy; we must hit the
+    target table to determine whether a matching row actually exists or not.
+    This is so we can properly determine whether to use null or some value
+    for the association property's value.
+-->
+<hibernate-mapping package="org.hibernate.test.onetoone.optional" default-access="field">
+
+	<class name="Entity">
+		<id name="name"/>
+		<joined-subclass name="Person">
+			<key column="entityName"/>
+			<one-to-one name="address" cascade="all" constrained="false" outer-join="false" lazy="proxy"/>
+		</joined-subclass>
+		<joined-subclass name="Org">
+			<key column="entityName"/>
+		</joined-subclass>
+	</class>
+
+	<class name="Address">
+		<id name="entityName"/>
+		<property name="street"/>
+		<property name="state"/>
+		<property name="zip"/>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/optional/Person.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/optional/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/optional/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/optional/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,9 @@
+package org.hibernate.test.onetoone.optional;
+
+/**
+ * @author Gavin King
+ */
+public class Person extends Entity {
+	public Address address;
+	public Address mailingAddress;
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/optional/Person.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/singletable/Address.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/singletable/Address.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/singletable/Address.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,12 @@
+//$Id: Address.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.onetoone.singletable;
+
+/**
+ * @author Gavin King
+ */
+public class Address {
+	public String entityName;
+	public String street;
+	public String state;
+	public String zip;
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/singletable/Address.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/singletable/DiscrimSubclassOneToOneTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/singletable/DiscrimSubclassOneToOneTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/singletable/DiscrimSubclassOneToOneTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,148 @@
+//$Id: DiscrimSubclassOneToOneTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.onetoone.singletable;
+
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.stat.EntityStatistics;
+
+/**
+ * @author Gavin King
+ */
+public class DiscrimSubclassOneToOneTest extends FunctionalTestCase {
+	
+	public DiscrimSubclassOneToOneTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "onetoone/singletable/Person.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setProperty(Environment.USE_SECOND_LEVEL_CACHE, "false");
+		cfg.setProperty(Environment.GENERATE_STATISTICS, "true");
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( DiscrimSubclassOneToOneTest.class );
+	}
+	
+	public void testOneToOneOnSubclass() {
+		Person p = new Person();
+		p.name = "Gavin";
+		Address a = new Address();
+		a.entityName = "Gavin";
+		a.zip = "3181";
+		a.state = "VIC";
+		a.street = "Karbarook Ave";
+		p.address = a;
+		
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(p);
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		
+		EntityStatistics addressStats = getSessions().getStatistics().getEntityStatistics( Address.class.getName() );
+		EntityStatistics mailingAddressStats = getSessions().getStatistics().getEntityStatistics("MailingAddress");
+
+		p = (Person) s.createQuery("from Person p join fetch p.address left join fetch p.mailingAddress").uniqueResult();
+		assertNotNull(p.address); assertNull(p.mailingAddress);
+		s.clear();
+
+		assertEquals( addressStats.getFetchCount(), 0 );
+		assertEquals( mailingAddressStats.getFetchCount(), 0 );
+		
+		p = (Person) s.createQuery("from Person p join fetch p.address").uniqueResult();
+		assertNotNull(p.address); assertNull(p.mailingAddress);
+		s.clear();
+		
+		assertEquals( addressStats.getFetchCount(), 0 );
+		assertEquals( mailingAddressStats.getFetchCount(), 1 );
+
+		p = (Person) s.createQuery("from Person").uniqueResult();
+		assertNotNull(p.address); assertNull(p.mailingAddress);
+		s.clear();
+		
+		assertEquals( addressStats.getFetchCount(), 1 );
+		assertEquals( mailingAddressStats.getFetchCount(), 2 );
+
+		p = (Person) s.createQuery("from Entity").uniqueResult();
+		assertNotNull(p.address); assertNull(p.mailingAddress);
+		s.clear();
+		
+		assertEquals( addressStats.getFetchCount(), 2 );
+		assertEquals( mailingAddressStats.getFetchCount(), 3 );
+
+		//note that in here join fetch is used for the nullable
+		//one-to-one, due to a very special case of default
+		p = (Person) s.get(Person.class, "Gavin");
+		assertNotNull(p.address); assertNull(p.mailingAddress);
+		s.clear();
+		
+		assertEquals( addressStats.getFetchCount(), 2 );
+		assertEquals( mailingAddressStats.getFetchCount(), 3 );
+
+		p = (Person) s.get(Entity.class, "Gavin");
+		assertNotNull(p.address); assertNull(p.mailingAddress);
+		s.clear();
+		
+		assertEquals( addressStats.getFetchCount(), 2 );
+		assertEquals( mailingAddressStats.getFetchCount(), 3 );
+		
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		Org org = new Org();
+		org.name = "IFA";
+		Address a2 = new Address();
+		a2.entityName = "IFA";
+		a2.zip = "3181";
+		a2.state = "VIC";
+		a2.street = "Orrong Rd";
+		org.addresses.add(a2);
+		s.persist(org);
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		org = (Org) s.get(Entity.class, "IFA");
+		s.clear();
+		
+		List list = s.createQuery("from Entity e order by e.name").list();
+		p = (Person) list.get(0);
+		assertNotNull(p.address); assertNull(p.mailingAddress);
+		org = (Org) list.get(1);
+		assertEquals( org.addresses.size(), 1 );
+		s.clear();
+		
+		list = s.createQuery("from Entity e left join fetch e.address left join fetch e.mailingAddress order by e.name").list();
+		p = (Person) list.get(0);
+		org = (Org) list.get(1);
+		assertNotNull(p.address); assertNull(p.mailingAddress);
+		assertEquals( org.addresses.size(), 1 );
+		
+		s.delete(p);
+		s.delete(org);
+		
+		t.commit();
+		s.close();
+		
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/singletable/DiscrimSubclassOneToOneTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/singletable/Entity.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/singletable/Entity.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/singletable/Entity.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,9 @@
+//$Id: Entity.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.onetoone.singletable;
+
+/**
+ * @author Gavin King
+ */
+public class Entity {
+	public String name;
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/singletable/Entity.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/singletable/Org.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/singletable/Org.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/singletable/Org.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,12 @@
+//$Id: Org.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.onetoone.singletable;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author Gavin King
+ */
+public class Org extends Entity {
+	public Set addresses = new HashSet();
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/singletable/Org.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/singletable/Person.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/singletable/Person.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/singletable/Person.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,42 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping 
+	package="org.hibernate.test.onetoone.singletable"
+	default-access="field">
+
+	<class name="Entity">
+		<id name="name"/>
+		<discriminator type="string" column="subtype"/>
+		<subclass name="Person">
+			<one-to-one name="address" cascade="all"/>
+			<one-to-one name="mailingAddress" 
+				cascade="all"
+				entity-name="MailingAddress"/>
+		</subclass>
+		<subclass name="Org">
+			<set name="addresses" inverse="true" cascade="all-delete-orphan">
+				<key column="entityName"/>
+				<one-to-many class="Address"/>
+			</set>
+		</subclass>
+	</class>
+	
+	<class name="Address">
+		<id name="entityName"/>
+		
+		<property name="street"/>
+		<property name="state"/>
+		<property name="zip"/>
+	</class>
+
+	<class name="Address" entity-name="MailingAddress">
+		<id name="entityName"/>
+		<property name="street"/>
+		<property name="state"/>
+		<property name="zip"/>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/singletable/Person.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/singletable/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/singletable/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/singletable/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,10 @@
+//$Id: Person.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.onetoone.singletable;
+
+/**
+ * @author Gavin King
+ */
+public class Person extends Entity {
+	public Address address;
+	public Address mailingAddress;
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/onetoone/singletable/Person.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/AbstractOperationTestCase.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/AbstractOperationTestCase.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/AbstractOperationTestCase.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,48 @@
+package org.hibernate.test.ops;
+
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public abstract class AbstractOperationTestCase extends FunctionalTestCase {
+	public AbstractOperationTestCase(String name) {
+		super( name );
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setProperty( Environment.GENERATE_STATISTICS, "true");
+		cfg.setProperty( Environment.STATEMENT_BATCH_SIZE, "0" );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "ops/Node.hbm.xml", "ops/Employer.hbm.xml", "ops/OptLockEntity.hbm.xml", "ops/OneToOne.hbm.xml", "ops/Competition.hbm.xml" };
+	}
+
+	public String getCacheConcurrencyStrategy() {
+		return null;
+	}
+
+	protected void clearCounts() {
+		getSessions().getStatistics().clear();
+	}
+
+	protected void assertInsertCount(int expected) {
+		int inserts = ( int ) getSessions().getStatistics().getEntityInsertCount();
+		assertEquals( "unexpected insert count", expected, inserts );
+	}
+
+	protected void assertUpdateCount(int expected) {
+		int updates = ( int ) getSessions().getStatistics().getEntityUpdateCount();
+		assertEquals( "unexpected update counts", expected, updates );
+	}
+
+	protected void assertDeleteCount(int expected) {
+		int deletes = ( int ) getSessions().getStatistics().getEntityDeleteCount();
+		assertEquals( "unexpected delete counts", expected, deletes );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/AbstractOperationTestCase.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Address.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Address.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Address.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,65 @@
+package org.hibernate.test.ops;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class Address {
+	private Long id;
+	private String streetAddress;
+	private String city;
+	private String country;
+	private Person resident;
+
+	public Address() {
+	}
+
+	public Address(String streetAddress, String city, String country, Person resident) {
+		this.streetAddress = streetAddress;
+		this.city = city;
+		this.country = country;
+		this.resident = resident;
+		resident.setAddress( this );
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getStreetAddress() {
+		return streetAddress;
+	}
+
+	public void setStreetAddress(String streetAddress) {
+		this.streetAddress = streetAddress;
+	}
+
+	public String getCity() {
+		return city;
+	}
+
+	public void setCity(String city) {
+		this.city = city;
+	}
+
+	public String getCountry() {
+		return country;
+	}
+
+	public void setCountry(String country) {
+		this.country = country;
+	}
+
+	public Person getResident() {
+		return resident;
+	}
+
+	public void setResident(Person resident) {
+		this.resident = resident;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Address.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Competition.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Competition.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Competition.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+  
+-->
+
+<hibernate-mapping package="org.hibernate.test.ops">
+	
+	<class name="Competition">
+		<id name="id">
+			<generator class="native"/>
+		</id>
+        <list name="competitors" table="COMPET_ION_OR" cascade="persist,merge,delete">
+			<key column="TION_ID"/>
+			<list-index column="INDEX_COL"/>
+			<many-to-many class="Competitor" column="TOR_ID" />
+		</list>
+	</class>
+	
+	<class name="Competitor">
+		<id name="id">
+			<generator class="native"/>
+		</id>
+		<property name="name"/>
+	</class>
+	
+</hibernate-mapping>
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Competition.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Competition.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Competition.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Competition.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,31 @@
+//$Id: $
+package org.hibernate.test.ops;
+
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Competition {
+	private Integer id;
+
+	private List competitors = new ArrayList();
+
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public List getCompetitors() {
+		return competitors;
+	}
+
+	public void setCompetitors(List competitors) {
+		this.competitors = competitors;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Competition.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Competitor.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Competitor.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Competitor.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,34 @@
+//$Id: $
+package org.hibernate.test.ops;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Competitor {
+	public Integer id;
+	private String name;
+
+
+	public Competitor() {
+	}
+
+	public Competitor(String name) {
+		this.name = name;
+	}
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Competitor.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/CreateTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/CreateTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/CreateTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,218 @@
+//$Id: CreateTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.ops;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import junit.framework.Test;
+
+import org.hibernate.PersistentObjectException;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.exception.ConstraintViolationException;
+
+/**
+ * @author Gavin King
+ */
+public class CreateTest extends AbstractOperationTestCase {
+
+	public CreateTest(String str) {
+		super( str );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( CreateTest.class );
+	}
+
+	public void testNoUpdatesOnCreateVersionedWithCollection() {
+		clearCounts();
+
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		VersionedEntity root = new VersionedEntity( "root", "root" );
+		VersionedEntity child = new VersionedEntity( "c1", "child-1" );
+		root.getChildren().add( child );
+		child.setParent( root );
+		s.save(root);
+		tx.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		assertDeleteCount( 0 );
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.delete( root );
+		tx.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 2 );
+	}
+
+	public void testCreateTree() {
+
+		clearCounts();
+
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Node root = new Node("root");
+		Node child = new Node("child");
+		root.addChild(child);
+		s.persist(root);
+		tx.commit();
+		s.close();
+
+		assertInsertCount(2);
+		assertUpdateCount(0);
+
+		s = openSession();
+		tx = s.beginTransaction();
+		System.out.println("getting");
+		root = (Node) s.get(Node.class, "root");
+		Node child2 = new Node("child2");
+		root.addChild(child2);
+		System.out.println("committing");
+		tx.commit();
+		s.close();
+
+		assertInsertCount(3);
+		assertUpdateCount(0);
+	}
+
+	public void testCreateTreeWithGeneratedId() {
+
+		clearCounts();
+
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		NumberedNode root = new NumberedNode("root");
+		NumberedNode child = new NumberedNode("child");
+		root.addChild(child);
+		s.persist(root);
+		tx.commit();
+		s.close();
+
+		assertInsertCount(2);
+		assertUpdateCount(0);
+
+		s = openSession();
+		tx = s.beginTransaction();
+		root = (NumberedNode) s.get( NumberedNode.class, new Long( root.getId() ) );
+		NumberedNode child2 = new NumberedNode("child2");
+		root.addChild(child2);
+		tx.commit();
+		s.close();
+
+		assertInsertCount(3);
+		assertUpdateCount(0);
+	}
+
+	public void testCreateException() {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Node dupe = new Node("dupe");
+		s.persist(dupe);
+		s.persist(dupe);
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.persist(dupe);
+		try {
+			tx.commit();
+			assertFalse(true);
+		}
+		catch (ConstraintViolationException cve) {
+			//verify that an exception is thrown!
+		}
+		tx.rollback();
+		s.close();
+
+		Node nondupe = new Node("nondupe");
+		nondupe.addChild(dupe);
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.persist(nondupe);
+		try {
+			tx.commit();
+			assertFalse(true);
+		}
+		catch (ConstraintViolationException cve) {
+			//verify that an exception is thrown!
+		}
+		tx.rollback();
+		s.close();
+	}
+
+	public void testCreateExceptionWithGeneratedId() {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		NumberedNode dupe = new NumberedNode("dupe");
+		s.persist(dupe);
+		s.persist(dupe);
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		try {
+			s.persist(dupe);
+			assertFalse(true);
+		}
+		catch (PersistentObjectException poe) {
+			//verify that an exception is thrown!
+		}
+		tx.rollback();
+		s.close();
+
+		NumberedNode nondupe = new NumberedNode("nondupe");
+		nondupe.addChild(dupe);
+
+		s = openSession();
+		tx = s.beginTransaction();
+		try {
+			s.persist(nondupe);
+			assertFalse(true);
+		}
+		catch (PersistentObjectException poe) {
+			//verify that an exception is thrown!
+		}
+		tx.rollback();
+		s.close();
+	}
+
+	public void testBasic() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Employer er = new Employer();
+		Employee ee = new Employee();
+		s.persist(ee);
+		Collection erColl = new ArrayList();
+		Collection eeColl = new ArrayList();
+		erColl.add(ee);
+		eeColl.add(er);
+		er.setEmployees(erColl);
+		ee.setEmployers(eeColl);
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		er = (Employer) s.load(Employer.class, er.getId() );
+		assertNotNull(er);
+		assertNotNull( er.getEmployees() );
+		assertEquals( 1, er.getEmployees().size() );
+		Employee eeFromDb = (Employee) er.getEmployees().iterator().next();
+		assertEquals( ee.getId(), eeFromDb.getId() );
+		tx.commit();
+		s.close();
+	}
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/CreateTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/DeleteTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/DeleteTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/DeleteTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,91 @@
+package org.hibernate.test.ops;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class DeleteTest extends AbstractOperationTestCase {
+	public DeleteTest(String name) {
+		super( name );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( DeleteTest.class );
+	}
+
+	public void testDeleteVersionedWithCollectionNoUpdate() {
+		// test adapted from HHH-1564...
+		Session s = openSession();
+		s.beginTransaction();
+		VersionedEntity c = new VersionedEntity( "c1", "child-1" );
+		VersionedEntity p = new VersionedEntity( "root", "root");
+		p.getChildren().add( c );
+		c.setParent( p );
+		s.save( p );
+		s.getTransaction().commit();
+		s.close();
+
+		clearCounts();
+
+		s = openSession();
+		s.beginTransaction();
+        VersionedEntity loadedParent = ( VersionedEntity ) s.get( VersionedEntity.class, "root" );
+        s.delete( loadedParent );
+		s.getTransaction().commit();
+        s.close();
+
+		assertInsertCount( 0 );
+		assertUpdateCount( 0 );
+		assertDeleteCount( 2 );
+	}
+
+	public void testNoUpdateOnDelete() {
+		Session s = openSession();
+        s.beginTransaction();
+		Node node = new Node( "test" );
+		s.persist( node );
+		s.getTransaction().commit();
+		s.close();
+
+		clearCounts();
+
+		s = openSession();
+		s.beginTransaction();
+		s.delete( node );
+		s.getTransaction().commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertInsertCount( 0 );
+	}
+
+	public void testNoUpdateOnDeleteWithCollection() {
+		Session s = openSession();
+        s.beginTransaction();
+		Node parent = new Node( "parent" );
+		Node child = new Node( "child" );
+		parent.getCascadingChildren().add( child );
+		s.persist( parent );
+		s.getTransaction().commit();
+		s.close();
+
+		clearCounts();
+
+		s = openSession();
+		s.beginTransaction();
+		parent = ( Node ) s.get( Node.class, "parent" );
+		s.delete( parent );
+		s.getTransaction().commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertInsertCount( 0 );
+		assertDeleteCount( 2 );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/DeleteTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Employee.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Employee.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Employee.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,35 @@
+//$Id: Employee.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.ops;
+
+import java.util.Collection;
+import java.io.Serializable;
+
+
+/**
+ * Employee in an Employer-Employee relationship
+ * 
+ * @author Emmanuel Bernard
+ */
+
+public class Employee implements Serializable {
+	private Integer id;
+	private Collection employers;
+
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer integer) {
+		id = integer;
+	}
+	
+	
+	public Collection getEmployers() {
+		return employers;
+	}
+	
+	public void setEmployers(Collection employers) {
+		this.employers = employers;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Employee.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Employer.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Employer.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Employer.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,39 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+  
+-->
+
+<hibernate-mapping package="org.hibernate.test.ops">
+	
+	<class name="Employer" polymorphism="explicit">
+		<id name="id">
+			<generator class="native"/>
+		</id>
+        <version column="vers" name="vers"/>
+        <bag name="employees"
+			cascade="persist,merge"
+			table="EMPLOYER_EMPLOYEE">
+			<key column="EMPER_ID"/>
+			<many-to-many class="Employee" column="EMPEE_ID" />
+		</bag>
+	</class>
+	
+	<class name="Employee" polymorphism="explicit">
+		<id name="id">
+			<generator class="native"/>
+		</id>
+		<bag name="employers"
+			inverse="true"
+			cascade="persist,merge,save-update"
+			table="EMPLOYER_EMPLOYEE">
+			<key column="EMPEE_ID"/>
+			<many-to-many class="Employer" column="EMPER_ID" />
+		</bag>
+	</class>
+	
+</hibernate-mapping>
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Employer.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Employer.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Employer.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Employer.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,44 @@
+//$Id: Employer.java 8670 2005-11-25 17:36:29Z epbernard $
+package org.hibernate.test.ops;
+
+import java.util.Collection;
+import java.io.Serializable;
+
+
+/**
+ * Employer in a employer-Employee relationship
+ * 
+ * @author Emmanuel Bernard
+ */
+
+public class Employer implements Serializable {
+	private Integer id;
+	private Collection employees;
+	private Integer vers;
+
+	public Integer getVers() {
+		return vers;
+	}
+
+	public void setVers(Integer vers) {
+		this.vers = vers;
+	}
+
+
+	public Collection getEmployees() {
+		return employees;
+	}
+	
+	
+	public Integer getId() {
+		return id;
+	}
+	
+	public void setEmployees(Collection set) {
+		employees = set;
+	}
+
+	public void setId(Integer integer) {
+		id = integer;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Employer.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/GetLoadTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/GetLoadTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/GetLoadTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,132 @@
+//$Id: GetLoadTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.ops;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+
+
+/**
+ * @author Gavin King
+ */
+public class GetLoadTest extends FunctionalTestCase {
+	
+	public GetLoadTest(String str) {
+		super(str);
+	}
+	
+	public void testGetLoad() {
+		clearCounts();
+		
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Employer emp = new Employer();
+		s.persist(emp);
+		Node node = new Node("foo");
+		Node parent = new Node("bar");
+		parent.addChild(node);
+		s.persist(parent);
+		tx.commit();
+		s.close();
+		
+		s = openSession();
+		tx = s.beginTransaction();
+		emp = (Employer) s.get(Employer.class, emp.getId());
+		assertTrue( Hibernate.isInitialized(emp) );
+		assertFalse( Hibernate.isInitialized(emp.getEmployees()) );
+		node = (Node) s.get(Node.class, node.getName());
+		assertTrue( Hibernate.isInitialized(node) );
+		assertFalse( Hibernate.isInitialized(node.getChildren()) );
+		assertFalse( Hibernate.isInitialized(node.getParent()) );
+		assertNull( s.get(Node.class, "xyz") );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		emp = (Employer) s.load(Employer.class, emp.getId());
+		emp.getId();
+		assertFalse( Hibernate.isInitialized(emp) );
+		node = (Node) s.load(Node.class, node.getName());
+		assertEquals( node.getName(), "foo" );
+		assertFalse( Hibernate.isInitialized(node) );
+		tx.commit();
+		s.close();
+	
+		s = openSession();
+		tx = s.beginTransaction();
+		emp = (Employer) s.get("org.hibernate.test.ops.Employer", emp.getId());
+		assertTrue( Hibernate.isInitialized(emp) );
+		node = (Node) s.get("org.hibernate.test.ops.Node", node.getName());
+		assertTrue( Hibernate.isInitialized(node) );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		emp = (Employer) s.load("org.hibernate.test.ops.Employer", emp.getId());
+		emp.getId();
+		assertFalse( Hibernate.isInitialized(emp) );
+		node = (Node) s.load("org.hibernate.test.ops.Node", node.getName());
+		assertEquals( node.getName(), "foo" );
+		assertFalse( Hibernate.isInitialized(node) );
+		tx.commit();
+		s.close();
+		
+		assertFetchCount(0);
+	}
+
+	public void testGetAfterDelete() {
+		clearCounts();
+
+		Session s = openSession();
+		s.beginTransaction();
+		Employer emp = new Employer();
+		s.persist( emp );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.delete( emp );
+		emp = ( Employer ) s.get( Employee.class, emp.getId() );
+		s.getTransaction().commit();
+		s.close();
+
+		assertNull( "get did not return null after delete", emp );
+	}
+
+	private void clearCounts() {
+		getSessions().getStatistics().clear();
+	}
+	
+	private void assertFetchCount(int count) {
+		int fetches = (int) getSessions().getStatistics().getEntityFetchCount();
+		assertEquals(count, fetches);
+	}
+		
+	public void configure(Configuration cfg) {
+		cfg.setProperty(Environment.GENERATE_STATISTICS, "true");
+		cfg.setProperty(Environment.STATEMENT_BATCH_SIZE, "0");		
+	}
+	
+	public String[] getMappings() {
+		return new String[] { "ops/Node.hbm.xml", "ops/Employer.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite(GetLoadTest.class);
+	}
+
+	public String getCacheConcurrencyStrategy() {
+		return null;
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/GetLoadTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/MergeTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/MergeTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/MergeTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,815 @@
+//$Id: MergeTest.java 11037 2007-01-09 16:04:16Z steve.ebersole at jboss.com $
+package org.hibernate.test.ops;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.NonUniqueObjectException;
+import org.hibernate.Session;
+import org.hibernate.StaleObjectStateException;
+import org.hibernate.Transaction;
+import org.hibernate.criterion.Projections;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class MergeTest extends AbstractOperationTestCase {
+
+	public MergeTest(String str) {
+		super( str );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( MergeTest.class );
+	}
+
+	public void testMergeStaleVersionFails() throws Exception {
+		Session s = openSession();
+        s.beginTransaction();
+		VersionedEntity entity = new VersionedEntity( "entity", "entity" );
+		s.persist( entity );
+		s.getTransaction().commit();
+		s.close();
+
+		// make the detached 'entity' reference stale...
+		s = openSession();
+        s.beginTransaction();
+		VersionedEntity entity2 = ( VersionedEntity ) s.get( VersionedEntity.class, entity.getId() );
+		entity2.setName( "entity-name" );
+		s.getTransaction().commit();
+		s.close();
+
+		// now try to reattch it
+		s = openSession();
+		s.beginTransaction();
+		try {
+			s.merge( entity );
+			s.getTransaction().commit();
+			fail( "was expecting staleness error" );
+		}
+		catch ( StaleObjectStateException expected ) {
+			// expected outcome...
+		}
+		finally {
+			s.getTransaction().rollback();
+			s.close();
+		}
+	}
+
+	public void testMergeBidiPrimayKeyOneToOne() throws Exception {
+		Session s = openSession();
+        s.beginTransaction();
+		Person p = new Person( "steve" );
+		new PersonalDetails( "I have big feet", p );
+		s.persist( p );
+		s.getTransaction().commit();
+		s.close();
+
+		clearCounts();
+
+		p.getDetails().setSomePersonalDetail( p.getDetails().getSomePersonalDetail() + " and big hands too" );
+		s = openSession();
+        s.beginTransaction();
+		p = ( Person ) s.merge( p );
+		s.getTransaction().commit();
+		s.close();
+
+		assertInsertCount( 0 );
+		assertUpdateCount( 1 );
+		assertDeleteCount( 0 );
+
+		s = openSession();
+        s.beginTransaction();
+		s.delete( p );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testMergeBidiForeignKeyOneToOne() throws Exception {
+		Session s = openSession();
+        s.beginTransaction();
+		Person p = new Person( "steve" );
+		Address a = new Address( "123 Main", "Austin", "US", p );
+		s.persist( a );
+		s.persist( p );
+		s.getTransaction().commit();
+		s.close();
+
+		clearCounts();
+
+		p.getAddress().setStreetAddress( "321 Main" );
+		s = openSession();
+        s.beginTransaction();
+		p = ( Person ) s.merge( p );
+		s.getTransaction().commit();
+		s.close();
+
+		assertInsertCount( 0 );
+		assertUpdateCount( 0 ); // no cascade
+		assertDeleteCount( 0 );
+
+		s = openSession();
+        s.beginTransaction();
+		s.delete( a );
+		s.delete( p );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+    public void testNoExtraUpdatesOnMerge() throws Exception {
+		Session s = openSession();
+        s.beginTransaction();
+		Node node = new Node( "test" );
+		s.persist( node );
+		s.getTransaction().commit();
+		s.close();
+
+		clearCounts();
+
+		// node is now detached, but we have made no changes.  so attempt to merge it
+		// into this new session; this should cause no updates...
+		s = openSession();
+		s.beginTransaction();
+		node = ( Node ) s.merge( node );
+		s.getTransaction().commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertInsertCount( 0 );
+
+		///////////////////////////////////////////////////////////////////////
+		// as a control measure, now update the node while it is detached and
+		// make sure we get an update as a result...
+		node.setDescription( "new description" );
+		s = openSession();
+		s.beginTransaction();
+		node = ( Node ) s.merge( node );
+		s.getTransaction().commit();
+		s.close();
+		assertUpdateCount( 1 );
+		assertInsertCount( 0 );
+		///////////////////////////////////////////////////////////////////////
+
+		cleanup();
+    }
+
+	public void testNoExtraUpdatesOnMergeWithCollection() throws Exception {
+		Session s = openSession();
+        s.beginTransaction();
+		Node parent = new Node( "parent" );
+		Node child = new Node( "child" );
+		parent.getChildren().add( child );
+		child.setParent( parent );
+		s.persist( parent );
+		s.getTransaction().commit();
+		s.close();
+
+		clearCounts();
+
+		// parent is now detached, but we have made no changes.  so attempt to merge it
+		// into this new session; this should cause no updates...
+		s = openSession();
+		s.beginTransaction();
+		parent = ( Node ) s.merge( parent );
+		s.getTransaction().commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertInsertCount( 0 );
+
+		///////////////////////////////////////////////////////////////////////
+		// as a control measure, now update the node while it is detached and
+		// make sure we get an update as a result...
+		( ( Node ) parent.getChildren().iterator().next() ).setDescription( "child's new description" );
+		parent.addChild( new Node( "second child" ) );
+		s = openSession();
+		s.beginTransaction();
+		parent = ( Node ) s.merge( parent );
+		s.getTransaction().commit();
+		s.close();
+		assertUpdateCount( 1 );
+		assertInsertCount( 1 );
+		///////////////////////////////////////////////////////////////////////
+
+		cleanup();
+	}
+
+    public void testNoExtraUpdatesOnMergeVersioned() throws Exception {
+		Session s = openSession();
+        s.beginTransaction();
+		VersionedEntity entity = new VersionedEntity( "entity", "entity" );
+		s.persist( entity );
+		s.getTransaction().commit();
+		s.close();
+
+		clearCounts();
+
+		// entity is now detached, but we have made no changes.  so attempt to merge it
+		// into this new session; this should cause no updates...
+		s = openSession();
+		s.beginTransaction();
+		VersionedEntity mergedEntity = ( VersionedEntity ) s.merge( entity );
+		s.getTransaction().commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertInsertCount( 0 );
+        assertEquals( "unexpected version increment", entity.getVersion(), mergedEntity.getVersion() );
+
+
+		///////////////////////////////////////////////////////////////////////
+		// as a control measure, now update the node while it is detached and
+		// make sure we get an update as a result...
+		entity.setName( "new name" );
+		s = openSession();
+		s.beginTransaction();
+		entity = ( VersionedEntity ) s.merge( entity );
+		s.getTransaction().commit();
+		s.close();
+		assertUpdateCount( 1 );
+		assertInsertCount( 0 );
+		///////////////////////////////////////////////////////////////////////
+
+		cleanup();
+    }
+
+    public void testNoExtraUpdatesOnMergeVersionedWithCollection() throws Exception {
+		Session s = openSession();
+        s.beginTransaction();
+		VersionedEntity parent = new VersionedEntity( "parent", "parent" );
+		VersionedEntity child = new VersionedEntity( "child", "child" );
+		parent.getChildren().add( child );
+		child.setParent( parent );
+		s.persist( parent );
+		s.getTransaction().commit();
+		s.close();
+
+		clearCounts();
+
+		// parent is now detached, but we have made no changes.  so attempt to merge it
+		// into this new session; this should cause no updates...
+		s = openSession();
+		s.beginTransaction();
+		VersionedEntity mergedParent = ( VersionedEntity ) s.merge( parent );
+		s.getTransaction().commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertInsertCount( 0 );
+		assertEquals( "unexpected parent version increment", parent.getVersion(), mergedParent.getVersion() );
+		VersionedEntity mergedChild = ( VersionedEntity ) mergedParent.getChildren().iterator().next();
+		assertEquals( "unexpected child version increment", child.getVersion(), mergedChild.getVersion() );
+
+		///////////////////////////////////////////////////////////////////////
+		// as a control measure, now update the node while it is detached and
+		// make sure we get an update as a result...
+		mergedParent.setName( "new name" );
+		mergedParent.getChildren().add( new VersionedEntity( "child2", "new child" ) );
+		s = openSession();
+		s.beginTransaction();
+		parent = ( VersionedEntity ) s.merge( mergedParent );
+		s.getTransaction().commit();
+		s.close();
+		assertUpdateCount( 1 );
+		assertInsertCount( 1 );
+		///////////////////////////////////////////////////////////////////////
+
+		cleanup();
+    }
+
+	public void testNoExtraUpdatesOnPersistentMergeVersionedWithCollection() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		VersionedEntity parent = new VersionedEntity( "parent", "parent" );
+		VersionedEntity child = new VersionedEntity( "child", "child" );
+		parent.getChildren().add( child );
+		child.setParent( parent );
+		s.persist( parent );
+		s.getTransaction().commit();
+		s.close();
+
+		clearCounts();
+
+		// parent is now detached, but we have made no changes. so attempt to merge it
+		// into this new session; this should cause no updates...
+		s = openSession();
+		s.beginTransaction();
+		// load parent so that merge will follow entityIsPersistent path
+		VersionedEntity persistentParent = ( VersionedEntity ) s.get( VersionedEntity.class, parent.getId() );
+		// load children
+		VersionedEntity persistentChild = ( VersionedEntity ) persistentParent.getChildren().iterator().next();
+		VersionedEntity mergedParent = ( VersionedEntity ) s.merge( persistentParent ); // <-- This merge leads to failure
+		s.getTransaction().commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertInsertCount( 0 );
+		assertEquals( "unexpected parent version increment", parent.getVersion(), mergedParent.getVersion() );
+		VersionedEntity mergedChild = ( VersionedEntity ) mergedParent.getChildren().iterator().next();
+		assertEquals( "unexpected child version increment", child.getVersion(), mergedChild.getVersion() );
+
+		///////////////////////////////////////////////////////////////////////
+		// as a control measure, now update the node once it is loaded and
+		// make sure we get an update as a result...
+		s = openSession();
+		s.beginTransaction();
+		persistentParent = ( VersionedEntity ) s.get( VersionedEntity.class, parent.getId() );
+		persistentParent.setName( "new name" );
+		persistentParent.getChildren().add( new VersionedEntity( "child2", "new child" ) );
+		persistentParent = ( VersionedEntity ) s.merge( persistentParent );
+		s.getTransaction().commit();
+		s.close();
+		assertUpdateCount( 1 );
+		assertInsertCount( 1 );
+		///////////////////////////////////////////////////////////////////////
+
+		// cleanup();
+	}
+
+	public void testPersistThenMergeInSameTxnWithVersion() {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		VersionedEntity entity = new VersionedEntity( "test", "test" );
+		s.persist( entity );
+		s.merge( new VersionedEntity( "test", "test-2" ) );
+
+		try {
+			// control operation...
+			s.saveOrUpdate( new VersionedEntity( "test", "test-3" ) );
+			fail( "saveOrUpdate() should fail here" );
+		}
+		catch( NonUniqueObjectException expected ) {
+			// expected behavior
+		}
+
+		tx.commit();
+		s.close();
+
+		cleanup();
+	}
+
+	public void testPersistThenMergeInSameTxnWithTimestamp() {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		TimestampedEntity entity = new TimestampedEntity( "test", "test" );
+		s.persist( entity );
+		s.merge( new TimestampedEntity( "test", "test-2" ) );
+
+		try {
+			// control operation...
+			s.saveOrUpdate( new TimestampedEntity( "test", "test-3" ) );
+			fail( "saveOrUpdate() should fail here" );
+		}
+		catch( NonUniqueObjectException expected ) {
+			// expected behavior
+		}
+
+		tx.commit();
+		s.close();
+
+		cleanup();
+	}
+
+	public void testMergeDeepTree() {
+
+		clearCounts();
+
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Node root = new Node("root");
+		Node child = new Node("child");
+		Node grandchild = new Node("grandchild");
+		root.addChild(child);
+		child.addChild(grandchild);
+		s.merge(root);
+		tx.commit();
+		s.close();
+
+		assertInsertCount(3);
+		assertUpdateCount(0);
+		clearCounts();
+
+		grandchild.setDescription("the grand child");
+		Node grandchild2 = new Node("grandchild2");
+		child.addChild( grandchild2 );
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.merge(root);
+		tx.commit();
+		s.close();
+
+		assertInsertCount(1);
+		assertUpdateCount(1);
+		clearCounts();
+
+		Node child2 = new Node("child2");
+		Node grandchild3 = new Node("grandchild3");
+		child2.addChild( grandchild3 );
+		root.addChild(child2);
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.merge(root);
+		tx.commit();
+		s.close();
+
+		assertInsertCount(2);
+		assertUpdateCount(0);
+		clearCounts();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.delete(grandchild);
+		s.delete(grandchild2);
+		s.delete(grandchild3);
+		s.delete(child);
+		s.delete(child2);
+		s.delete(root);
+		tx.commit();
+		s.close();
+
+	}
+
+	public void testMergeDeepTreeWithGeneratedId() {
+
+		clearCounts();
+
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		NumberedNode root = new NumberedNode("root");
+		NumberedNode child = new NumberedNode("child");
+		NumberedNode grandchild = new NumberedNode("grandchild");
+		root.addChild(child);
+		child.addChild(grandchild);
+		root = (NumberedNode) s.merge(root);
+		tx.commit();
+		s.close();
+
+		assertInsertCount(3);
+		assertUpdateCount(0);
+		clearCounts();
+
+		child = (NumberedNode) root.getChildren().iterator().next();
+		grandchild = (NumberedNode) child.getChildren().iterator().next();
+		grandchild.setDescription("the grand child");
+		NumberedNode grandchild2 = new NumberedNode("grandchild2");
+		child.addChild( grandchild2 );
+
+		s = openSession();
+		tx = s.beginTransaction();
+		root = (NumberedNode) s.merge(root);
+		tx.commit();
+		s.close();
+
+		assertInsertCount(1);
+		assertUpdateCount(1);
+		clearCounts();
+
+		getSessions().evict(NumberedNode.class);
+
+		NumberedNode child2 = new NumberedNode("child2");
+		NumberedNode grandchild3 = new NumberedNode("grandchild3");
+		child2.addChild( grandchild3 );
+		root.addChild(child2);
+
+		s = openSession();
+		tx = s.beginTransaction();
+		root = (NumberedNode) s.merge(root);
+		tx.commit();
+		s.close();
+
+		assertInsertCount(2);
+		assertUpdateCount(0);
+		clearCounts();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.createQuery("delete from NumberedNode where name like 'grand%'").executeUpdate();
+		s.createQuery("delete from NumberedNode where name like 'child%'").executeUpdate();
+		s.createQuery("delete from NumberedNode").executeUpdate();
+		tx.commit();
+		s.close();
+
+	}
+
+	public void testMergeTree() {
+
+		clearCounts();
+
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Node root = new Node("root");
+		Node child = new Node("child");
+		root.addChild(child);
+		s.persist(root);
+		tx.commit();
+		s.close();
+
+		assertInsertCount(2);
+		clearCounts();
+
+		root.setDescription("The root node");
+		child.setDescription("The child node");
+
+		Node secondChild = new Node("second child");
+
+		root.addChild(secondChild);
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.merge(root);
+		tx.commit();
+		s.close();
+
+		assertInsertCount(1);
+		assertUpdateCount(2);
+
+		cleanup();
+	}
+
+	public void testMergeTreeWithGeneratedId() {
+
+		clearCounts();
+
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		NumberedNode root = new NumberedNode("root");
+		NumberedNode child = new NumberedNode("child");
+		root.addChild(child);
+		s.persist(root);
+		tx.commit();
+		s.close();
+
+		assertInsertCount(2);
+		clearCounts();
+
+		root.setDescription("The root node");
+		child.setDescription("The child node");
+
+		NumberedNode secondChild = new NumberedNode("second child");
+
+		root.addChild(secondChild);
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.merge(root);
+		tx.commit();
+		s.close();
+
+		assertInsertCount(1);
+		assertUpdateCount(2);
+
+		cleanup();
+	}
+
+	public void testMergeManaged() {
+
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		NumberedNode root = new NumberedNode("root");
+		s.persist(root);
+		tx.commit();
+
+		clearCounts();
+
+		tx = s.beginTransaction();
+		NumberedNode child = new NumberedNode("child");
+		root.addChild(child);
+		assertSame( root, s.merge(root) );
+		Object mergedChild = root.getChildren().iterator().next();
+		assertNotSame( mergedChild, child );
+		assertTrue( s.contains(mergedChild) );
+		assertFalse( s.contains(child) );
+		assertEquals( root.getChildren().size(), 1 );
+		assertTrue( root.getChildren().contains(mergedChild) );
+		//assertNotSame( mergedChild, s.merge(child) ); //yucky :(
+		tx.commit();
+
+		assertInsertCount(1);
+		assertUpdateCount(0);
+
+		assertEquals( root.getChildren().size(), 1 );
+		assertTrue( root.getChildren().contains(mergedChild) );
+
+		tx = s.beginTransaction();
+		assertEquals(
+			s.createCriteria(NumberedNode.class)
+				.setProjection( Projections.rowCount() )
+				.uniqueResult(),
+			new Long(2)
+		);
+
+		s.close();
+
+		cleanup();
+	}
+
+	public void testMergeManagedUninitializedCollection() {
+
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		NumberedNode root = new NumberedNode( "root" );
+		root.addChild( new NumberedNode( "child" ) );
+		s.persist(root);
+		tx.commit();
+		s.close();
+
+		clearCounts();
+
+		NumberedNode newRoot = new NumberedNode( "root" );
+		newRoot.setId( root.getId() );
+
+		s = openSession();
+		tx = s.beginTransaction();
+		root = ( NumberedNode ) s.get( NumberedNode.class, root.getId() );
+		Set managedChildren = root.getChildren();
+		assertFalse( Hibernate.isInitialized( managedChildren ) );
+		newRoot.setChildren( managedChildren );
+		assertSame( root, s.merge( newRoot ) );
+		assertSame( managedChildren, root.getChildren() );
+		assertFalse( Hibernate.isInitialized( managedChildren ) );
+		tx.commit();
+
+		assertInsertCount(0);
+		assertUpdateCount(0);
+		assertDeleteCount(0);
+
+		tx = s.beginTransaction();
+		assertEquals(
+			s.createCriteria(NumberedNode.class)
+				.setProjection( Projections.rowCount() )
+				.uniqueResult(),
+			new Long(2)
+		);
+		tx.commit();
+
+		s.close();
+
+		cleanup();
+	}
+
+	public void testMergeManagedInitializedCollection() {
+
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		NumberedNode root = new NumberedNode( "root" );
+		root.addChild( new NumberedNode( "child" ) );
+		s.persist(root);
+		tx.commit();
+		s.close();
+
+		clearCounts();
+
+		NumberedNode newRoot = new NumberedNode( "root" );
+		newRoot.setId( root.getId() );
+
+		s = openSession();
+		tx = s.beginTransaction();
+		root = ( NumberedNode ) s.get( NumberedNode.class, root.getId() );
+		Set managedChildren = root.getChildren();
+		Hibernate.initialize( managedChildren );
+		assertTrue( Hibernate.isInitialized( managedChildren ) );
+		newRoot.setChildren( managedChildren );
+		assertSame( root, s.merge( newRoot ) );
+		assertSame( managedChildren, root.getChildren() );
+		assertTrue( Hibernate.isInitialized( managedChildren ) );
+		tx.commit();
+
+		assertInsertCount(0);
+		assertUpdateCount(0);
+		assertDeleteCount(0);
+
+		tx = s.beginTransaction();
+		assertEquals(
+			s.createCriteria(NumberedNode.class)
+				.setProjection( Projections.rowCount() )
+				.uniqueResult(),
+			new Long(2)
+		);
+		tx.commit();
+
+		s.close();
+
+		cleanup();
+	}
+
+	public void testRecursiveMergeTransient() {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Employer jboss = new Employer();
+		Employee gavin = new Employee();
+		jboss.setEmployees( new ArrayList() );
+		jboss.getEmployees().add(gavin);
+		s.merge(jboss);
+		s.flush();
+		jboss = (Employer) s.createQuery("from Employer e join fetch e.employees").uniqueResult();
+		assertTrue( Hibernate.isInitialized( jboss.getEmployees() )  );
+		assertEquals( 1, jboss.getEmployees().size() );
+		s.clear();
+		s.merge( jboss.getEmployees().iterator().next() );
+		tx.commit();
+		s.close();
+
+		cleanup();
+	}
+
+	public void testDeleteAndMerge() throws Exception {
+		Session s = openSession();
+		s.getTransaction().begin();
+		Employer jboss = new Employer();
+		s.persist( jboss );
+		s.getTransaction().commit();
+		s.clear();
+
+		s.getTransaction().begin();
+		Employer otherJboss;
+		otherJboss = (Employer) s.get( Employer.class, jboss.getId() );
+		s.delete( otherJboss );
+		s.getTransaction().commit();
+		s.clear();
+		jboss.setVers( new Integer(1) );
+		s.getTransaction().begin();
+		s.merge( jboss );
+		s.getTransaction().commit();
+		s.close();
+
+		cleanup();
+	}
+
+	public void testMergeManyToManyWithCollectionDeference() throws Exception {
+		// setup base data...
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Competition competition = new Competition();
+		competition.getCompetitors().add( new Competitor( "Name" ) );
+		competition.getCompetitors().add( new Competitor() );
+		competition.getCompetitors().add( new Competitor() );
+		s.persist( competition );
+		tx.commit();
+		s.close();
+
+		// the competition graph is now detached:
+		//   1) create a new List reference to represent the competitors
+		s = openSession();
+		tx = s.beginTransaction();
+		List newComp = new ArrayList();
+		Competitor originalCompetitor = ( Competitor ) competition.getCompetitors().get( 0 );
+		originalCompetitor.setName( "Name2" );
+		newComp.add( originalCompetitor );
+		newComp.add( new Competitor() );
+		//   2) set that new List reference unto the Competition reference
+		competition.setCompetitors( newComp );
+		//   3) attempt the merge
+		Competition competition2 = ( Competition ) s.merge( competition );
+		tx.commit();
+		s.close();
+
+		assertFalse( competition == competition2 );
+		assertFalse( competition.getCompetitors() == competition2.getCompetitors() );
+		assertEquals( 2, competition2.getCompetitors().size() );
+
+		s = openSession();
+		tx = s.beginTransaction();
+		competition = ( Competition ) s.get( Competition.class, competition.getId() );
+		assertEquals( 2, competition.getCompetitors().size() );
+		s.delete( competition );
+		tx.commit();
+		s.close();
+
+		cleanup();
+	}
+
+	private void cleanup() {
+		Session s = openSession();
+		s.beginTransaction();
+		s.createQuery( "delete from NumberedNode where parent is not null" ).executeUpdate();
+		s.createQuery( "delete from NumberedNode" ).executeUpdate();
+
+		s.createQuery( "delete from Node where parent is not null" ).executeUpdate();
+		s.createQuery( "delete from Node" ).executeUpdate();
+
+		s.createQuery( "delete from VersionedEntity where parent is not null" ).executeUpdate();
+		s.createQuery( "delete from VersionedEntity" ).executeUpdate();
+		s.createQuery( "delete from TimestampedEntity" ).executeUpdate();
+
+		s.createQuery( "delete from Competitor" ).executeUpdate();
+		s.createQuery( "delete from Competition" ).executeUpdate();
+
+		Iterator itr = s.createQuery( "from Employer" ).list().iterator();
+		while ( itr.hasNext() ) {
+			final Employer employer = ( Employer ) itr.next();
+			s.delete( employer );
+		}
+
+		s.getTransaction().commit();
+		s.close();
+	}
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/MergeTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Node.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Node.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Node.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,51 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.ops">
+
+	<class name="Node" polymorphism="explicit">
+		<id name="name">
+			<generator class="assigned"/>
+		</id>
+		<property name="description"/>
+		<many-to-one name="parent"/>
+		<property name="created" not-null="true"/>
+		<set name="children"
+			inverse="true"
+			cascade="persist,merge,save-update,evict">
+			<key column="parent"/>
+			<one-to-many class="Node"/>
+		</set>
+		<set name="cascadingChildren" inverse="false" cascade="persist,merge,save-update,evict,delete">
+            <key column="CASC_PARENT"/>
+            <one-to-many class="Node"/>
+        </set>
+    </class>
+
+	<class name="NumberedNode" polymorphism="explicit">
+		<id name="id" unsaved-value="0">
+			<generator class="native"/>
+		</id>
+		<property name="name">
+			<column name="name" index="iname" not-null="true"/>
+		</property>
+		<property name="description"/>
+		<property name="created" not-null="true"
+				type="imm_date"/>
+		<many-to-one name="parent" class="NumberedNode"/>
+		<set name="children"
+			inverse="true"
+			cascade="persist,merge,save-update">
+			<key column="parent"/>
+			<one-to-many class="NumberedNode"/>
+		</set>
+	</class>
+
+</hibernate-mapping>
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Node.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Node.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Node.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Node.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,88 @@
+//$Id: Node.java 10759 2006-11-08 00:00:53Z steve.ebersole at jboss.com $
+package org.hibernate.test.ops;
+
+import java.sql.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author Gavin King
+ */
+public class Node {
+
+	private String name;
+	private String description;
+	private Date created;
+	private Node parent;
+	private Set children = new HashSet();
+	private Set cascadingChildren = new HashSet();
+
+	public Node() {
+	}
+
+	public Node(String name) {
+		this.name = name;
+		created = generateCurrentDate();
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getDescription() {
+		return description;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
+	public Date getCreated() {
+		return created;
+	}
+
+	public void setCreated(Date created) {
+		this.created = created;
+	}
+
+	public Node getParent() {
+		return parent;
+	}
+
+	public void setParent(Node parent) {
+		this.parent = parent;
+	}
+
+	public Set getChildren() {
+		return children;
+	}
+
+	public void setChildren(Set children) {
+		this.children = children;
+	}
+
+	public Node addChild(Node child) {
+		children.add( child );
+		child.setParent( this );
+		return this;
+	}
+
+	public Set getCascadingChildren() {
+		return cascadingChildren;
+	}
+
+	public void setCascadingChildren(Set cascadingChildren) {
+		this.cascadingChildren = cascadingChildren;
+	}
+
+	private Date generateCurrentDate() {
+		// Note : done as java.sql.Date mainly to work around issue with
+		// MySQL and its lack of milli-second precision on its DATETIME
+		// and TIMESTAMP datatypes.
+		return new Date( new java.util.Date().getTime() );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Node.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/NumberedNode.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/NumberedNode.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/NumberedNode.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,75 @@
+//$Id: NumberedNode.java 7236 2005-06-20 03:19:34Z oneovthafew $
+package org.hibernate.test.ops;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author Gavin King
+ */
+public class NumberedNode {
+	
+	private long id;
+	private String name;
+	private NumberedNode parent;
+	private Set children = new HashSet();
+	private String description;
+	private Date created;
+
+	public NumberedNode() {
+		super();
+	}
+
+	public NumberedNode(String name) {
+		this.name = name;
+		created = new Date();
+	}
+
+	public long getId() {
+		return id;
+	}
+	public void setId(long id) {
+		this.id = id;
+	}
+	
+	public Set getChildren() {
+		return children;
+	}
+	public void setChildren(Set children) {
+		this.children = children;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public NumberedNode getParent() {
+		return parent;
+	}
+	public void setParent(NumberedNode parent) {
+		this.parent = parent;
+	}
+	
+	public NumberedNode addChild(NumberedNode child) {
+		children.add(child);
+		child.setParent(this);
+		return this;
+	}
+	
+	public String getDescription() {
+		return description;
+	}
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
+	public Date getCreated() {
+		return created;
+	}
+
+	public void setCreated(Date created) {
+		this.created = created;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/NumberedNode.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/OneToOne.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/OneToOne.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/OneToOne.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,43 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+ Mappings demonstrating bidirectional one-to-one mappings for testing
+ with various operations.
+
+ Person -> Address is modeled as a bidirectional one to one based on FK.
+ Person -> Details is modeled as a bidirectional one to one based on PK.
+-->
+
+<hibernate-mapping package="org.hibernate.test.ops">
+
+    <class name="Person" table="OPS_PERSON">
+        <id name="id" column="ID" type="long">
+            <generator class="increment"/>
+        </id>
+        <property name="name" column="NAME" type="string"/>
+        <one-to-one name="address" class="Address" property-ref="resident" />
+        <one-to-one name="details" class="PersonalDetails" cascade="all" />
+    </class>
+
+    <class name="Address" table="OPS_ADDRESS">
+        <id name="id" column="ID" type="long">
+            <generator class="increment"/>
+        </id>
+        <property name="streetAddress" column="STREET" type="string" />
+        <property name="city" column="CITY" type="string" />
+        <property name="country" column="CTRY" type="string" />
+        <many-to-one name="resident" column="RESIDENT" class="Person" />
+    </class>
+
+    <class name="PersonalDetails" table="OPS_PERS_DETAIL">
+        <id name="id" column="ID" type="long">
+            <generator class="increment"/>
+        </id>
+        <property name="somePersonalDetail" column="SOME_DETAIL" type="string"/>
+        <one-to-one name="person" class="Person" cascade="none" constrained="true" />
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/OneToOne.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/OptLockEntity.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/OptLockEntity.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/OptLockEntity.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.ops">
+
+	<class name="VersionedEntity" table="V_ENTITY">
+		<id name="id" column="ID" type="string">
+			<generator class="assigned"/>
+		</id>
+        <version name="version" column="VERS" type="long" />
+        <property name="name" column="NAME" type="string" />
+        <many-to-one name="parent" class="VersionedEntity"/>
+        <set name="children"
+			inverse="true"
+			cascade="persist,merge,save-update,evict,delete">
+			<key column="parent"/>
+			<one-to-many class="VersionedEntity"/>
+		</set>
+    </class>
+
+	<class name="TimestampedEntity" table="T_ENTITY">
+		<id name="id" column="ID" type="string">
+			<generator class="assigned"/>
+		</id>
+        <timestamp name="timestamp" column="TS" />
+        <property name="name" column="NAME" type="string" />
+	</class>
+
+</hibernate-mapping>
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/OptLockEntity.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,52 @@
+package org.hibernate.test.ops;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class Person {
+	private Long id;
+	private String name;
+	private Address address;
+	private PersonalDetails details;
+
+	public Person() {
+	}
+
+	public Person(String name) {
+		this.name = name;
+	}
+
+	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 Address getAddress() {
+		return address;
+	}
+
+	public void setAddress(Address address) {
+		this.address = address;
+	}
+
+	public PersonalDetails getDetails() {
+		return details;
+	}
+
+	public void setDetails(PersonalDetails details) {
+		this.details = details;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/Person.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/PersonalDetails.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/PersonalDetails.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/PersonalDetails.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,45 @@
+package org.hibernate.test.ops;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class PersonalDetails {
+	private Long id;
+	private String somePersonalDetail;
+	private Person person;
+
+	public PersonalDetails() {
+	}
+
+	public PersonalDetails(String somePersonalDetail, Person person) {
+		this.somePersonalDetail = somePersonalDetail;
+		this.person = person;
+		person.setDetails( this );
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getSomePersonalDetail() {
+		return somePersonalDetail;
+	}
+
+	public void setSomePersonalDetail(String somePersonalDetail) {
+		this.somePersonalDetail = somePersonalDetail;
+	}
+
+	public Person getPerson() {
+		return person;
+	}
+
+	public void setPerson(Person person) {
+		this.person = person;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/PersonalDetails.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/SaveOrUpdateTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/SaveOrUpdateTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/SaveOrUpdateTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,466 @@
+//$Id: SaveOrUpdateTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.ops;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.HibernateException;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.intercept.FieldInterceptionHelper;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.criterion.Projections;
+
+/**
+ * @author Gavin King
+ */
+public class SaveOrUpdateTest extends FunctionalTestCase {
+
+	public SaveOrUpdateTest(String str) {
+		super( str );
+	}
+
+	public void testSaveOrUpdateDeepTree() {
+		clearCounts();
+
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Node root = new Node( "root" );
+		Node child = new Node( "child" );
+		Node grandchild = new Node( "grandchild" );
+		root.addChild( child );
+		child.addChild( grandchild );
+		s.saveOrUpdate( root );
+		tx.commit();
+		s.close();
+
+		assertInsertCount( 3 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		grandchild.setDescription( "the grand child" );
+		Node grandchild2 = new Node( "grandchild2" );
+		child.addChild( grandchild2 );
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.saveOrUpdate( root );
+		tx.commit();
+		s.close();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( 1 );
+		clearCounts();
+
+		Node child2 = new Node( "child2" );
+		Node grandchild3 = new Node( "grandchild3" );
+		child2.addChild( grandchild3 );
+		root.addChild( child2 );
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.saveOrUpdate( root );
+		tx.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.delete( grandchild );
+		s.delete( grandchild2 );
+		s.delete( grandchild3 );
+		s.delete( child );
+		s.delete( child2 );
+		s.delete( root );
+		tx.commit();
+		s.close();
+	}
+
+	public void testSaveOrUpdateDeepTreeWithGeneratedId() {
+		boolean instrumented = FieldInterceptionHelper.isInstrumented( new NumberedNode() );
+		clearCounts();
+
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		NumberedNode root = new NumberedNode( "root" );
+		NumberedNode child = new NumberedNode( "child" );
+		NumberedNode grandchild = new NumberedNode( "grandchild" );
+		root.addChild( child );
+		child.addChild( grandchild );
+		s.saveOrUpdate( root );
+		tx.commit();
+		s.close();
+
+		assertInsertCount( 3 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		child = ( NumberedNode ) root.getChildren().iterator().next();
+		grandchild = ( NumberedNode ) child.getChildren().iterator().next();
+		grandchild.setDescription( "the grand child" );
+		NumberedNode grandchild2 = new NumberedNode( "grandchild2" );
+		child.addChild( grandchild2 );
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.saveOrUpdate( root );
+		tx.commit();
+		s.close();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( instrumented ? 1 : 3 );
+		clearCounts();
+
+		NumberedNode child2 = new NumberedNode( "child2" );
+		NumberedNode grandchild3 = new NumberedNode( "grandchild3" );
+		child2.addChild( grandchild3 );
+		root.addChild( child2 );
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.saveOrUpdate( root );
+		tx.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		assertUpdateCount( instrumented ? 0 : 4 );
+		clearCounts();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.createQuery( "delete from NumberedNode where name like 'grand%'" ).executeUpdate();
+		s.createQuery( "delete from NumberedNode where name like 'child%'" ).executeUpdate();
+		s.createQuery( "delete from NumberedNode" ).executeUpdate();
+		tx.commit();
+		s.close();
+	}
+
+	public void testSaveOrUpdateTree() {
+		clearCounts();
+
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Node root = new Node( "root" );
+		Node child = new Node( "child" );
+		root.addChild( child );
+		s.saveOrUpdate( root );
+		tx.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		clearCounts();
+
+		root.setDescription( "The root node" );
+		child.setDescription( "The child node" );
+
+		Node secondChild = new Node( "second child" );
+
+		root.addChild( secondChild );
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.saveOrUpdate( root );
+		tx.commit();
+		s.close();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( 2 );
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.createQuery( "delete from Node where parent is not null" ).executeUpdate();
+		s.createQuery( "delete from Node" ).executeUpdate();
+		tx.commit();
+		s.close();
+	}
+
+	public void testSaveOrUpdateTreeWithGeneratedId() {
+		clearCounts();
+
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		NumberedNode root = new NumberedNode( "root" );
+		NumberedNode child = new NumberedNode( "child" );
+		root.addChild( child );
+		s.saveOrUpdate( root );
+		tx.commit();
+		s.close();
+
+		assertInsertCount( 2 );
+		clearCounts();
+
+		root.setDescription( "The root node" );
+		child.setDescription( "The child node" );
+
+		NumberedNode secondChild = new NumberedNode( "second child" );
+
+		root.addChild( secondChild );
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.saveOrUpdate( root );
+		tx.commit();
+		s.close();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( 2 );
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.createQuery( "delete from NumberedNode where parent is not null" ).executeUpdate();
+		s.createQuery( "delete from NumberedNode" ).executeUpdate();
+		tx.commit();
+		s.close();
+	}
+
+	public void testSaveOrUpdateManaged() {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		NumberedNode root = new NumberedNode( "root" );
+		s.saveOrUpdate( root );
+		tx.commit();
+
+		tx = s.beginTransaction();
+		NumberedNode child = new NumberedNode( "child" );
+		root.addChild( child );
+		s.saveOrUpdate( root );
+		assertFalse( s.contains( child ) );
+		s.flush();
+		assertTrue( s.contains( child ) );
+		tx.commit();
+
+		assertTrue( root.getChildren().contains( child ) );
+		assertEquals( root.getChildren().size(), 1 );
+
+		tx = s.beginTransaction();
+		assertEquals(
+				s.createCriteria( NumberedNode.class )
+						.setProjection( Projections.rowCount() )
+						.uniqueResult(),
+		        new Long( 2 )
+		);
+		s.delete( root );
+		s.delete( child );
+		tx.commit();
+		s.close();
+	}
+
+
+	public void testSaveOrUpdateGot() {
+		boolean instrumented = FieldInterceptionHelper.isInstrumented( new NumberedNode() );
+
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		NumberedNode root = new NumberedNode( "root" );
+		s.saveOrUpdate( root );
+		tx.commit();
+		s.close();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.saveOrUpdate( root );
+		tx.commit();
+		s.close();
+
+		assertInsertCount( 0 );
+		assertUpdateCount( instrumented ? 0 : 1 );
+
+		s = openSession();
+		tx = s.beginTransaction();
+		root = ( NumberedNode ) s.get( NumberedNode.class, new Long( root.getId() ) );
+		Hibernate.initialize( root.getChildren() );
+		tx.commit();
+		s.close();
+
+		clearCounts();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		NumberedNode child = new NumberedNode( "child" );
+		root.addChild( child );
+		s.saveOrUpdate( root );
+		assertTrue( s.contains( child ) );
+		tx.commit();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( instrumented ? 0 : 1 );
+
+		tx = s.beginTransaction();
+		assertEquals(
+				s.createCriteria( NumberedNode.class )
+						.setProjection( Projections.rowCount() )
+						.uniqueResult(),
+		        new Long( 2 )
+		);
+		s.delete( root );
+		s.delete( child );
+		tx.commit();
+		s.close();
+	}
+
+	public void testSaveOrUpdateGotWithMutableProp() {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Node root = new Node( "root" );
+		s.saveOrUpdate( root );
+		tx.commit();
+		s.close();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.saveOrUpdate( root );
+		tx.commit();
+		s.close();
+
+		assertInsertCount( 0 );
+		assertUpdateCount( 0 );
+
+		s = openSession();
+		tx = s.beginTransaction();
+		root = ( Node ) s.get( Node.class, "root" );
+		Hibernate.initialize( root.getChildren() );
+		tx.commit();
+		s.close();
+
+		clearCounts();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		Node child = new Node( "child" );
+		root.addChild( child );
+		s.saveOrUpdate( root );
+		assertTrue( s.contains( child ) );
+		tx.commit();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( 1 ); //note: will fail here if no second-level cache
+
+		tx = s.beginTransaction();
+		assertEquals(
+				s.createCriteria( Node.class )
+						.setProjection( Projections.rowCount() )
+						.uniqueResult(),
+		        new Long( 2 )
+		);
+		s.delete( root );
+		s.delete( child );
+		tx.commit();
+		s.close();
+	}
+
+	public void testEvictThenSaveOrUpdate() {
+		Session s = openSession();
+		s.getTransaction().begin();
+		Node parent = new Node( "1:parent" );
+		Node child = new Node( "2:child" );
+		Node grandchild = new Node( "3:grandchild" );
+		parent.addChild( child );
+		child.addChild( grandchild );
+		s.saveOrUpdate( parent );
+		s.getTransaction().commit();
+		s.close();
+
+		Session s1 = openSession();
+		s1.getTransaction().begin();
+		child = ( Node ) s1.load( Node.class, "2:child" );
+		assertTrue( s1.contains( child ) );
+		assertFalse( Hibernate.isInitialized( child ) );
+		assertTrue( s1.contains( child.getParent() ) );
+		assertTrue( Hibernate.isInitialized( child ) );
+		assertFalse( Hibernate.isInitialized( child.getChildren() ) );
+		assertFalse( Hibernate.isInitialized( child.getParent() ) );
+		assertTrue( s1.contains( child ) );
+		s1.evict( child );
+		assertFalse( s1.contains( child ) );
+		assertTrue( s1.contains( child.getParent() ) );
+
+		Session s2 = openSession();
+		try {
+			s2.getTransaction().begin();
+			s2.saveOrUpdate( child );
+			fail();
+		}
+		catch ( HibernateException ex ) {
+			// expected because parent is connected to s1
+		}
+		finally {
+			s2.getTransaction().rollback();
+		}
+		s2.close();
+
+		s1.evict( child.getParent() );
+		assertFalse( s1.contains( child.getParent() ) );
+
+		s2 = openSession();
+		s2.getTransaction().begin();
+		s2.saveOrUpdate( child );
+		assertTrue( s2.contains( child ) );
+		assertFalse( s1.contains( child ) );
+		assertTrue( s2.contains( child.getParent() ) );
+		assertFalse( s1.contains( child.getParent() ) );
+		assertFalse( Hibernate.isInitialized( child.getChildren() ) );
+		assertFalse( Hibernate.isInitialized( child.getParent() ) );
+		assertEquals( 1, child.getChildren().size() );
+		assertEquals( "1:parent", child.getParent().getName() );
+		assertTrue( Hibernate.isInitialized( child.getChildren() ) );
+		assertFalse( Hibernate.isInitialized( child.getParent() ) );
+		assertNull( child.getParent().getDescription() );
+		assertTrue( Hibernate.isInitialized( child.getParent() ) );
+
+		s1.getTransaction().commit();
+		s2.getTransaction().commit();
+		s1.close();
+		s2.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.delete( s.get( Node.class, "3:grandchild" ) );
+		s.delete( s.get( Node.class, "2:child" ) );
+		s.delete( s.get( Node.class, "1:parent" ) );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	private void clearCounts() {
+		getSessions().getStatistics().clear();
+	}
+
+	private void assertInsertCount(int count) {
+		int inserts = ( int ) getSessions().getStatistics().getEntityInsertCount();
+		assertEquals( count, inserts );
+	}
+
+	private void assertUpdateCount(int count) {
+		int updates = ( int ) getSessions().getStatistics().getEntityUpdateCount();
+		assertEquals( count, updates );
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
+		cfg.setProperty( Environment.STATEMENT_BATCH_SIZE, "0" );
+	}
+
+	public String[] getMappings() {
+		return new String[] {"ops/Node.hbm.xml"};
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( SaveOrUpdateTest.class );
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/SaveOrUpdateTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/TimestampedEntity.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/TimestampedEntity.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/TimestampedEntity.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,47 @@
+package org.hibernate.test.ops;
+
+import java.util.Date;
+
+/**
+ * todo: describe TimestampedEntity
+ *
+ * @author Steve Ebersole
+ */
+public class TimestampedEntity {
+	private String id;
+	private String name;
+	private Date timestamp;
+
+	public TimestampedEntity() {
+	}
+
+	public TimestampedEntity(String id, String name) {
+		this.id = id;
+		this.name = name;
+	}
+
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Date getTimestamp() {
+		return timestamp;
+	}
+
+	public void setTimestamp(Date timestamp) {
+		this.timestamp = timestamp;
+	}
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/TimestampedEntity.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/VersionedEntity.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/VersionedEntity.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/VersionedEntity.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,66 @@
+package org.hibernate.test.ops;
+
+import java.util.Set;
+import java.util.HashSet;
+
+/**
+ * VersionedEntity
+ *
+ * @author Steve Ebersole
+ */
+public class VersionedEntity {
+	private String id;
+	private String name;
+	private long version;
+
+	private VersionedEntity parent;
+	private Set children = new HashSet();
+
+	public VersionedEntity() {
+	}
+
+	public VersionedEntity(String id, String name) {
+		this.id = id;
+		this.name = name;
+	}
+
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public long getVersion() {
+		return version;
+	}
+
+	public void setVersion(long version) {
+		this.version = version;
+	}
+
+	public VersionedEntity getParent() {
+		return parent;
+	}
+
+	public void setParent(VersionedEntity parent) {
+		this.parent = parent;
+	}
+
+	public Set getChildren() {
+		return children;
+	}
+
+	public void setChildren(Set children) {
+		this.children = children;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ops/VersionedEntity.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/optlock/Document.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/optlock/Document.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/optlock/Document.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,47 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+  Demonstrates the use of dirty-property optimistic locking.
+  We do not recommend this approach, since it does not work
+  for detached entities. Use version-based optimistic locking.
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.optlock">
+
+	<class name="Document" entity-name="LockDirty" table="Document" optimistic-lock="dirty" dynamic-update="true">
+		<id name="id">
+			<generator class="native"/>
+		</id>
+		<property name="title"/>
+		<property name="author"/>
+		<component name="pubDate">
+			<property name="year" not-null="true"/>
+			<property name="month"/>
+		</component>
+		<property name="summary"/>
+		<property name="totalSales" optimistic-lock="false"/>
+		<property name="text" column="`text`"/>
+	</class>
+
+	<class name="Document" entity-name="LockAll" table="Document" optimistic-lock="all" dynamic-update="true">
+		<id name="id">
+			<generator class="native"/>
+		</id>
+		<property name="title"/>
+		<property name="author"/>
+		<component name="pubDate">
+			<property name="year" not-null="true"/>
+			<property name="month"/>
+		</component>
+		<property name="summary"/>
+		<property name="totalSales" optimistic-lock="false"/>
+		<property name="text" column="`text`"/>
+	</class>
+
+</hibernate-mapping>
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/optlock/Document.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/optlock/Document.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/optlock/Document.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/optlock/Document.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,87 @@
+//$Id: Document.java 7552 2005-07-19 18:51:24Z oneovthafew $
+package org.hibernate.test.optlock;
+
+/**
+ * @author Gavin King
+ */
+public class Document {
+	private Long id;
+	private String author;
+	private String title;
+	private String summary;
+	private String text;
+	private PublicationDate pubDate;
+	private int totalSales;
+	/**
+	 * @return Returns the author.
+	 */
+	public String getAuthor() {
+		return author;
+	}
+	/**
+	 * @param author The author to set.
+	 */
+	public void setAuthor(String author) {
+		this.author = author;
+	}
+	/**
+	 * @return Returns the id.
+	 */
+	public Long getId() {
+		return id;
+	}
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(Long id) {
+		this.id = id;
+	}
+	/**
+	 * @return Returns the summary.
+	 */
+	public String getSummary() {
+		return summary;
+	}
+	/**
+	 * @param summary The summary to set.
+	 */
+	public void setSummary(String summary) {
+		this.summary = summary;
+	}
+	/**
+	 * @return Returns the text.
+	 */
+	public String getText() {
+		return text;
+	}
+	/**
+	 * @param text The text to set.
+	 */
+	public void setText(String text) {
+		this.text = text;
+	}
+	/**
+	 * @return Returns the title.
+	 */
+	public String getTitle() {
+		return title;
+	}
+	/**
+	 * @param title The title to set.
+	 */
+	public void setTitle(String title) {
+		this.title = title;
+	}
+	public PublicationDate getPubDate() {
+		return pubDate;
+	}
+	public void setPubDate(PublicationDate pubDate) {
+		this.pubDate = pubDate;
+	}
+	public int getTotalSales() {
+		return totalSales;
+	}
+	public void setTotalSales(int totalSales) {
+		this.totalSales = totalSales;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/optlock/Document.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/optlock/OptimisticLockTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/optlock/OptimisticLockTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/optlock/OptimisticLockTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,183 @@
+//$Id: OptimisticLockTest.java 11303 2007-03-19 22:06:14Z steve.ebersole at jboss.com $
+package org.hibernate.test.optlock;
+
+import junit.framework.Test;
+
+import org.hibernate.JDBCException;
+import org.hibernate.Session;
+import org.hibernate.StaleObjectStateException;
+import org.hibernate.StaleStateException;
+import org.hibernate.dialect.SQLServerDialect;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Tests relating to the optimisitc-lock mapping option.
+ *
+ * @author Gavin King
+ * @author Steve Ebersole
+ */
+public class OptimisticLockTest extends FunctionalTestCase {
+	
+	public OptimisticLockTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "optlock/Document.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( OptimisticLockTest.class );
+	}
+	
+	public void testOptimisticLockDirty() {
+		testUpdateOptimisticLockFailure( "LockDirty" );
+	}
+
+	public void testOptimisticLockAll() {
+		testUpdateOptimisticLockFailure( "LockAll" );
+	}
+
+	public void testOptimisticLockDirtyDelete() {
+		testDeleteOptimisticLockFailure( "LockDirty" );
+	}
+
+	public void testOptimisticLockAllDelete() {
+		testDeleteOptimisticLockFailure( "LockAll" );
+	}
+
+	private void testUpdateOptimisticLockFailure(String entityName) {
+		if ( getDialect().doesRepeatableReadCauseReadersToBlockWriters() ) {
+			reportSkip( "deadlock", "update optimistic locking" );
+			return;
+		}
+		Session mainSession = openSession();
+		mainSession.beginTransaction();
+		Document doc = new Document();
+		doc.setTitle( "Hibernate in Action" );
+		doc.setAuthor( "Bauer et al" );
+		doc.setSummary( "Very boring book about persistence" );
+		doc.setText( "blah blah yada yada yada" );
+		doc.setPubDate( new PublicationDate( 2004 ) );
+		mainSession.save( entityName, doc );
+		mainSession.getTransaction().commit();
+		mainSession.close();
+
+		mainSession = openSession();
+		mainSession.beginTransaction();
+		doc = ( Document ) mainSession.get( entityName, doc.getId() );
+
+		Session otherSession = getSessions().openSession();
+		otherSession.beginTransaction();
+		Document otherDoc = ( Document ) otherSession.get( entityName, doc.getId() );
+		otherDoc.setSummary( "A modern classic" );
+		otherSession.getTransaction().commit();
+		otherSession.close();
+
+		try {
+			doc.setSummary( "A machiavelian achievement of epic proportions" );
+			mainSession.flush();
+			fail( "expecting opt lock failure" );
+		}
+		catch ( StaleObjectStateException expected ) {
+			// expected result...
+		}
+		catch( StaleStateException expected ) {
+			// expected result (if using versioned batching)...
+		}
+		catch( JDBCException e ) {
+			// SQLServer will report this condition via a SQLException
+			// when using its SNAPSHOT transaction isolation...
+			if ( ! ( getDialect() instanceof SQLServerDialect && e.getErrorCode() == 3960 ) ) {
+				throw e;
+			}
+			else {
+				// it seems to "lose track" of the transaction as well...
+				mainSession.getTransaction().rollback();
+				mainSession.beginTransaction();
+			}
+		}
+		mainSession.clear();
+		mainSession.getTransaction().commit();
+		mainSession.close();
+
+		mainSession = openSession();
+		mainSession.beginTransaction();
+		doc = ( Document ) mainSession.load( entityName, doc.getId() );
+		mainSession.delete( entityName, doc );
+		mainSession.getTransaction().commit();
+		mainSession.close();
+	}
+
+	private void testDeleteOptimisticLockFailure(String entityName) {
+		if ( getDialect().doesRepeatableReadCauseReadersToBlockWriters() ) {
+			reportSkip( "deadlock", "delete optimistic locking" );
+			return;
+		}
+		Session mainSession = openSession();
+		mainSession.beginTransaction();
+		Document doc = new Document();
+		doc.setTitle( "Hibernate in Action" );
+		doc.setAuthor( "Bauer et al" );
+		doc.setSummary( "Very boring book about persistence" );
+		doc.setText( "blah blah yada yada yada" );
+		doc.setPubDate( new PublicationDate( 2004 ) );
+		mainSession.save( entityName, doc );
+		mainSession.flush();
+		doc.setSummary( "A modern classic" );
+		mainSession.flush();
+		doc.getPubDate().setMonth( new Integer( 3 ) );
+		mainSession.flush();
+		mainSession.getTransaction().commit();
+		mainSession.close();
+
+		mainSession = openSession();
+		mainSession.beginTransaction();
+		doc = ( Document ) mainSession.get( entityName, doc.getId() );
+
+		Session otherSession = openSession();
+		otherSession.beginTransaction();
+		Document otherDoc = ( Document ) otherSession.get( entityName, doc.getId() );
+		otherDoc.setSummary( "my other summary" );
+		otherSession.flush();
+		otherSession.getTransaction().commit();
+		otherSession.close();
+
+		try {
+			mainSession.delete( doc );
+			mainSession.flush();
+			fail( "expecting opt lock failure" );
+		}
+		catch ( StaleObjectStateException e ) {
+			// expected
+		}
+		catch( StaleStateException expected ) {
+			// expected result (if using versioned batching)...
+		}
+		catch( JDBCException e ) {
+			// SQLServer will report this condition via a SQLException
+			// when using its SNAPSHOT transaction isolation...
+			if ( ! ( getDialect() instanceof SQLServerDialect && e.getErrorCode() == 3960 ) ) {
+				throw e;
+			}
+			else {
+				// it seems to "lose track" of the transaction as well...
+				mainSession.getTransaction().rollback();
+				mainSession.beginTransaction();
+			}
+		}
+		mainSession.clear();
+		mainSession.getTransaction().commit();
+		mainSession.close();
+
+		mainSession = openSession();
+		mainSession.beginTransaction();
+		doc = ( Document ) mainSession.load( entityName, doc.getId() );
+		mainSession.delete( entityName, doc );
+		mainSession.getTransaction().commit();
+		mainSession.close();
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/optlock/OptimisticLockTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/optlock/PublicationDate.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/optlock/PublicationDate.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/optlock/PublicationDate.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,26 @@
+//$Id: PublicationDate.java 7556 2005-07-19 23:22:27Z oneovthafew $
+package org.hibernate.test.optlock;
+
+public class PublicationDate {
+	private int year;
+	private Integer month;
+	
+	public PublicationDate(int year) {
+		this.year = year;
+	}
+	
+	PublicationDate() {}
+	
+	public Integer getMonth() {
+		return month;
+	}
+	public void setMonth(Integer month) {
+		this.month = month;
+	}
+	public int getYear() {
+		return year;
+	}
+	public void setYear(int year) {
+		this.year = year;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/optlock/PublicationDate.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ordered/OrderByTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ordered/OrderByTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ordered/OrderByTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,88 @@
+//$Id: OrderByTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.ordered;
+
+import java.util.Iterator;
+
+import junit.framework.Test;
+
+import org.hibernate.FetchMode;
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class OrderByTest extends FunctionalTestCase {
+	
+	public OrderByTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "ordered/Search.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( OrderByTest.class );
+	}
+	
+	public void testOrderBy() {
+		Search s = new Search("Hibernate");
+		s.getSearchResults().add("jboss.com");
+		s.getSearchResults().add("hibernate.org");
+		s.getSearchResults().add("HiA");
+		
+		Session sess = openSession();
+		Transaction tx = sess.beginTransaction();
+		sess.persist(s);
+		sess.flush();
+		
+		sess.clear();
+		s = (Search) sess.createCriteria(Search.class).uniqueResult();
+		assertFalse( Hibernate.isInitialized( s.getSearchResults() ) );
+		Iterator iter = s.getSearchResults().iterator();
+		assertEquals( iter.next(), "HiA" );
+		assertEquals( iter.next(), "hibernate.org" );
+		assertEquals( iter.next(), "jboss.com" );
+		assertFalse( iter.hasNext() );
+		
+		sess.clear();
+		s = (Search) sess.createCriteria(Search.class)
+				.setFetchMode("searchResults", FetchMode.JOIN)
+				.uniqueResult();
+		assertTrue( Hibernate.isInitialized( s.getSearchResults() ) );
+		iter = s.getSearchResults().iterator();
+		assertEquals( iter.next(), "HiA" );
+		assertEquals( iter.next(), "hibernate.org" );
+		assertEquals( iter.next(), "jboss.com" );
+		assertFalse( iter.hasNext() );
+		
+		sess.clear();
+		s = (Search) sess.createQuery("from Search s left join fetch s.searchResults")
+				.uniqueResult();
+		assertTrue( Hibernate.isInitialized( s.getSearchResults() ) );
+		iter = s.getSearchResults().iterator();
+		assertEquals( iter.next(), "HiA" );
+		assertEquals( iter.next(), "hibernate.org" );
+		assertEquals( iter.next(), "jboss.com" );
+		assertFalse( iter.hasNext() );
+		
+		/*sess.clear();
+		s = (Search) sess.createCriteria(Search.class).uniqueResult();
+		assertFalse( Hibernate.isInitialized( s.getSearchResults() ) );
+		iter = sess.createFilter( s.getSearchResults(), "").iterate();
+		assertEquals( iter.next(), "HiA" );
+		assertEquals( iter.next(), "hibernate.org" );
+		assertEquals( iter.next(), "jboss.com" );
+		assertFalse( iter.hasNext() );*/
+		
+		sess.delete(s);
+		tx.commit();
+		sess.close();
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ordered/OrderByTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ordered/Search.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ordered/Search.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ordered/Search.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+  
+-->
+
+<hibernate-mapping package="org.hibernate.test.ordered">
+	
+	<class name="Search">
+		<id name="searchString"/>
+		<set name="searchResults" order-by="lower(text) asc">
+			<key column="searchString"/>
+			<element column="text" type="string"/>
+		</set>
+	</class>
+	
+</hibernate-mapping>
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ordered/Search.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ordered/Search.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ordered/Search.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ordered/Search.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,29 @@
+//$Id: Search.java 7772 2005-08-05 23:03:46Z oneovthafew $
+package org.hibernate.test.ordered;
+
+import java.util.HashSet;
+import java.util.Set;
+
+public class Search {
+	private String searchString;
+	private Set searchResults = new HashSet();
+	
+	Search() {}
+	
+	public Search(String string) {
+		searchString = string;
+	}
+	
+	public Set getSearchResults() {
+		return searchResults;
+	}
+	public void setSearchResults(Set searchResults) {
+		this.searchResults = searchResults;
+	}
+	public String getSearchString() {
+		return searchString;
+	}
+	public void setSearchString(String searchString) {
+		this.searchString = searchString;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ordered/Search.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/Mail.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/Mail.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/Mail.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE hibernate-mapping PUBLIC
+        '-//Hibernate/Hibernate Mapping DTD 3.0//EN'
+        'http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd'>
+
+<hibernate-mapping package="org.hibernate.test.orphan" >
+
+    <class name="Mail" table="t_mail">
+
+        <id name="id" type="integer" column="id">
+            <generator class="native" />     
+        </id>
+
+        <property name="alias">
+            <column name="`alias`" length="20"/>
+        </property>
+
+        <many-to-one name="user"
+                 class="User"
+                 cascade="save-update"
+                 column="userid"
+                 not-null="true"
+                 property-ref="userid"/>
+       
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/Mail.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/Mail.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/Mail.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/Mail.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,41 @@
+package org.hibernate.test.orphan;
+
+public class Mail {
+
+	private Integer id;
+	private String alias;
+	private User user;
+
+	/*package*/ Mail() {
+	}
+
+	/*package*/ Mail(String alias, User user) {
+		this.alias = alias;
+		this.user = user;
+	}
+
+	public Integer getId() {
+		return id;
+	}
+
+	protected void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getAlias() {
+		return alias;
+	}
+
+	public void setAlias(String alias) {
+		this.alias = alias;
+	}
+
+	public User getUser() {
+		return user;
+	}
+
+	public void setUser(User user) {
+		this.user = user;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/Mail.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/OrphanTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/OrphanTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/OrphanTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,299 @@
+//$Id: OrphanTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.orphan;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.LockMode;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.util.SerializationHelper;
+
+/**
+ * @author Gavin King
+ */
+public class OrphanTest extends FunctionalTestCase {
+	
+	public OrphanTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "orphan/Product.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( OrphanTest.class );
+	}
+	
+	public void testOrphanDeleteOnDelete() {
+		Session session = openSession();
+		Transaction t = session.beginTransaction();
+		Product prod = new Product();
+		prod.setName("Widget");
+		Part part = new Part();
+		part.setName("Widge");
+		part.setDescription("part if a Widget");
+		prod.getParts().add(part);
+		Part part2 = new Part();
+		part2.setName("Get");
+		part2.setDescription("another part if a Widget");
+		prod.getParts().add(part2);
+		session.persist(prod);
+		session.flush();
+		
+		prod.getParts().remove(part);
+		
+		session.delete(prod);
+		
+		t.commit();
+		session.close();
+		
+		session = openSession();
+		t = session.beginTransaction();
+		assertNull( session.get(Part.class, "Widge") );
+		assertNull( session.get(Part.class, "Get") );
+		assertNull( session.get(Product.class, "Widget") );
+		t.commit();
+		session.close();
+	}
+	
+	public void testOrphanDeleteAfterPersist() {
+		Session session = openSession();
+		Transaction t = session.beginTransaction();
+		Product prod = new Product();
+		prod.setName("Widget");
+		Part part = new Part();
+		part.setName("Widge");
+		part.setDescription("part if a Widget");
+		prod.getParts().add(part);
+		Part part2 = new Part();
+		part2.setName("Get");
+		part2.setDescription("another part if a Widget");
+		prod.getParts().add(part2);
+		session.persist(prod);
+		
+		prod.getParts().remove(part);
+		
+		t.commit();
+		session.close();
+		
+		session = openSession();
+		t = session.beginTransaction();
+		assertNull( session.get(Part.class, "Widge") );
+		assertNotNull( session.get(Part.class, "Get") );
+		session.delete( session.get(Product.class, "Widget") );
+		t.commit();
+		session.close();
+	}
+	
+	public void testOrphanDeleteAfterPersistAndFlush() {
+		Session session = openSession();
+		Transaction t = session.beginTransaction();
+		Product prod = new Product();
+		prod.setName("Widget");
+		Part part = new Part();
+		part.setName("Widge");
+		part.setDescription("part if a Widget");
+		prod.getParts().add(part);
+		Part part2 = new Part();
+		part2.setName("Get");
+		part2.setDescription("another part if a Widget");
+		prod.getParts().add(part2);
+		session.persist(prod);
+		session.flush();
+		
+		prod.getParts().remove(part);
+		
+		t.commit();
+		session.close();
+		
+		session = openSession();
+		t = session.beginTransaction();
+		assertNull( session.get(Part.class, "Widge") );
+		assertNotNull( session.get(Part.class, "Get") );
+		session.delete( session.get(Product.class, "Widget") );
+		t.commit();
+		session.close();
+	}
+	
+	public void testOrphanDeleteAfterLock() {
+		Session session = openSession();
+		Transaction t = session.beginTransaction();
+		Product prod = new Product();
+		prod.setName("Widget");
+		Part part = new Part();
+		part.setName("Widge");
+		part.setDescription("part if a Widget");
+		prod.getParts().add(part);
+		Part part2 = new Part();
+		part2.setName("Get");
+		part2.setDescription("another part if a Widget");
+		prod.getParts().add(part2);
+		session.persist(prod);
+		t.commit();
+		session.close();
+		
+		
+		session = openSession();
+		t = session.beginTransaction();
+		session.lock(prod, LockMode.READ);
+		prod.getParts().remove(part);
+		t.commit();
+		session.close();
+		
+		session = openSession();
+		t = session.beginTransaction();
+		assertNull( session.get(Part.class, "Widge") );
+		assertNotNull( session.get(Part.class, "Get") );
+		session.delete( session.get(Product.class, "Widget") );
+		t.commit();
+		session.close();
+	}
+	
+	public void testOrphanDeleteOnSaveOrUpdate() {
+		Session session = openSession();
+		Transaction t = session.beginTransaction();
+		Product prod = new Product();
+		prod.setName("Widget");
+		Part part = new Part();
+		part.setName("Widge");
+		part.setDescription("part if a Widget");
+		prod.getParts().add(part);
+		Part part2 = new Part();
+		part2.setName("Get");
+		part2.setDescription("another part if a Widget");
+		prod.getParts().add(part2);
+		session.persist(prod);
+		t.commit();
+		session.close();
+		
+		prod.getParts().remove(part);
+		
+		session = openSession();
+		t = session.beginTransaction();
+		session.saveOrUpdate(prod);
+		t.commit();
+		session.close();
+		
+		session = openSession();
+		t = session.beginTransaction();
+		assertNull( session.get(Part.class, "Widge") );
+		assertNotNull( session.get(Part.class, "Get") );
+		session.delete( session.get(Product.class, "Widget") );
+		t.commit();
+		session.close();
+	}
+	
+	public void testOrphanDeleteOnSaveOrUpdateAfterSerialization() {
+		Session session = openSession();
+		Transaction t = session.beginTransaction();
+		Product prod = new Product();
+		prod.setName("Widget");
+		Part part = new Part();
+		part.setName("Widge");
+		part.setDescription("part if a Widget");
+		prod.getParts().add(part);
+		Part part2 = new Part();
+		part2.setName("Get");
+		part2.setDescription("another part if a Widget");
+		prod.getParts().add(part2);
+		session.persist(prod);
+		t.commit();
+		session.close();
+		
+		prod.getParts().remove(part);
+		
+		prod = (Product) SerializationHelper.clone(prod);
+		
+		session = openSession();
+		t = session.beginTransaction();
+		session.saveOrUpdate(prod);
+		t.commit();
+		session.close();
+		
+		session = openSession();
+		t = session.beginTransaction();
+		assertNull( session.get(Part.class, "Widge") );
+		assertNotNull( session.get(Part.class, "Get") );
+		session.delete( session.get(Product.class, "Widget") );
+		t.commit();
+		session.close();
+	}
+	
+	public void testOrphanDelete() {
+		Session session = openSession();
+		Transaction t = session.beginTransaction();
+		Product prod = new Product();
+		prod.setName("Widget");
+		Part part = new Part();
+		part.setName("Widge");
+		part.setDescription("part if a Widget");
+		prod.getParts().add(part);
+		Part part2 = new Part();
+		part2.setName("Get");
+		part2.setDescription("another part if a Widget");
+		prod.getParts().add(part2);
+		session.persist(prod);
+		t.commit();
+		session.close();
+		
+		getSessions().evict(Product.class);
+		getSessions().evict(Part.class);
+		
+		session = openSession();
+		t = session.beginTransaction();
+		prod = (Product) session.get(Product.class, "Widget");
+		assertTrue( Hibernate.isInitialized( prod.getParts() ) );
+		part = (Part) session.get(Part.class, "Widge");
+		prod.getParts().remove(part);
+		t.commit();
+		session.close();
+		
+		session = openSession();
+		t = session.beginTransaction();
+		assertNull( session.get(Part.class, "Widge") );
+		assertNotNull( session.get(Part.class, "Get") );
+		session.delete( session.get(Product.class, "Widget") );
+		t.commit();
+		session.close();
+	}
+	
+	public void testOrphanDeleteOnMerge() {
+		Session session = openSession();
+		Transaction t = session.beginTransaction();
+		Product prod = new Product();
+		prod.setName("Widget");
+		Part part = new Part();
+		part.setName("Widge");
+		part.setDescription("part if a Widget");
+		prod.getParts().add(part);
+		Part part2 = new Part();
+		part2.setName("Get");
+		part2.setDescription("another part if a Widget");
+		prod.getParts().add(part2);
+		session.persist(prod);
+		t.commit();
+		session.close();
+		
+		prod.getParts().remove(part);
+		
+		session = openSession();
+		t = session.beginTransaction();
+		session.merge(prod);
+		t.commit();
+		session.close();
+		
+		session = openSession();
+		t = session.beginTransaction();
+		assertNull( session.get(Part.class, "Widge") );
+		assertNotNull( session.get(Part.class, "Get") );
+		session.delete( session.get(Product.class, "Widget") );
+		t.commit();
+		session.close();
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/OrphanTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/Part.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/Part.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/Part.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,24 @@
+//$Id: Part.java 5725 2005-02-14 12:10:15Z oneovthafew $
+package org.hibernate.test.orphan;
+
+import java.io.Serializable;
+
+/**
+ * @author Gavin King
+ */
+public class Part implements Serializable {
+	private String name;
+	private String description;
+	public String getDescription() {
+		return description;
+	}
+	public void setDescription(String description) {
+		this.description = description;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/Part.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/Product.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/Product.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/Product.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.orphan">
+
+	<class name="Product" table="t_product">
+		<id name="name"/>
+		<set name="parts" cascade="all,delete-orphan" fetch="join">
+			<key column="productName" not-null="true"/>
+			<one-to-many class="Part"/>
+		</set>
+	</class>
+	
+	<class name="Part" table="t_part">
+		<id name="name"/>
+		<property name="description" not-null="true"/>
+	</class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/Product.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/Product.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/Product.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/Product.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,26 @@
+//$Id: Product.java 5725 2005-02-14 12:10:15Z oneovthafew $
+package org.hibernate.test.orphan;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author Gavin King
+ */
+public class Product implements Serializable {
+	private String name;
+	private Set parts = new HashSet();
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public Set getParts() {
+		return parts;
+	}
+	public void setParts(Set parts) {
+		this.parts = parts;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/Product.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/PropertyRefTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/PropertyRefTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/PropertyRefTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,56 @@
+// $Id: PropertyRefTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.orphan;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+
+/**
+ * Test for HHH-565
+ *
+ * @author Steve Ebersole
+ */
+public class PropertyRefTest extends FunctionalTestCase {
+
+	public PropertyRefTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "orphan/User.hbm.xml", "orphan/Mail.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( PropertyRefTest.class );
+	}
+
+	public void testDeleteParentWithBidirOrphanDeleteCollectionBasedOnPropertyRef() {
+		Session session = openSession();
+		Transaction txn = session.beginTransaction();
+		User user = new User( "test" );
+		user.addMail( "test" );
+		user.addMail( "test" );
+		session.save( user );
+		txn.commit();
+		session.close();
+
+		session = openSession();
+		txn = session.beginTransaction();
+		user = ( User ) session.load( User.class, user.getId() );
+		session.delete( user );
+		txn.commit();
+		session.close();
+
+		session = openSession();
+		txn = session.beginTransaction();
+		session.createQuery( "delete from Mail where alias = :alias" ).setString( "alias", "test" ).executeUpdate();
+		session.createQuery( "delete from User where userid = :userid" ).setString( "userid", "test" ).executeUpdate();
+		txn.commit();
+		session.close();
+	}
+	
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/PropertyRefTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/User.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/User.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/User.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE hibernate-mapping PUBLIC
+        '-//Hibernate/Hibernate Mapping DTD 3.0//EN'
+        'http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd'>
+
+<hibernate-mapping package="org.hibernate.test.orphan" >
+
+    <class name="User" table="t_user">
+
+        <id name="id" type="integer" column="id">
+            <generator class="native" />
+        </id>
+
+        <property name="userid">
+            <column name="userid" length="32" not-null="true"/>
+        </property>
+
+        <set name="mail" table="mail" cascade="all, delete-orphan" inverse="true" lazy="false">
+            <key column="userid" property-ref="userid" not-null="false"/>
+            <one-to-many class="Mail"/>
+        </set>
+
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/User.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/User.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/User.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/User.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,62 @@
+/*
+ * User.java
+ *
+ * Created on May 3, 2005, 9:42 AM
+ */
+
+package org.hibernate.test.orphan;
+
+import java.util.HashSet;
+import java.util.Set;
+
+
+/**
+ * @author Kevin
+ */
+public class User {
+
+	private Integer id;
+	private String userid;
+	private Set mail = new HashSet();
+
+	public User() {
+	}
+
+	public User(String userid) {
+		this.userid = userid;
+	}
+
+	public Integer getId() {
+		return id;
+	}
+
+	protected void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getUserid() {
+		return userid;
+	}
+
+	public void setUserid(String userid) {
+		this.userid = userid;
+	}
+
+	public Set getMail() {
+		return mail;
+	}
+
+	private void setMail(Set mail) {
+		this.mail = mail;
+	}
+
+	public Mail addMail(String alias) {
+		Mail mail = new Mail( alias, this );
+		getMail().add( mail );
+		return mail;
+	}
+
+	public void removeMail(Mail mail) {
+		getMail().remove( mail );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/User.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/bidirectional/DeleteOneToOneOrphansTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/bidirectional/DeleteOneToOneOrphansTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/bidirectional/DeleteOneToOneOrphansTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,92 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.orphan.one2one.fk.bidirectional;
+
+import java.util.List;
+
+import org.hibernate.Session;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class DeleteOneToOneOrphansTest extends FunctionalTestCase {
+	public DeleteOneToOneOrphansTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "orphan/one2one/fk/bidirectional/Mapping.hbm.xml" };
+	}
+
+	private void createData() {
+		Session session = openSession();
+		session.beginTransaction();
+		Employee emp = new Employee();
+		emp.setInfo( new EmployeeInfo( emp ) );
+		session.save( emp );
+		session.getTransaction().commit();
+		session.close();
+	}
+
+	private void cleanupData() {
+		Session session = openSession();
+		session.beginTransaction();
+		session.createQuery( "delete EmployeeInfo" ).executeUpdate();
+		session.createQuery( "delete Employee" ).executeUpdate();
+		session.getTransaction().commit();
+		session.close();
+	}
+
+	public void testOrphanedWhileManaged() {
+		createData();
+
+		Session session = openSession();
+		session.beginTransaction();
+		List results = session.createQuery( "from EmployeeInfo" ).list();
+		assertEquals( 1, results.size() );
+		results = session.createQuery( "from Employee" ).list();
+		assertEquals( 1, results.size() );
+		Employee emp = ( Employee ) results.get( 0 );
+		assertNotNull( emp.getInfo() );
+		emp.setInfo( null );
+		session.getTransaction().commit();
+		session.close();
+
+		session = openSession();
+		session.beginTransaction();
+		emp = ( Employee ) session.get( Employee.class, emp.getId() );
+		assertNull( emp.getInfo() );
+		results = session.createQuery( "from EmployeeInfo" ).list();
+		assertEquals( 0, results.size() );
+		results = session.createQuery( "from Employee" ).list();
+		assertEquals( 1, results.size() );
+		session.getTransaction().commit();
+		session.close();
+
+		cleanupData();
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/bidirectional/DeleteOneToOneOrphansTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/bidirectional/Employee.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/bidirectional/Employee.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/bidirectional/Employee.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,50 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.orphan.one2one.fk.bidirectional;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class Employee {
+	private Long id;
+	private EmployeeInfo info;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public EmployeeInfo getInfo() {
+		return info;
+	}
+
+	public void setInfo(EmployeeInfo info) {
+		this.info = info;
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/bidirectional/Employee.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/bidirectional/EmployeeInfo.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/bidirectional/EmployeeInfo.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/bidirectional/EmployeeInfo.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,57 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.orphan.one2one.fk.bidirectional;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class EmployeeInfo {
+	private Long id;
+	private Employee employee;
+
+	public EmployeeInfo() {
+	}
+
+	public EmployeeInfo(Employee employee) {
+		this.employee = employee;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Employee getEmployee() {
+		return employee;
+	}
+
+	public void setEmployee(Employee employee) {
+		this.employee = employee;
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/bidirectional/EmployeeInfo.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/bidirectional/Mapping.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/bidirectional/Mapping.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/bidirectional/Mapping.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Hibernate, Relational Persistence for Idiomatic Java
+  ~
+  ~ Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+  ~ indicated by the @author tags or express copyright attribution
+  ~ statements applied by the authors.  All third-party contributions are
+  ~ distributed under license by Red Hat Inc.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, as published by the Free Software Foundation.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  ~ or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+  ~ for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public License
+  ~ along with this distribution; if not, write to:
+  ~ Free Software Foundation, Inc.
+  ~ 51 Franklin Street, Fifth Floor
+  ~ Boston, MA  02110-1301  USA
+  -->
+
+<!DOCTYPE hibernate-mapping PUBLIC
+        '-//Hibernate/Hibernate Mapping DTD 3.0//EN'
+        'http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd'>
+
+<hibernate-mapping package="org.hibernate.test.orphan.one2one.fk.bidirectional" >
+
+    <class name="Employee">
+        <id name="id" type="long" column="id">
+            <generator class="increment" />
+        </id>
+        <one-to-one name="info"
+                    property-ref="employee"
+                    class="EmployeeInfo"
+                    cascade="all,delete-orphan"
+                    constrained="false" />
+    </class>
+
+    <class name="EmployeeInfo">
+        <id name="id" type="long" column="id">
+            <generator class="increment" />
+        </id>
+        <many-to-one name="employee"
+                     column="employee_id"
+                     unique="true"
+                     not-null="true" />
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/bidirectional/Mapping.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/composite/DeleteOneToOneOrphansTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/composite/DeleteOneToOneOrphansTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/composite/DeleteOneToOneOrphansTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,92 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.orphan.one2one.fk.composite;
+
+import java.util.List;
+
+import org.hibernate.Session;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class DeleteOneToOneOrphansTest extends FunctionalTestCase {
+	public DeleteOneToOneOrphansTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "orphan/one2one/fk/composite/Mapping.hbm.xml" };
+	}
+
+	private void createData() {
+		Session session = openSession();
+		session.beginTransaction();
+		Employee emp = new Employee();
+		emp.setInfo( new EmployeeInfo( 1L, 1L) );
+		session.save( emp );
+		session.getTransaction().commit();
+		session.close();
+	}
+
+	private void cleanupData() {
+		Session session = openSession();
+		session.beginTransaction();
+		session.createQuery( "delete EmployeeInfo" ).executeUpdate();
+		session.createQuery( "delete Employee" ).executeUpdate();
+		session.getTransaction().commit();
+		session.close();
+	}
+
+	public void testOrphanedWhileManaged() {
+		createData();
+
+		Session session = openSession();
+		session.beginTransaction();
+		List results = session.createQuery( "from EmployeeInfo" ).list();
+		assertEquals( 1, results.size() );
+		results = session.createQuery( "from Employee" ).list();
+		assertEquals( 1, results.size() );
+		Employee emp = ( Employee ) results.get( 0 );
+		assertNotNull( emp.getInfo() );
+		emp.setInfo( null );
+		session.getTransaction().commit();
+		session.close();
+
+		session = openSession();
+		session.beginTransaction();
+		emp = ( Employee ) session.get( Employee.class, emp.getId() );
+		assertNull( emp.getInfo() );
+		results = session.createQuery( "from EmployeeInfo" ).list();
+		assertEquals( 0, results.size() );
+		results = session.createQuery( "from Employee" ).list();
+		assertEquals( 1, results.size() );
+		session.getTransaction().commit();
+		session.close();
+
+		cleanupData();
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/composite/DeleteOneToOneOrphansTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/composite/Employee.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/composite/Employee.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/composite/Employee.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,50 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.orphan.one2one.fk.composite;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class Employee {
+	private Long id;
+	private EmployeeInfo info;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public EmployeeInfo getInfo() {
+		return info;
+	}
+
+	public void setInfo(EmployeeInfo info) {
+		this.info = info;
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/composite/Employee.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/composite/EmployeeInfo.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/composite/EmployeeInfo.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/composite/EmployeeInfo.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,106 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.orphan.one2one.fk.composite;
+
+import java.io.Serializable;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class EmployeeInfo {
+	public static class Id implements Serializable {
+		private Long companyId;
+		private Long personId;
+
+		public Id() {
+		}
+
+		public Id(Long companyId, Long personId) {
+			this.companyId = companyId;
+			this.personId = personId;
+		}
+
+		public Long getCompanyId() {
+			return companyId;
+		}
+
+		public void setCompanyId(Long companyId) {
+			this.companyId = companyId;
+		}
+
+		public Long getPersonId() {
+			return personId;
+		}
+
+		public void setPersonId(Long personId) {
+			this.personId = personId;
+		}
+
+		@Override
+		public boolean equals(Object o) {
+			if ( this == o ) {
+				return true;
+			}
+			if ( o == null || getClass() != o.getClass() ) {
+				return false;
+			}
+
+			Id id = (Id) o;
+
+			return companyId.equals( id.companyId )
+					&& personId.equals( id.personId );
+
+		}
+
+		@Override
+		public int hashCode() {
+			int result = companyId.hashCode();
+			result = 31 * result + personId.hashCode();
+			return result;
+		}
+	}
+
+	private Id id;
+
+	public EmployeeInfo() {
+	}
+
+	public EmployeeInfo(Long companyId, Long personId) {
+		this( new Id( companyId, personId ) );
+	}
+
+	public EmployeeInfo(Id id) {
+		this.id = id;
+	}
+
+	public Id getId() {
+		return id;
+	}
+
+	public void setId(Id id) {
+		this.id = id;
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/composite/EmployeeInfo.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/composite/Mapping.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/composite/Mapping.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/composite/Mapping.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Hibernate, Relational Persistence for Idiomatic Java
+  ~
+  ~ Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+  ~ indicated by the @author tags or express copyright attribution
+  ~ statements applied by the authors.  All third-party contributions are
+  ~ distributed under license by Red Hat Inc.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, as published by the Free Software Foundation.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  ~ or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+  ~ for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public License
+  ~ along with this distribution; if not, write to:
+  ~ Free Software Foundation, Inc.
+  ~ 51 Franklin Street, Fifth Floor
+  ~ Boston, MA  02110-1301  USA
+  -->
+
+<!DOCTYPE hibernate-mapping PUBLIC
+        '-//Hibernate/Hibernate Mapping DTD 3.0//EN'
+        'http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd'>
+
+<hibernate-mapping package="org.hibernate.test.orphan.one2one.fk.composite" >
+
+    <class name="Employee">
+        <id name="id" type="long" column="id">
+            <generator class="increment" />
+        </id>
+         <many-to-one name="info" unique="true" cascade="all,delete-orphan">
+            <column name="COMP_ID" />
+            <column name="PERS_ID" />
+         </many-to-one>
+    </class>
+
+    <class name="EmployeeInfo">
+        <composite-id class="EmployeeInfo$Id" name="id">
+            <key-property name="companyId" column="COMP_ID" />
+            <key-property name="personId" column="PERS_ID" />
+        </composite-id>
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/composite/Mapping.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/bidirectional/DeleteOneToOneOrphansTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/bidirectional/DeleteOneToOneOrphansTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/bidirectional/DeleteOneToOneOrphansTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,92 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.orphan.one2one.fk.reversed.bidirectional;
+
+import java.util.List;
+
+import org.hibernate.Session;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class DeleteOneToOneOrphansTest extends FunctionalTestCase {
+	public DeleteOneToOneOrphansTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "orphan/one2one/fk/reversed/bidirectional/Mapping.hbm.xml" };
+	}
+
+	private void createData() {
+		Session session = openSession();
+		session.beginTransaction();
+		Employee emp = new Employee();
+		emp.setInfo( new EmployeeInfo( emp ) );
+		session.save( emp );
+		session.getTransaction().commit();
+		session.close();
+	}
+
+	private void cleanupData() {
+		Session session = openSession();
+		session.beginTransaction();
+		session.createQuery( "delete EmployeeInfo" ).executeUpdate();
+		session.createQuery( "delete Employee" ).executeUpdate();
+		session.getTransaction().commit();
+		session.close();
+	}
+
+	public void testOrphanedWhileManaged() {
+		createData();
+
+		Session session = openSession();
+		session.beginTransaction();
+		List results = session.createQuery( "from EmployeeInfo" ).list();
+		assertEquals( 1, results.size() );
+		results = session.createQuery( "from Employee" ).list();
+		assertEquals( 1, results.size() );
+		Employee emp = ( Employee ) results.get( 0 );
+		assertNotNull( emp.getInfo() );
+		emp.setInfo( null );
+		session.getTransaction().commit();
+		session.close();
+
+		session = openSession();
+		session.beginTransaction();
+		emp = ( Employee ) session.get( Employee.class, emp.getId() );
+		assertNull( emp.getInfo() );
+		results = session.createQuery( "from EmployeeInfo" ).list();
+		assertEquals( 0, results.size() );
+		results = session.createQuery( "from Employee" ).list();
+		assertEquals( 1, results.size() );
+		session.getTransaction().commit();
+		session.close();
+
+		cleanupData();
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/bidirectional/DeleteOneToOneOrphansTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/bidirectional/Employee.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/bidirectional/Employee.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/bidirectional/Employee.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,50 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.orphan.one2one.fk.reversed.bidirectional;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class Employee {
+	private Long id;
+	private EmployeeInfo info;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public EmployeeInfo getInfo() {
+		return info;
+	}
+
+	public void setInfo(EmployeeInfo info) {
+		this.info = info;
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/bidirectional/Employee.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/bidirectional/EmployeeInfo.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/bidirectional/EmployeeInfo.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/bidirectional/EmployeeInfo.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,57 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.orphan.one2one.fk.reversed.bidirectional;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class EmployeeInfo {
+	private Long id;
+	private Employee employee;
+
+	public EmployeeInfo() {
+	}
+
+	public EmployeeInfo(Employee employee) {
+		this.employee = employee;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Employee getEmployee() {
+		return employee;
+	}
+
+	public void setEmployee(Employee employee) {
+		this.employee = employee;
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/bidirectional/EmployeeInfo.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/bidirectional/Mapping.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/bidirectional/Mapping.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/bidirectional/Mapping.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Hibernate, Relational Persistence for Idiomatic Java
+  ~
+  ~ Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+  ~ indicated by the @author tags or express copyright attribution
+  ~ statements applied by the authors.  All third-party contributions are
+  ~ distributed under license by Red Hat Inc.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, as published by the Free Software Foundation.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  ~ or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+  ~ for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public License
+  ~ along with this distribution; if not, write to:
+  ~ Free Software Foundation, Inc.
+  ~ 51 Franklin Street, Fifth Floor
+  ~ Boston, MA  02110-1301  USA
+  -->
+
+<!DOCTYPE hibernate-mapping PUBLIC
+        '-//Hibernate/Hibernate Mapping DTD 3.0//EN'
+        'http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd'>
+
+<hibernate-mapping package="org.hibernate.test.orphan.one2one.fk.reversed.bidirectional" >
+
+    <class name="Employee">
+        <id name="id" type="long" column="id">
+            <generator class="increment" />
+        </id>
+         <many-to-one name="info"
+                    column="info_id"
+                    unique="true"
+                    cascade="all,delete-orphan"/>
+    </class>
+
+    <class name="EmployeeInfo">
+        <id name="id" type="long" column="id">
+            <generator class="increment" />
+        </id>
+        <one-to-one name="employee"
+                   property-ref="info"
+                   class="Employee" />
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/bidirectional/Mapping.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/unidirectional/DeleteOneToOneOrphansTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/unidirectional/DeleteOneToOneOrphansTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/unidirectional/DeleteOneToOneOrphansTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,92 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.orphan.one2one.fk.reversed.unidirectional;
+
+import java.util.List;
+
+import org.hibernate.Session;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class DeleteOneToOneOrphansTest extends FunctionalTestCase {
+	public DeleteOneToOneOrphansTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "orphan/one2one/fk/reversed/unidirectional/Mapping.hbm.xml" };
+	}
+
+	private void createData() {
+		Session session = openSession();
+		session.beginTransaction();
+		Employee emp = new Employee();
+		emp.setInfo( new EmployeeInfo() );
+		session.save( emp );
+		session.getTransaction().commit();
+		session.close();
+	}
+
+	private void cleanupData() {
+		Session session = openSession();
+		session.beginTransaction();
+		session.createQuery( "delete EmployeeInfo" ).executeUpdate();
+		session.createQuery( "delete Employee" ).executeUpdate();
+		session.getTransaction().commit();
+		session.close();
+	}
+
+	public void testOrphanedWhileManaged() {
+		createData();
+
+		Session session = openSession();
+		session.beginTransaction();
+		List results = session.createQuery( "from EmployeeInfo" ).list();
+		assertEquals( 1, results.size() );
+		results = session.createQuery( "from Employee" ).list();
+		assertEquals( 1, results.size() );
+		Employee emp = ( Employee ) results.get( 0 );
+		assertNotNull( emp.getInfo() );
+		emp.setInfo( null );
+		session.getTransaction().commit();
+		session.close();
+
+		session = openSession();
+		session.beginTransaction();
+		emp = ( Employee ) session.get( Employee.class, emp.getId() );
+		assertNull( emp.getInfo() );
+		results = session.createQuery( "from EmployeeInfo" ).list();
+		assertEquals( 0, results.size() );
+		results = session.createQuery( "from Employee" ).list();
+		assertEquals( 1, results.size() );
+		session.getTransaction().commit();
+		session.close();
+
+		cleanupData();
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/unidirectional/DeleteOneToOneOrphansTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/unidirectional/Employee.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/unidirectional/Employee.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/unidirectional/Employee.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,50 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.orphan.one2one.fk.reversed.unidirectional;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class Employee {
+	private Long id;
+	private EmployeeInfo info;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public EmployeeInfo getInfo() {
+		return info;
+	}
+
+	public void setInfo(EmployeeInfo info) {
+		this.info = info;
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/unidirectional/Employee.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/unidirectional/EmployeeInfo.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/unidirectional/EmployeeInfo.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/unidirectional/EmployeeInfo.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,44 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.orphan.one2one.fk.reversed.unidirectional;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class EmployeeInfo {
+	private Long id;
+
+	public EmployeeInfo() {
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/unidirectional/EmployeeInfo.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/unidirectional/Mapping.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/unidirectional/Mapping.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/unidirectional/Mapping.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Hibernate, Relational Persistence for Idiomatic Java
+  ~
+  ~ Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+  ~ indicated by the @author tags or express copyright attribution
+  ~ statements applied by the authors.  All third-party contributions are
+  ~ distributed under license by Red Hat Inc.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, as published by the Free Software Foundation.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  ~ or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+  ~ for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public License
+  ~ along with this distribution; if not, write to:
+  ~ Free Software Foundation, Inc.
+  ~ 51 Franklin Street, Fifth Floor
+  ~ Boston, MA  02110-1301  USA
+  -->
+
+<!DOCTYPE hibernate-mapping PUBLIC
+        '-//Hibernate/Hibernate Mapping DTD 3.0//EN'
+        'http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd'>
+
+<hibernate-mapping package="org.hibernate.test.orphan.one2one.fk.reversed.unidirectional" >
+
+    <class name="Employee">
+        <id name="id" type="long" column="id">
+            <generator class="increment" />
+        </id>
+         <many-to-one name="info"
+                    column="info_id"
+                    unique="true"
+                    cascade="all,delete-orphan"/>
+    </class>
+
+    <class name="EmployeeInfo">
+        <id name="id" type="long" column="id">
+            <generator class="increment" />
+        </id>
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/fk/reversed/unidirectional/Mapping.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/bidirectional/DeleteOneToOneOrphansTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/bidirectional/DeleteOneToOneOrphansTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/bidirectional/DeleteOneToOneOrphansTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,92 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.orphan.one2one.pk.bidirectional;
+
+import java.util.List;
+
+import org.hibernate.Session;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class DeleteOneToOneOrphansTest extends FunctionalTestCase {
+	public DeleteOneToOneOrphansTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "orphan/one2one/pk/bidirectional/Mapping.hbm.xml" };
+	}
+
+	private void createData() {
+		Session session = openSession();
+		session.beginTransaction();
+		Employee emp = new Employee();
+		emp.setInfo( new EmployeeInfo( emp ) );
+		session.save( emp );
+		session.getTransaction().commit();
+		session.close();
+	}
+
+	private void cleanupData() {
+		Session session = openSession();
+		session.beginTransaction();
+		session.createQuery( "delete EmployeeInfo" ).executeUpdate();
+		session.createQuery( "delete Employee" ).executeUpdate();
+		session.getTransaction().commit();
+		session.close();
+	}
+
+	public void testOrphanedWhileManaged() {
+		createData();
+
+		Session session = openSession();
+		session.beginTransaction();
+		List results = session.createQuery( "from EmployeeInfo" ).list();
+		assertEquals( 1, results.size() );
+		results = session.createQuery( "from Employee" ).list();
+		assertEquals( 1, results.size() );
+		Employee emp = ( Employee ) results.get( 0 );
+		assertNotNull( emp.getInfo() );
+		emp.setInfo( null );
+		session.getTransaction().commit();
+		session.close();
+
+		session = openSession();
+		session.beginTransaction();
+		emp = ( Employee ) session.get( Employee.class, emp.getId() );
+		assertNull( emp.getInfo() );
+		results = session.createQuery( "from EmployeeInfo" ).list();
+		assertEquals( 0, results.size() );
+		results = session.createQuery( "from Employee" ).list();
+		assertEquals( 1, results.size() );
+		session.getTransaction().commit();
+		session.close();
+
+		cleanupData();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/bidirectional/DeleteOneToOneOrphansTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/bidirectional/Employee.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/bidirectional/Employee.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/bidirectional/Employee.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,50 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.orphan.one2one.pk.bidirectional;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class Employee {
+	private Long id;
+	private EmployeeInfo info;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public EmployeeInfo getInfo() {
+		return info;
+	}
+
+	public void setInfo(EmployeeInfo info) {
+		this.info = info;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/bidirectional/Employee.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/bidirectional/EmployeeInfo.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/bidirectional/EmployeeInfo.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/bidirectional/EmployeeInfo.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,57 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.orphan.one2one.pk.bidirectional;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class EmployeeInfo {
+	private Long id;
+	private Employee employee;
+
+	public EmployeeInfo() {
+	}
+
+	public EmployeeInfo(Employee employee) {
+		this.employee = employee;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Employee getEmployee() {
+		return employee;
+	}
+
+	public void setEmployee(Employee employee) {
+		this.employee = employee;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/bidirectional/EmployeeInfo.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/bidirectional/Mapping.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/bidirectional/Mapping.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/bidirectional/Mapping.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Hibernate, Relational Persistence for Idiomatic Java
+  ~
+  ~ Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+  ~ indicated by the @author tags or express copyright attribution
+  ~ statements applied by the authors.  All third-party contributions are
+  ~ distributed under license by Red Hat Inc.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, as published by the Free Software Foundation.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  ~ or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+  ~ for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public License
+  ~ along with this distribution; if not, write to:
+  ~ Free Software Foundation, Inc.
+  ~ 51 Franklin Street, Fifth Floor
+  ~ Boston, MA  02110-1301  USA
+  -->
+
+<!DOCTYPE hibernate-mapping PUBLIC
+        '-//Hibernate/Hibernate Mapping DTD 3.0//EN'
+        'http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd'>
+
+<hibernate-mapping package="org.hibernate.test.orphan.one2one.pk.bidirectional" >
+
+    <class name="Employee">
+        <id name="id" type="long" column="id">
+            <generator class="increment" />
+        </id>
+        <one-to-one name="info"
+                    class="EmployeeInfo"
+                    cascade="all,delete-orphan"
+                    constrained="false" />
+    </class>
+
+    <class name="EmployeeInfo">
+        <id name="id" type="long" column="id">
+            <generator class="foreign">
+                <param name="property">employee</param>
+            </generator>
+        </id>
+        <one-to-one name="employee"
+                    class="Employee"
+                    constrained="true" />
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/bidirectional/Mapping.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/unidirectional/DeleteOneToOneOrphansTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/unidirectional/DeleteOneToOneOrphansTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/unidirectional/DeleteOneToOneOrphansTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,98 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.orphan.one2one.pk.unidirectional;
+
+import java.util.List;
+
+import org.hibernate.Session;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class DeleteOneToOneOrphansTest extends FunctionalTestCase {
+	public DeleteOneToOneOrphansTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "orphan/one2one/pk/unidirectional/Mapping.hbm.xml" };
+	}
+
+	private void createData() {
+		Session session = openSession();
+		session.beginTransaction();
+		Employee emp = new Employee();
+		session.save( emp );
+		emp.setInfo( new EmployeeInfo( emp.getId() ) );
+		session.getTransaction().commit();
+		session.close();
+	}
+
+	private void cleanupData() {
+		Session session = openSession();
+		session.beginTransaction();
+		session.createQuery( "delete EmployeeInfo" ).executeUpdate();
+		session.createQuery( "delete Employee" ).executeUpdate();
+		session.getTransaction().commit();
+		session.close();
+	}
+
+	public void testOrphanedWhileManaged() {
+		createData();
+
+		Session session = openSession();
+		session.beginTransaction();
+		List results = session.createQuery( "from EmployeeInfo" ).list();
+		assertEquals( 1, results.size() );
+		results = session.createQuery( "from Employee" ).list();
+		assertEquals( 1, results.size() );
+		Employee emp = ( Employee ) results.get( 0 );
+		assertNotNull( emp.getInfo() );
+		results = session.createQuery( "from Employee e, EmployeeInfo i where e.info = i" ).list();
+		assertEquals( 1, results.size() );
+		Object [] result = ( Object [] ) results.get( 0 );
+		emp = ( Employee ) result[ 0 ];
+		assertNotNull( result[ 1 ] );
+		assertSame( emp.getInfo(), result[ 1 ] );
+		emp.setInfo( null );
+		session.getTransaction().commit();
+		session.close();
+
+		session = openSession();
+		session.beginTransaction();
+		emp = ( Employee ) session.get( Employee.class, emp.getId() );
+		assertNull( emp.getInfo() );
+		results = session.createQuery( "from EmployeeInfo" ).list();
+		assertEquals( 0, results.size() );
+		results = session.createQuery( "from Employee" ).list();
+		assertEquals( 1, results.size() );
+		session.getTransaction().commit();
+		session.close();
+
+		cleanupData();
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/unidirectional/DeleteOneToOneOrphansTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/unidirectional/Employee.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/unidirectional/Employee.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/unidirectional/Employee.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,50 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.orphan.one2one.pk.unidirectional;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class Employee {
+	private Long id;
+	private EmployeeInfo info;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public EmployeeInfo getInfo() {
+		return info;
+	}
+
+	public void setInfo(EmployeeInfo info) {
+		this.info = info;
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/unidirectional/Employee.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/unidirectional/EmployeeInfo.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/unidirectional/EmployeeInfo.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/unidirectional/EmployeeInfo.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,48 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.orphan.one2one.pk.unidirectional;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class EmployeeInfo {
+	private Long id;
+
+	public EmployeeInfo() {
+	}
+
+	public EmployeeInfo(Long id) {
+		this.id = id;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/unidirectional/EmployeeInfo.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/unidirectional/Mapping.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/unidirectional/Mapping.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/unidirectional/Mapping.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Hibernate, Relational Persistence for Idiomatic Java
+  ~
+  ~ Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+  ~ indicated by the @author tags or express copyright attribution
+  ~ statements applied by the authors.  All third-party contributions are
+  ~ distributed under license by Red Hat Inc.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, as published by the Free Software Foundation.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  ~ or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+  ~ for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public License
+  ~ along with this distribution; if not, write to:
+  ~ Free Software Foundation, Inc.
+  ~ 51 Franklin Street, Fifth Floor
+  ~ Boston, MA  02110-1301  USA
+  -->
+
+<!DOCTYPE hibernate-mapping PUBLIC
+        '-//Hibernate/Hibernate Mapping DTD 3.0//EN'
+        'http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd'>
+
+<hibernate-mapping package="org.hibernate.test.orphan.one2one.pk.unidirectional" >
+
+    <class name="Employee">
+        <id name="id" type="long" column="id">
+            <generator class="increment" />
+        </id>
+        <one-to-one name="info"
+                    class="EmployeeInfo"
+                    cascade="all,delete-orphan"
+                    constrained="false" />
+    </class>
+
+    <class name="EmployeeInfo">
+        <id name="id" type="long" column="id">
+            <generator class="assigned" />
+        </id>
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/orphan/one2one/pk/unidirectional/Mapping.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/pagination/DataPoint.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/pagination/DataPoint.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/pagination/DataPoint.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,48 @@
+<?xml version="1.0"?>
+<!--
+  ~ Hibernate, Relational Persistence for Idiomatic Java
+  ~
+  ~ Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+  ~ indicated by the @author tags or express copyright attribution
+  ~ statements applied by the authors.  All third-party contributions are
+  ~ distributed under license by Red Hat Middleware LLC.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, as published by the Free Software Foundation.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  ~ or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+  ~ for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public License
+  ~ along with this distribution; if not, write to:
+  ~ Free Software Foundation, Inc.
+  ~ 51 Franklin Street, Fifth Floor
+  ~ Boston, MA  02110-1301  USA
+  -->
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping 
+	package="org.hibernate.test.pagination">
+
+	<class name="DataPoint" 
+		dynamic-update="true">
+		<!--rowid="rowid"--> <!-- remove this if not oracle -->
+		<id name="id">
+			<generator class="increment"/>
+		</id>
+        <property name="sequence" not-null="true" column="seqval" type="int" />
+        <property name="x">
+			<column name="xval" not-null="true" precision="20" scale="19" unique-key="xy"/>
+		</property>
+		<property name="y">
+			<column name="yval" not-null="true" precision="20" scale="19" unique-key="xy"/>
+		</property>
+		<property name="description"/>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/pagination/DataPoint.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/pagination/DataPoint.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/pagination/DataPoint.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/pagination/DataPoint.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,111 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.pagination;
+
+import java.math.BigDecimal;
+
+/**
+ * @author Gavin King
+ */
+public class DataPoint {
+	private long id;
+	private int sequence;
+	private BigDecimal x;
+	private BigDecimal y;
+	private String description;
+
+	/**
+	 * @return Returns the id.
+	 */
+	public long getId() {
+		return id;
+	}
+
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	/**
+	 * Getter for property 'sequence'.
+	 *
+	 * @return Value for property 'sequence'.
+	 */
+	public int getSequence() {
+		return sequence;
+	}
+
+	/**
+	 * Setter for property 'sequence'.
+	 *
+	 * @param sequence Value to set for property 'sequence'.
+	 */
+	public void setSequence(int sequence) {
+		this.sequence = sequence;
+	}
+
+	/**
+	 * @return Returns the description.
+	 */
+	public String getDescription() {
+		return description;
+	}
+
+	/**
+	 * @param description The description to set.
+	 */
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
+	/**
+	 * @return Returns the x.
+	 */
+	public BigDecimal getX() {
+		return x;
+	}
+
+	/**
+	 * @param x The x to set.
+	 */
+	public void setX(BigDecimal x) {
+		this.x = x;
+	}
+
+	/**
+	 * @return Returns the y.
+	 */
+	public BigDecimal getY() {
+		return y;
+	}
+
+	/**
+	 * @param y The y to set.
+	 */
+	public void setY(BigDecimal y) {
+		this.y = y;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/pagination/DataPoint.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/pagination/PaginationTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/pagination/PaginationTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/pagination/PaginationTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,182 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.pagination;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.SQLQuery;
+import org.hibernate.Query;
+import org.hibernate.Criteria;
+import org.hibernate.criterion.Order;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class PaginationTest extends FunctionalTestCase {
+	public static final int ROWS = 100;
+
+	public PaginationTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "pagination/DataPoint.hbm.xml" };
+	}
+
+	public String getCacheConcurrencyStrategy() {
+		return null;
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( PaginationTest.class );
+	}
+
+	public void testLimit() {
+		if ( ! getDialect().supportsLimit() ) {
+			reportSkip( "Dialect does not support limit" );
+			return;
+		}
+
+		prepareTestData();
+
+		Session session = openSession();
+		session.beginTransaction();
+
+		int count;
+
+		count = generateBaseHQLQuery( session )
+				.setMaxResults( 5 )
+				.list()
+				.size();
+		assertEquals( 5, count );
+
+		count = generateBaseCriteria( session )
+				.setMaxResults( 18 )
+				.list()
+				.size();
+		assertEquals( 18, count );
+
+		count = generateBaseSQLQuery( session )
+				.setMaxResults( 13 )
+				.list()
+				.size();
+		assertEquals( 13, count );
+
+		session.getTransaction().commit();
+		session.close();
+
+		cleanupTestData();
+	}
+
+	public void testLimitOffset() {
+		if ( ! getDialect().supportsLimitOffset() ) {
+			reportSkip( "Dialect does not support limit+offset" );
+			return;
+		}
+
+		prepareTestData();
+
+		Session session = openSession();
+		session.beginTransaction();
+
+		List result;
+
+		result = generateBaseHQLQuery( session )
+				.setFirstResult( 0 )
+				.setMaxResults( 20 )
+				.list();
+		assertEquals( 20, result.size() );
+		assertEquals( 0, ( ( DataPoint ) result.get( 0 ) ).getSequence() );
+		assertEquals( 1, ( ( DataPoint ) result.get( 1 ) ).getSequence() );
+
+		result = generateBaseCriteria( session )
+				.setFirstResult( 1 )
+				.setMaxResults( 20 )
+				.list();
+		assertEquals( 20, result.size() );
+		assertEquals( 1, ( ( DataPoint ) result.get( 0 ) ).getSequence() );
+		assertEquals( 2, ( ( DataPoint ) result.get( 1 ) ).getSequence() );
+
+		result = generateBaseCriteria( session )
+				.setFirstResult( 99 )
+				.setMaxResults( Integer.MAX_VALUE - 200 )
+				.list();
+		assertEquals( 1, result.size() );
+		assertEquals( 99, ( ( DataPoint ) result.get( 0 ) ).getSequence() );
+
+		session.getTransaction().commit();
+		session.close();
+
+		cleanupTestData();
+	}
+
+	private Query generateBaseHQLQuery(Session session) {
+		return session.createQuery( "select dp from DataPoint dp order by dp.sequence" );
+	}
+
+	private Criteria generateBaseCriteria(Session session) {
+		return session.createCriteria( DataPoint.class )
+				.addOrder( Order.asc( "sequence" ) );
+	}
+
+	private SQLQuery generateBaseSQLQuery(Session session) {
+		return session.createSQLQuery( "select id, seqval, xval, yval, description from DataPoint order by seqval" )
+				.addEntity( DataPoint.class );
+	}
+
+	private void prepareTestData() {
+		Session session = openSession();
+		session.beginTransaction();
+		for ( int i = 0; i < ROWS; i++ ) {
+			DataPoint dataPoint = new DataPoint();
+			dataPoint.setSequence( i );
+			dataPoint.setDescription( "data point #" + i );
+			BigDecimal x = new BigDecimal( i * 0.1d ).setScale( 19, BigDecimal.ROUND_DOWN );
+			dataPoint.setX( x );
+			dataPoint.setY( new BigDecimal( Math.cos( x.doubleValue() ) ).setScale( 19, BigDecimal.ROUND_DOWN ) );
+			session.save( dataPoint );
+		}
+		session.getTransaction().commit();
+		session.close();
+	}
+
+	private void cleanupTestData() {
+		Session session = openSession();
+		session.beginTransaction();
+		session.createQuery( "delete DataPoint" ).executeUpdate();
+		session.getTransaction().commit();
+		session.close();
+	}
+
+	private void reportSkip(String message) {
+		reportSkip( message, "pagination support" );
+	}
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/pagination/PaginationTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/basic/Account.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/basic/Account.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/basic/Account.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,48 @@
+//$Id: Account.java 4399 2004-08-21 08:43:20Z oneovthafew $
+package org.hibernate.test.propertyref.basic;
+
+/**
+ * @author Gavin King
+ */
+public class Account {
+	private String accountId;
+	private Person user;
+	private char type;
+	/**
+	 * @return Returns the user.
+	 */
+	public Person getUser() {
+		return user;
+	}
+	/**
+	 * @param user The user to set.
+	 */
+	public void setUser(Person user) {
+		this.user = user;
+	}
+	/**
+	 * @return Returns the accountId.
+	 */
+	public String getAccountId() {
+		return accountId;
+	}
+	/**
+	 * @param accountId The accountId to set.
+	 */
+	public void setAccountId(String accountId) {
+		this.accountId = accountId;
+	}
+	/**
+	 * @return Returns the type.
+	 */
+	public char getType() {
+		return type;
+	}
+	/**
+	 * @param type The type to set.
+	 */
+	public void setType(char type) {
+		this.type = type;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/basic/Account.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/basic/Address.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/basic/Address.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/basic/Address.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,73 @@
+//$Id: Address.java 4390 2004-08-20 07:54:48Z oneovthafew $
+package org.hibernate.test.propertyref.basic;
+
+/**
+ * @author gavin
+ */
+public class Address {
+	private Long id;
+	private String address;
+	private String zip;
+	private String country;
+	private Person person;
+	/**
+	 * @return Returns the id.
+	 */
+	public Long getId() {
+		return id;
+	}
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(Long id) {
+		this.id = id;
+	}
+	/**
+	 * @return Returns the person.
+	 */
+	public Person getPerson() {
+		return person;
+	}
+	/**
+	 * @param person The person to set.
+	 */
+	public void setPerson(Person person) {
+		this.person = person;
+	}
+	/**
+	 * @return Returns the address.
+	 */
+	public String getAddress() {
+		return address;
+	}
+	/**
+	 * @param address The address to set.
+	 */
+	public void setAddress(String address) {
+		this.address = address;
+	}
+	/**
+	 * @return Returns the country.
+	 */
+	public String getCountry() {
+		return country;
+	}
+	/**
+	 * @param country The country to set.
+	 */
+	public void setCountry(String country) {
+		this.country = country;
+	}
+	/**
+	 * @return Returns the zip.
+	 */
+	public String getZip() {
+		return zip;
+	}
+	/**
+	 * @param zip The zip to set.
+	 */
+	public void setZip(String zip) {
+		this.zip = zip;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/basic/Address.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/basic/Group.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/basic/Group.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/basic/Group.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,23 @@
+//$Id: Group.java 7589 2005-07-21 01:56:42Z oneovthafew $
+package org.hibernate.test.propertyref.basic;
+
+import java.util.HashSet;
+import java.util.Set;
+
+public class Group {
+	private String name;
+	private Set users = new HashSet();
+	
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public Set getUsers() {
+		return users;
+	}
+	public void setUsers(Set users) {
+		this.users = users;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/basic/Group.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/basic/Person.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/basic/Person.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/basic/Person.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,66 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+  Demonstrates the use of property-ref to map legacy data where
+  foreign keys reference something other than the primary key of
+  the associated entity. Here we show:
+
+  (1) A one-to-one foreign key association (prefer primary key
+      associations)
+
+  (2) A bidirectional one-to-many association on a key that is
+      not the primary key (prefer associations from foreign keys
+      to primary keys)
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.propertyref.basic">
+
+    <class name="Person" table="PROPREF_PERS">
+        <id name="id">
+            <generator class="hilo"/>
+        </id>
+        <property name="name" length="100"/>
+        <property name="userId" column="person_userid" length="8" unique="true"/>
+        <one-to-one name="address" property-ref="person" cascade="all" fetch="join"/>
+        <set name="accounts" inverse="true">
+            <key column="userId" property-ref="userId"/>
+            <one-to-many class="Account"/>
+        </set>
+        <bag name="systems" table="USER_SYSTEM" lazy="true" inverse="false" cascade="all">
+            <key column="USER_ID" property-ref="userId" />
+            <element type="string" column="SYSTEM" />
+        </bag>
+    </class>
+
+    <class name="Address" table="PROPREF_ADDR">
+        <id name="id">
+            <generator class="hilo"/>
+        </id>
+        <property name="address" length="300"/>
+        <property name="zip" length="5"/>
+        <property name="country" length="25"/>
+        <many-to-one name="person" unique="true" not-null="true"/>
+    </class>
+
+    <class name="Account" table="PROPREF_ACCT">
+        <id name="accountId" length="32">
+            <generator class="uuid.hex"/>
+        </id>
+        <many-to-one name="user" column="userId" property-ref="userId"/>
+        <property name="type" column="`type`" not-null="true"/>
+    </class>
+
+    <class name="Group" table="PROPREF_GRP">
+        <id name="name"/>
+        <set name="users" table="PROPREF_USERGROUP" cascade="save-update">
+            <key column="groupName"/>
+            <many-to-many column="userId" class="Person" property-ref="userId"/>
+        </set>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/basic/Person.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/basic/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/basic/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/basic/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,88 @@
+//$Id: Person.java 10396 2006-09-01 08:48:02 -0500 (Fri, 01 Sep 2006) steve.ebersole at jboss.com $
+package org.hibernate.test.propertyref.basic;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * @author gavin
+ */
+public class Person {
+	private Long id;
+	private String name;
+	private Address address;
+	private String userId;
+	private Set accounts = new HashSet();
+	private List systems = new ArrayList();
+
+	/**
+	 * @return Returns the userId.
+	 */
+	public String getUserId() {
+		return userId;
+	}
+	/**
+	 * @param userId The userId to set.
+	 */
+	public void setUserId(String userId) {
+		this.userId = userId;
+	}
+	/**
+	 * @return Returns the address.
+	 */
+	public Address getAddress() {
+		return address;
+	}
+	/**
+	 * @param address The address to set.
+	 */
+	public void setAddress(Address address) {
+		this.address = address;
+	}
+	/**
+	 * @return Returns the id.
+	 */
+	public Long getId() {
+		return id;
+	}
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(Long id) {
+		this.id = id;
+	}
+	/**
+	 * @return Returns the name.
+	 */
+	public String getName() {
+		return name;
+	}
+	/**
+	 * @param name The name to set.
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+	/**
+	 * @return Returns the accounts.
+	 */
+	public Set getAccounts() {
+		return accounts;
+	}
+	/**
+	 * @param accounts The accounts to set.
+	 */
+	public void setAccounts(Set accounts) {
+		this.accounts = accounts;
+	}
+
+	public List getSystems() {
+		return systems;
+	}
+
+	public void setSystems(List systems) {
+		this.systems = systems;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/basic/Person.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/basic/PropertyRefTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/basic/PropertyRefTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/basic/PropertyRefTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,269 @@
+//$Id: PropertyRefTest.java 10396 2006-09-01 08:48:02 -0500 (Fri, 01 Sep 2006) steve.ebersole at jboss.com $
+package org.hibernate.test.propertyref.basic;
+
+import java.util.Iterator;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.FetchMode;
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.mapping.Column;
+import org.hibernate.mapping.ForeignKey;
+import org.hibernate.mapping.PersistentClass;
+
+/**
+ * @author Gavin King
+ */
+public class PropertyRefTest extends FunctionalTestCase {
+	
+	public PropertyRefTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "propertyref/basic/Person.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setProperty(Environment.DEFAULT_BATCH_FETCH_SIZE, "1");
+		cfg.setProperty(Environment.GENERATE_STATISTICS, "true");
+	}
+
+	public String getCacheConcurrencyStrategy() {
+		return null;
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( PropertyRefTest.class );
+	}
+
+	public void testNonLazyBagKeyPropertyRef() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Person p = new Person();
+		p.setName( "Steve" );
+		p.setUserId( "steve" );
+		p.getSystems().add( "QA" );
+		p.getSystems().add( "R&D" );
+		s.persist( p );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery( "from Person" ).list();
+		s.clear();
+		s.createSQLQuery( "select {p.*} from PROPREF_PERS {p}" )
+				.addEntity( "p", Person.class.getName() )
+				.list();
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		List results = s.createQuery( "from Person" ).list();
+		Iterator itr = results.iterator();
+		while ( itr.hasNext() ) {
+			s.delete( itr.next() );
+		}
+		t.commit();
+		s.close();
+	}
+
+	public void testManyToManyPropertyRef() {
+		// prepare some test data relating to the Group->Person many-to-many association
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Person p = new Person();
+		p.setName( "Steve" );
+		p.setUserId( "steve" );
+		s.persist( p );
+		Group g = new Group();
+		g.setName( "Admins" );
+		g.getUsers().add( p );
+		s.persist( g );
+		// force a flush and detachment here to test reattachment handling of the property-ref (HHH-1531)
+		t.commit();
+		s.close();
+
+		Person p2 = new Person();
+		p2.setName( "Max" );
+		p2.setUserId( "max" );
+		g.getUsers().add( p2 );
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.update( g );
+		t.commit();
+		s.close();
+
+		// test retrieval of the group
+		s = openSession();
+		t = s.beginTransaction();
+		g = ( Group ) s.createQuery( "from Group g left join fetch g.users" ).uniqueResult();
+		assertTrue( Hibernate.isInitialized( g.getUsers() ) );
+		assertEquals( 2, g.getUsers().size() );
+		s.delete( g );
+		s.createQuery( "delete Person" ).executeUpdate();
+		t.commit();
+		s.close();
+	}
+	
+	public void testOneToOnePropertyRef() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Person p = new Person();
+		p.setName("Steve");
+		p.setUserId("steve");
+		Address a = new Address();
+		a.setAddress("Texas");
+		a.setCountry("USA");
+		p.setAddress(a);
+		a.setPerson(p);
+		s.save(p);
+		Person p2 = new Person();
+		p2.setName("Max");
+		p2.setUserId("max");
+		s.save(p2);
+		Account act = new Account();
+		act.setType('c');
+		act.setUser(p2);
+		p2.getAccounts().add(act);
+		s.save(act);
+		s.flush();
+		s.clear();
+		
+		p = (Person) s.get( Person.class, p.getId() ); //get address reference by outer join
+		p2 = (Person) s.get( Person.class, p2.getId() ); //get null address reference by outer join
+		assertNull( p2.getAddress() );
+		assertNotNull( p.getAddress() );
+		List l = s.createQuery("from Person").list(); //pull address references for cache
+		assertEquals( l.size(), 2 );
+		assertTrue( l.contains(p) && l.contains(p2) );
+		s.clear();
+		
+		l = s.createQuery("from Person p order by p.name").list(); //get address references by sequential selects
+		assertEquals( l.size(), 2 );
+		assertNull( ( (Person) l.get(0) ).getAddress() );
+		assertNotNull( ( (Person) l.get(1) ).getAddress() );
+		s.clear();
+		
+		l = s.createQuery("from Person p left join fetch p.address a order by a.country").list(); //get em by outer join
+		assertEquals( l.size(), 2 );
+		if ( ( (Person) l.get(0) ).getName().equals("Max") ) {
+			assertNull( ( (Person) l.get(0) ).getAddress() );
+			assertNotNull( ( (Person) l.get(1) ).getAddress() );
+		}
+		else {
+			assertNull( ( (Person) l.get(1) ).getAddress() );
+			assertNotNull( ( (Person) l.get(0) ).getAddress() );
+		}
+		s.clear();
+		
+		l = s.createQuery("from Person p left join p.accounts a").list();
+		for ( int i=0; i<2; i++ ) {
+			Object[] row = (Object[]) l.get(i);
+			Person px = (Person) row[0];
+			assertFalse( Hibernate.isInitialized( px.getAccounts() ) );
+			assertTrue( px.getAccounts().size()>0 || row[1]==null );
+		}
+		s.clear();
+
+		l = s.createQuery("from Person p left join fetch p.accounts a order by p.name").list();
+		Person p0 = (Person) l.get(0);
+		assertTrue( Hibernate.isInitialized( p0.getAccounts() ) );
+		assertEquals( p0.getAccounts().size(), 1 );
+		assertSame( ( (Account) p0.getAccounts().iterator().next() ).getUser(), p0 );
+		Person p1 = (Person) l.get(1);
+		assertTrue( Hibernate.isInitialized( p1.getAccounts() ) );
+		assertEquals( p1.getAccounts().size(), 0 );
+		s.clear();
+		Account acc = (Account) s.createQuery("from Account a left join fetch a.user").uniqueResult();
+		assertTrue( Hibernate.isInitialized(acc.getUser()) );
+		assertNotNull(acc.getUser());
+		assertTrue( acc.getUser().getAccounts().contains(acc) );
+		
+		s.createQuery("delete from Address").executeUpdate();
+		s.createQuery("delete from Account").executeUpdate(); // to not break constraint violation between Person and Account
+		s.createQuery("delete from Person").executeUpdate();
+		
+		t.commit();
+		s.close();
+	}
+
+	
+	public void testJoinFetchPropertyRef() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Person p = new Person();
+		p.setName("Steve");
+		p.setUserId("steve");
+		Address a = new Address();
+		a.setAddress("Texas");
+		a.setCountry("USA");
+		p.setAddress(a);
+		a.setPerson(p);
+		s.save(p);
+
+		s.flush();
+		s.clear();
+
+		getSessions().getStatistics().clear();
+
+		p = (Person) s.get( Person.class, p.getId() ); //get address reference by outer join
+		
+		assertTrue( Hibernate.isInitialized( p.getAddress() ) );
+		assertNotNull( p.getAddress() );
+        assertEquals( getSessions().getStatistics().getPrepareStatementCount(), 1 );
+        assertEquals( getSessions().getStatistics().getEntityFetchCount(), 0 );
+
+		s.clear();
+
+		getSessions().getStatistics().clear();
+
+		p = (Person) s.createCriteria(Person.class)
+			.setFetchMode("address", FetchMode.SELECT)
+			.uniqueResult(); //get address reference by select
+		
+		assertTrue( Hibernate.isInitialized( p.getAddress() ) );
+		assertNotNull( p.getAddress() );
+        assertEquals( getSessions().getStatistics().getPrepareStatementCount(), 2 );
+        assertEquals( getSessions().getStatistics().getEntityFetchCount(), 0 );
+
+		s.createQuery("delete from Address").executeUpdate();
+		s.createQuery("delete from Person").executeUpdate();
+		
+		t.commit();
+		s.close();
+	}
+
+	public void testForeignKeyCreation() {
+		PersistentClass classMapping = getCfg().getClassMapping("org.hibernate.test.propertyref.basic.Account");
+		
+		Iterator foreignKeyIterator = classMapping.getTable().getForeignKeyIterator();
+		boolean found = false;
+		while ( foreignKeyIterator.hasNext() ) {
+			ForeignKey element = (ForeignKey) foreignKeyIterator.next();
+			if(element.getReferencedEntityName().equals(Person.class.getName() ) ) {
+				
+				if(!element.isReferenceToPrimaryKey() ) {
+					List referencedColumns = element.getReferencedColumns();
+					Column column = (Column) referencedColumns.get(0);
+					if(column.getName().equals("person_userid") ) {
+						found = true; // extend test to include the columns
+					}				
+				}
+			}
+		}
+		
+		assertTrue("Property ref foreign key not found",found);
+	}
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/basic/PropertyRefTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/complete/Account.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/complete/Account.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/complete/Account.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,23 @@
+package org.hibernate.test.propertyref.component.complete;
+
+
+public class Account {
+	private String number;
+	private Person owner;
+
+	public Person getOwner() {
+		return owner;
+	}
+
+	public void setOwner(Person owner) {
+		this.owner = owner;
+	}
+
+	public String getNumber() {
+		return number;
+	}
+
+	public void setNumber(String number) {
+		this.number = number;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/complete/Account.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/complete/CompleteComponentPropertyRefTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/complete/CompleteComponentPropertyRefTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/complete/CompleteComponentPropertyRefTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,71 @@
+package org.hibernate.test.propertyref.component.complete;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class CompleteComponentPropertyRefTest extends FunctionalTestCase {
+
+	public CompleteComponentPropertyRefTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "propertyref/component/complete/Mapping.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( CompleteComponentPropertyRefTest.class );
+	}
+
+	public void testComponentPropertyRef() {
+		Person p = new Person();
+		p.setIdentity( new Identity() );
+		Account a = new Account();
+		a.setNumber("123-12345-1236");
+		a.setOwner(p);
+		p.getIdentity().setName("Gavin");
+		p.getIdentity().setSsn("123-12-1234");
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		s.persist(p);
+		s.persist(a);
+		s.flush();
+		s.clear();
+
+		a = (Account) s.createQuery("from Account a left join fetch a.owner").uniqueResult();
+		assertTrue( Hibernate.isInitialized( a.getOwner() ) );
+		assertNotNull( a.getOwner() );
+		assertEquals( "Gavin", a.getOwner().getIdentity().getName() );
+		s.clear();
+
+		a = (Account) s.get(Account.class, "123-12345-1236");
+		assertFalse( Hibernate.isInitialized( a.getOwner() ) );
+		assertNotNull( a.getOwner() );
+		assertEquals( "Gavin", a.getOwner().getIdentity().getName() );
+		assertTrue( Hibernate.isInitialized( a.getOwner() ) );
+
+		s.clear();
+
+		getSessions().evict(Account.class);
+		getSessions().evict(Person.class);
+
+		a = (Account) s.get(Account.class, "123-12345-1236");
+		assertTrue( Hibernate.isInitialized( a.getOwner() ) );
+		assertNotNull( a.getOwner() );
+		assertEquals( "Gavin", a.getOwner().getIdentity().getName() );
+		assertTrue( Hibernate.isInitialized( a.getOwner() ) );
+
+		s.delete( a );
+		s.delete( a.getOwner() );
+		tx.commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/complete/CompleteComponentPropertyRefTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/complete/Identity.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/complete/Identity.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/complete/Identity.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,21 @@
+package org.hibernate.test.propertyref.component.complete;
+
+import java.io.Serializable;
+
+public class Identity implements Serializable {
+	private String name;
+	private String ssn;
+
+	public String getSsn() {
+		return ssn;
+	}
+	public void setSsn(String id) {
+		this.ssn = id;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/complete/Identity.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/complete/Mapping.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/complete/Mapping.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/complete/Mapping.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+     
+-->
+
+<hibernate-mapping package="org.hibernate.test.propertyref.component.complete">
+	
+	<class name="Person" table="COMP_COMP_PROPREF_PERSON">
+		<id name="id">
+			<generator class="increment"/>
+		</id>
+		<component name="identity" class="Identity">
+			<property name="name"/>
+			<property name="ssn" unique="true"/>
+		</component>
+	</class>
+	
+	<class name="Account" table="COMP_COMP_PROPREF_ACCT">
+		<id name="number" column="accnum"/>
+		<many-to-one name="owner" property-ref="identity">
+            <column name="OWNER_NAME" />
+            <column name="OWNER_SSN" />
+        </many-to-one>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/complete/Mapping.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/complete/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/complete/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/complete/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,20 @@
+package org.hibernate.test.propertyref.component.complete;
+
+
+public class Person {
+	private Long id;
+	private Identity identity;
+	
+	public Long getId() {
+		return id;
+	}
+	public void setId(Long id) {
+		this.id = id;
+	}
+	public Identity getIdentity() {
+		return identity;
+	}
+	public void setIdentity(Identity identity) {
+		this.identity = identity;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/complete/Person.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/partial/Account.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/partial/Account.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/partial/Account.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,23 @@
+//$Id: Account.java 7587 2005-07-21 01:22:38Z oneovthafew $
+package org.hibernate.test.propertyref.component.partial;
+
+public class Account {
+	private String number;
+	private Person owner;
+
+	public Person getOwner() {
+		return owner;
+	}
+
+	public void setOwner(Person owner) {
+		this.owner = owner;
+	}
+
+	public String getNumber() {
+		return number;
+	}
+
+	public void setNumber(String number) {
+		this.number = number;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/partial/Account.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/partial/Identity.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/partial/Identity.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/partial/Identity.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,20 @@
+//$Id: Identity.java 7587 2005-07-21 01:22:38Z oneovthafew $
+package org.hibernate.test.propertyref.component.partial;
+
+public class Identity {
+	private String name;
+	private String ssn;
+	
+	public String getSsn() {
+		return ssn;
+	}
+	public void setSsn(String id) {
+		this.ssn = id;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/partial/Identity.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/partial/Mapping.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/partial/Mapping.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/partial/Mapping.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+     
+-->
+
+<hibernate-mapping package="org.hibernate.test.propertyref.component.partial">
+	
+	<class name="Person" table="PART_COMP_PROPREF_PERS">
+		<id name="id">
+			<generator class="increment"/>
+		</id>
+		<component name="identity">
+			<property name="name"/>
+			<property name="ssn" unique="true"/>
+		</component>
+	</class>
+	
+	<class name="Account" table="PART_COMP_PROPREF_ACCT">
+		<id name="number" column="accnum"/>
+		<many-to-one name="owner" property-ref="identity.ssn"/>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/partial/Mapping.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/partial/PartialComponentPropertyRefTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/partial/PartialComponentPropertyRefTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/partial/PartialComponentPropertyRefTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,73 @@
+//$Id: PartialComponentPropertyRefTest.java 9914 2006-05-09 09:37:18Z max.andersen at jboss.com $
+package org.hibernate.test.propertyref.component.partial;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class PartialComponentPropertyRefTest extends FunctionalTestCase {
+	
+	public PartialComponentPropertyRefTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "propertyref/component/partial/Mapping.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( PartialComponentPropertyRefTest.class );
+	}
+	
+	public void testComponentPropertyRef() {
+		Person p = new Person();
+		p.setIdentity( new Identity() );
+		Account a = new Account();
+		a.setNumber("123-12345-1236");
+		a.setOwner(p);
+		p.getIdentity().setName("Gavin");
+		p.getIdentity().setSsn("123-12-1234");
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		s.persist(p);
+		s.persist(a);
+		s.flush();
+		s.clear();
+		
+		a = (Account) s.createQuery("from Account a left join fetch a.owner").uniqueResult();
+		assertTrue( Hibernate.isInitialized( a.getOwner() ) );
+		assertNotNull( a.getOwner() );
+		assertEquals( "Gavin", a.getOwner().getIdentity().getName() );
+		s.clear();
+		
+		a = (Account) s.get(Account.class, "123-12345-1236");
+		assertFalse( Hibernate.isInitialized( a.getOwner() ) );
+		assertNotNull( a.getOwner() );
+		assertEquals( "Gavin", a.getOwner().getIdentity().getName() );
+		assertTrue( Hibernate.isInitialized( a.getOwner() ) );
+		
+		s.clear();
+		
+		getSessions().evict(Account.class);
+		getSessions().evict(Person.class);
+		
+		a = (Account) s.get(Account.class, "123-12345-1236");
+		assertTrue( Hibernate.isInitialized( a.getOwner() ) );
+		assertNotNull( a.getOwner() );
+		assertEquals( "Gavin", a.getOwner().getIdentity().getName() );
+		assertTrue( Hibernate.isInitialized( a.getOwner() ) );
+		
+		s.delete( a );
+		s.delete( a.getOwner() );
+		tx.commit();
+		s.close();
+	}
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/partial/PartialComponentPropertyRefTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/partial/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/partial/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/partial/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,20 @@
+//$Id: Person.java 7587 2005-07-21 01:22:38Z oneovthafew $
+package org.hibernate.test.propertyref.component.partial;
+
+public class Person {
+	private Long id;
+	private Identity identity;
+	
+	public Long getId() {
+		return id;
+	}
+	public void setId(Long id) {
+		this.id = id;
+	}
+	public Identity getIdentity() {
+		return identity;
+	}
+	public void setIdentity(Identity identity) {
+		this.identity = identity;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/component/partial/Person.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/discrim/Account.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/discrim/Account.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/discrim/Account.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,57 @@
+//$Id: Account.java 6029 2005-03-06 16:34:16Z oneovthafew $
+package org.hibernate.test.propertyref.inheritence.discrim;
+
+/**
+ * @author Gavin King
+ */
+public class Account {
+	private String accountId;
+	private Customer customer;
+	private Person person;
+	private char type;
+	/**
+	 * @return Returns the user.
+	 */
+	public Customer getCustomer() {
+		return customer;
+	}
+	/**
+	 * @param user The user to set.
+	 */
+	public void setCustomer(Customer user) {
+		this.customer = user;
+	}
+	/**
+	 * @return Returns the accountId.
+	 */
+	public String getAccountId() {
+		return accountId;
+	}
+	/**
+	 * @param accountId The accountId to set.
+	 */
+	public void setAccountId(String accountId) {
+		this.accountId = accountId;
+	}
+	/**
+	 * @return Returns the type.
+	 */
+	public char getType() {
+		return type;
+	}
+	/**
+	 * @param type The type to set.
+	 */
+	public void setType(char type) {
+		this.type = type;
+	}
+	public Person getPerson() {
+		return person;
+	}
+	
+	public void setPerson(Person person) {
+		this.person = person;
+	}
+	
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/discrim/Account.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/discrim/Customer.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/discrim/Customer.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/discrim/Customer.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,18 @@
+//$Id: Customer.java 6029 2005-03-06 16:34:16Z oneovthafew $
+package org.hibernate.test.propertyref.inheritence.discrim;
+
+/**
+ * @author Gavin King
+ */
+public class Customer extends Person {
+	private String customerId;
+
+	public String getCustomerId() {
+		return customerId;
+	}
+	
+	public void setCustomerId(String customerId) {
+		this.customerId = customerId;
+	}
+	
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/discrim/Customer.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/discrim/Person.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/discrim/Person.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/discrim/Person.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.propertyref.inheritence.discrim">
+
+	<class name="Person" discriminator-value="null" table="D_SBCLS_PROPREF_PERS">
+		<id name="id">
+			<generator class="hilo"/>
+		</id>
+		<discriminator formula="customerId"/>
+		<property name="name" length="100"/>
+		<property name="personId" length="8" unique="true"/>
+				
+		<subclass name="Customer" discriminator-value="not null">
+			<property name="customerId" length="8" unique="true"/>
+		</subclass>
+	</class>
+	
+	<class name="Account" table="D_SBCLS_PROPREF_ACCT">
+		<id name="accountId" length="32">
+			<generator class="uuid.hex"/>
+		</id>
+		<many-to-one name="person" column="personId" unique="true" property-ref="personId"/>
+		<many-to-one name="customer" column="customerPersonId" unique="true" property-ref="personId"/>
+		<property name="type" column="`type`" not-null="true"/>
+	</class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/discrim/Person.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/discrim/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/discrim/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/discrim/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,44 @@
+//$Id: Person.java 6029 2005-03-06 16:34:16Z oneovthafew $
+package org.hibernate.test.propertyref.inheritence.discrim;
+
+
+/**
+ * @author gavin
+ */
+public class Person {
+	private Long id;
+	private String name;
+	private String personId;
+	/**
+	 * @return Returns the id.
+	 */
+	public Long getId() {
+		return id;
+	}
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(Long id) {
+		this.id = id;
+	}
+	/**
+	 * @return Returns the name.
+	 */
+	public String getName() {
+		return name;
+	}
+	/**
+	 * @param name The name to set.
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+	public String getPersonId() {
+		return personId;
+	}
+	
+	public void setPersonId(String personId) {
+		this.personId = personId;
+	}
+	
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/discrim/Person.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/discrim/SubclassPropertyRefTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/discrim/SubclassPropertyRefTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/discrim/SubclassPropertyRefTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,64 @@
+//$Id: SubclassPropertyRefTest.java 6029 2005-03-06 16:34:16Z oneovthafew $
+package org.hibernate.test.propertyref.inheritence.discrim;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class SubclassPropertyRefTest extends FunctionalTestCase {
+
+	public SubclassPropertyRefTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "propertyref/inheritence/discrim/Person.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( SubclassPropertyRefTest.class );
+	}
+
+	public void testOneToOnePropertyRef() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Customer c = new Customer();
+		c.setName( "Emmanuel" );
+		c.setCustomerId( "C123-456" );
+		c.setPersonId( "P123-456" );
+		Account a = new Account();
+		a.setCustomer( c );
+		a.setPerson( c );
+		a.setType( 'X' );
+		s.persist( c );
+		s.persist( a );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		a = ( Account ) s.createQuery( "from Account acc join fetch acc.customer join fetch acc.person" )
+				.uniqueResult();
+		assertNotNull( a.getCustomer() );
+		assertTrue( Hibernate.isInitialized( a.getCustomer() ) );
+		assertNotNull( a.getPerson() );
+		assertTrue( Hibernate.isInitialized( a.getPerson() ) );
+		c = ( Customer ) s.createQuery( "from Customer" ).uniqueResult();
+		assertSame( c, a.getCustomer() );
+		assertSame( c, a.getPerson() );
+		s.delete( a );
+		s.delete( a.getCustomer() );
+		s.delete( a.getPerson() );
+		t.commit();
+		s.close();
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/discrim/SubclassPropertyRefTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/joined/Account.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/joined/Account.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/joined/Account.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,38 @@
+//$Id: Account.java 7274 2005-06-22 17:07:29Z oneovthafew $
+package org.hibernate.test.propertyref.inheritence.joined;
+
+import java.io.Serializable;
+
+/**
+ * @author Gavin King
+ */
+public class Account implements Serializable {
+	private String accountId;
+	private char type;
+
+	/**
+	 * @return Returns the accountId.
+	 */
+	public String getAccountId() {
+		return accountId;
+	}
+	/**
+	 * @param accountId The accountId to set.
+	 */
+	public void setAccountId(String accountId) {
+		this.accountId = accountId;
+	}
+	/**
+	 * @return Returns the type.
+	 */
+	public char getType() {
+		return type;
+	}
+	/**
+	 * @param type The type to set.
+	 */
+	public void setType(char type) {
+		this.type = type;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/joined/Account.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/joined/BankAccount.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/joined/BankAccount.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/joined/BankAccount.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,23 @@
+//$Id: BankAccount.java 7274 2005-06-22 17:07:29Z oneovthafew $
+package org.hibernate.test.propertyref.inheritence.joined;
+
+public class BankAccount extends Account {
+	private String accountNumber;
+	private String bsb;
+
+	public String getAccountNumber() {
+		return accountNumber;
+	}
+
+	public void setAccountNumber(String accountNumber) {
+		this.accountNumber = accountNumber;
+	}
+
+	public String getBsb() {
+		return bsb;
+	}
+
+	public void setBsb(String bsb) {
+		this.bsb = bsb;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/joined/BankAccount.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/joined/JoinedSubclassPropertyRefTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/joined/JoinedSubclassPropertyRefTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/joined/JoinedSubclassPropertyRefTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,70 @@
+//$Id: PropertyRefTest.java 7275 2005-06-22 18:58:16Z oneovthafew $
+package org.hibernate.test.propertyref.inheritence.joined;
+
+import junit.framework.Test;
+
+import org.hibernate.FetchMode;
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class JoinedSubclassPropertyRefTest extends FunctionalTestCase {
+	
+	public JoinedSubclassPropertyRefTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "propertyref/inheritence/joined/Person.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( JoinedSubclassPropertyRefTest.class );
+	}
+	
+	public void testPropertyRefToJoinedSubclass() {
+		Session session = openSession();
+		Transaction tx = session.beginTransaction();
+		Person p = new Person();
+		p.setName("Gavin King");
+		BankAccount acc = new BankAccount();
+		acc.setBsb("0634");
+		acc.setType('B');
+		acc.setAccountNumber("xxx-123-abc");
+		p.setBankAccount(acc);
+		session.persist(p);
+		tx.commit();
+		session.close();
+
+		session = openSession();
+		tx = session.beginTransaction();
+		p = (Person) session.get(Person.class, p.getId());
+		assertNotNull( p.getBankAccount() );
+		assertTrue( Hibernate.isInitialized( p.getBankAccount() ) );
+		tx.commit();
+		session.close();
+
+		session = openSession();
+		tx = session.beginTransaction();
+		p = (Person) session.createCriteria(Person.class)
+			.setFetchMode("bankAccount", FetchMode.JOIN)
+			.uniqueResult();
+		assertNotNull( p.getBankAccount() );
+		assertTrue( Hibernate.isInitialized( p.getBankAccount() ) );
+		tx.commit();
+		session.close();
+
+		session = openSession();
+		tx = session.beginTransaction();
+		session.delete(p);
+		tx.commit();
+		session.close();
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/joined/JoinedSubclassPropertyRefTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/joined/Person.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/joined/Person.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/joined/Person.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,49 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+  Demonstrates the use of property-ref to map legacy data where
+  foreign keys reference something other than the primary key of
+  the associated entity. Here we show:
+  
+  (1) A one-to-one foreign key association (prefer primary key 
+      associations)
+      
+  (2) A bidirectional one-to-many association on a key that is
+      not the primary key (prefer associations from foreign keys
+      to primary keys)
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.propertyref.inheritence.joined">
+
+	<class name="Person" table="J_SBCLS_PROPREF_PERS">
+		<id name="id">
+			<generator class="hilo"/>
+		</id>
+		<property name="name" length="100"/>
+		<many-to-one name="bankAccount" property-ref="bsbAccountNumber" cascade="all">
+			<column name="bsb"/>
+			<column name="accountNumber"/>
+		</many-to-one>
+	</class>
+	
+	<class name="Account" table="J_SBCLS_PROPREF_ACCT">
+		<id name="accountId" length="32">
+			<generator class="uuid"/>
+		</id>
+		<property name="type" column="`type`" not-null="true"/>
+		<joined-subclass name="BankAccount" table="J_SBCLS_PROPREF_BACCT">
+			<key column="accountId"/>
+			<properties unique="true" name="bsbAccountNumber">
+				<property name="bsb" length="4" not-null="true"/>
+				<property name="accountNumber" length="16" not-null="true"/>
+			</properties>
+		</joined-subclass>
+		
+	</class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/joined/Person.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/joined/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/joined/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/joined/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,44 @@
+//$Id: Person.java 7274 2005-06-22 17:07:29Z oneovthafew $
+package org.hibernate.test.propertyref.inheritence.joined;
+
+
+/**
+ * @author gavin
+ */
+public class Person {
+	private Long id;
+	private String name;
+	private BankAccount bankAccount;
+
+	/**
+	 * @return Returns the id.
+	 */
+	public Long getId() {
+		return id;
+	}
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(Long id) {
+		this.id = id;
+	}
+	/**
+	 * @return Returns the name.
+	 */
+	public String getName() {
+		return name;
+	}
+	/**
+	 * @param name The name to set.
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public BankAccount getBankAccount() {
+		return bankAccount;
+	}
+	public void setBankAccount(BankAccount bankAccount) {
+		this.bankAccount = bankAccount;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/joined/Person.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/union/Account.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/union/Account.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/union/Account.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,56 @@
+package org.hibernate.test.propertyref.inheritence.union;
+
+/**
+ * @author Gavin King
+ */
+public class Account {
+	private String accountId;
+	private Customer customer;
+	private Person person;
+	private char type;
+	/**
+	 * @return Returns the user.
+	 */
+	public Customer getCustomer() {
+		return customer;
+	}
+	/**
+	 * @param user The user to set.
+	 */
+	public void setCustomer(Customer user) {
+		this.customer = user;
+	}
+	/**
+	 * @return Returns the accountId.
+	 */
+	public String getAccountId() {
+		return accountId;
+	}
+	/**
+	 * @param accountId The accountId to set.
+	 */
+	public void setAccountId(String accountId) {
+		this.accountId = accountId;
+	}
+	/**
+	 * @return Returns the type.
+	 */
+	public char getType() {
+		return type;
+	}
+	/**
+	 * @param type The type to set.
+	 */
+	public void setType(char type) {
+		this.type = type;
+	}
+	public Person getPerson() {
+		return person;
+	}
+
+	public void setPerson(Person person) {
+		this.person = person;
+	}
+
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/union/Account.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/union/Customer.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/union/Customer.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/union/Customer.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,17 @@
+package org.hibernate.test.propertyref.inheritence.union;
+
+/**
+ * @author Gavin King
+ */
+public class Customer extends Person {
+	private String customerId;
+
+	public String getCustomerId() {
+		return customerId;
+	}
+
+	public void setCustomerId(String customerId) {
+		this.customerId = customerId;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/union/Customer.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/union/Person.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/union/Person.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/union/Person.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,29 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.propertyref.inheritence.union">
+
+	<class name="Person" table="U_SBCLS_PROPREF_PERS">
+		<id name="id">
+			<generator class="hilo"/>
+		</id>
+		<property name="name" length="100"/>
+		<property name="personId" length="8" unique="true"/>
+				
+		<union-subclass name="Customer" table="U_SBCLS_PROPREF_CUST">
+            <property name="customerId" length="8" unique="true"/>
+		</union-subclass>
+	</class>
+	
+	<class name="Account" table="U_SBCLS_PROPREF_ACCT">
+		<id name="accountId" length="32">
+			<generator class="uuid.hex"/>
+		</id>
+		<many-to-one name="person" column="personId" unique="true" property-ref="personId"/>
+		<many-to-one name="customer" column="customerPersonId" unique="true" property-ref="personId"/>
+		<property name="type" column="`type`" not-null="true"/>
+	</class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/union/Person.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/union/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/union/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/union/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,42 @@
+package org.hibernate.test.propertyref.inheritence.union;
+
+/**
+ * @author gavin
+ */
+public class Person {
+	private Long id;
+	private String name;
+	private String personId;
+	/**
+	 * @return Returns the id.
+	 */
+	public Long getId() {
+		return id;
+	}
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(Long id) {
+		this.id = id;
+	}
+	/**
+	 * @return Returns the name.
+	 */
+	public String getName() {
+		return name;
+	}
+	/**
+	 * @param name The name to set.
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+	public String getPersonId() {
+		return personId;
+	}
+
+	public void setPersonId(String personId) {
+		this.personId = personId;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/union/Person.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/union/UnionSubclassPropertyRefTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/union/UnionSubclassPropertyRefTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/union/UnionSubclassPropertyRefTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,62 @@
+package org.hibernate.test.propertyref.inheritence.union;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class UnionSubclassPropertyRefTest extends FunctionalTestCase {
+
+	public UnionSubclassPropertyRefTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "propertyref/inheritence/union/Person.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( UnionSubclassPropertyRefTest.class );
+	}
+
+	public void testOneToOnePropertyRef() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Customer c = new Customer();
+		c.setName( "Emmanuel" );
+		c.setCustomerId( "C123-456" );
+		c.setPersonId( "P123-456" );
+		Account a = new Account();
+		a.setCustomer( c );
+		a.setPerson( c );
+		a.setType( 'X' );
+		s.persist( c );
+		s.persist( a );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		a = ( Account ) s.createQuery( "from Account acc join fetch acc.customer join fetch acc.person" )
+				.uniqueResult();
+		assertNotNull( a.getCustomer() );
+		assertTrue( Hibernate.isInitialized( a.getCustomer() ) );
+		assertNotNull( a.getPerson() );
+		assertTrue( Hibernate.isInitialized( a.getPerson() ) );
+		c = ( Customer ) s.createQuery( "from Customer" ).uniqueResult();
+		assertSame( c, a.getCustomer() );
+		assertSame( c, a.getPerson() );
+		s.delete( a );
+		s.delete( a.getCustomer() );
+		s.delete( a.getPerson() );
+		t.commit();
+		s.close();
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/propertyref/inheritence/union/UnionSubclassPropertyRefTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/proxy/Container.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/proxy/Container.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/proxy/Container.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,63 @@
+package org.hibernate.test.proxy;
+
+import java.util.Set;
+import java.util.HashSet;
+import java.io.Serializable;
+
+/**
+ * @author Steve Ebersole
+ */
+public class Container implements Serializable {
+	private Long id;
+	private String name;
+	private Owner owner;
+	private Info info;
+	private Set dataPoints = new HashSet();
+
+	public Container() {
+	}
+
+	public Container(String name) {
+		this.name = name;
+	}
+
+	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 Owner getOwner() {
+		return owner;
+	}
+
+	public void setOwner(Owner owner) {
+		this.owner = owner;
+	}
+
+	public Info getInfo() {
+		return info;
+	}
+
+	public void setInfo(Info info) {
+		this.info = info;
+	}
+
+	public Set getDataPoints() {
+		return dataPoints;
+	}
+
+	public void setDataPoints(Set dataPoints) {
+		this.dataPoints = dataPoints;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/proxy/Container.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/proxy/DataPoint.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/proxy/DataPoint.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/proxy/DataPoint.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,49 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping 
+	package="org.hibernate.test.proxy">
+
+	<class name="DataPoint">
+		<id name="id">
+			<generator class="increment"/>
+		</id>
+		<property name="x">
+			<column name="xval" not-null="true" length="4" unique-key="xy"/>
+		</property>
+		<property name="y">
+			<column name="yval" not-null="true" length="4" unique-key="xy"/>
+		</property>
+		<property name="description"/>
+	</class>
+
+    <class name="Owner">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <property name="name" unique="true"/>
+    </class>
+
+    <class name="Info">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <property name="details"/>
+    </class>
+
+    <class name="Container">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <property name="name"/>
+        <many-to-one name="owner" class="Owner" column="owner_name" property-ref="name" cascade="all"/>
+        <many-to-one name="info" class="Info" column="info_id" cascade="all"/>
+        <set name="dataPoints" lazy="true" inverse="false" cascade="all">
+            <key column="c_id"/>
+            <one-to-many class="DataPoint"/>
+        </set>
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/proxy/DataPoint.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/proxy/DataPoint.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/proxy/DataPoint.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/proxy/DataPoint.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,77 @@
+//$Id: DataPoint.java 10223 2006-08-04 20:29:21Z steve.ebersole at jboss.com $
+package org.hibernate.test.proxy;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @author Gavin King
+ */
+public class DataPoint implements Serializable {
+	private long id;
+	private BigDecimal x;
+	private BigDecimal y;
+	private String description;
+
+	public DataPoint() {
+	}
+
+	public DataPoint(BigDecimal x, BigDecimal y, String description) {
+		this.x = x;
+		this.y = y;
+		this.description = description;
+	}
+
+	/**
+	 * @return Returns the description.
+	 */
+	public String getDescription() {
+		return description;
+	}
+	/**
+	 * @param description The description to set.
+	 */
+	public void setDescription(String description) {
+		this.description = description;
+	}
+	/**
+	 * @return Returns the id.
+	 */
+	public long getId() {
+		return id;
+	}
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(long id) {
+		this.id = id;
+	}
+	/**
+	 * @return Returns the x.
+	 */
+	public BigDecimal getX() {
+		return x;
+	}
+	/**
+	 * @param x The x to set.
+	 */
+	public void setX(BigDecimal x) {
+		this.x = x;
+	}
+	/**
+	 * @return Returns the y.
+	 */
+	public BigDecimal getY() {
+		return y;
+	}
+	/**
+	 * @param y The y to set.
+	 */
+	public void setY(BigDecimal y) {
+		this.y = y;
+	}
+	
+	void exception() throws Exception {
+		throw new Exception("foo");
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/proxy/DataPoint.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/proxy/Info.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/proxy/Info.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/proxy/Info.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,34 @@
+package org.hibernate.test.proxy;
+
+/**
+ * todo: describe Info
+ *
+ * @author Steve Ebersole
+ */
+public class Info {
+	private Long id;
+	private String details;
+
+	public Info() {
+	}
+
+	public Info(String details) {
+		this.details = details;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getDetails() {
+		return details;
+	}
+
+	public void setDetails(String details) {
+		this.details = details;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/proxy/Info.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/proxy/Owner.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/proxy/Owner.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/proxy/Owner.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,34 @@
+package org.hibernate.test.proxy;
+
+import java.io.Serializable;
+
+/**
+ * @author Steve Ebersole
+ */
+public class Owner implements Serializable {
+	private Long id;
+	private String name;
+
+	public Owner() {
+	}
+
+	public Owner(String name) {
+		this.name = name;
+	}
+
+	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;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/proxy/Owner.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/proxy/ProxyTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/proxy/ProxyTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/proxy/ProxyTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,403 @@
+//$Id: ProxyTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.proxy;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.FlushMode;
+import org.hibernate.Hibernate;
+import org.hibernate.LazyInitializationException;
+import org.hibernate.LockMode;
+import org.hibernate.ObjectNotFoundException;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.impl.SessionImpl;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.proxy.HibernateProxy;
+import org.hibernate.util.SerializationHelper;
+
+/**
+ * @author Gavin King
+ */
+public class ProxyTest extends FunctionalTestCase {
+	
+	public ProxyTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "proxy/DataPoint.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		super.configure( cfg );
+		cfg.setProperty( Environment.STATEMENT_BATCH_SIZE, "0" ); // problem on HSQLDB (go figure)
+	}
+
+	public String getCacheConcurrencyStrategy() {
+		return null;
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( ProxyTest.class );
+	}
+
+	public void testFinalizeFiltered() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		DataPoint dp = new DataPoint();
+		dp.setDescription("a data point");
+		dp.setX( new BigDecimal(1.0) );
+		dp.setY( new BigDecimal(2.0) );
+		s.persist(dp);
+		s.flush();
+		s.clear();
+		
+		dp = (DataPoint) s.load(DataPoint.class, new Long( dp.getId() ) );
+		assertFalse( Hibernate.isInitialized(dp) );
+		
+		try {
+			dp.getClass().getDeclaredMethod("finalize",null);
+			fail();
+			
+		} 
+		catch (NoSuchMethodException e) {}
+		
+		s.delete(dp);
+		t.commit();
+		s.close();
+		
+	}
+	
+	public void testProxyException() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		DataPoint dp = new DataPoint();
+		dp.setDescription("a data point");
+		dp.setX( new BigDecimal(1.0) );
+		dp.setY( new BigDecimal(2.0) );
+		s.persist(dp);
+		s.flush();
+		s.clear();
+		
+		dp = (DataPoint) s.load(DataPoint.class, new Long( dp.getId() ) );
+		assertFalse( Hibernate.isInitialized(dp) );
+		
+		try {
+			dp.exception();
+			fail();
+		}
+		catch (Exception e) {
+			assertTrue( e.getClass()==Exception.class );
+		}
+		s.delete(dp);
+		t.commit();
+		s.close();
+	}
+
+	public void testProxySerializationAfterSessionClosed() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		DataPoint dp = new DataPoint();
+		dp.setDescription("a data point");
+		dp.setX( new BigDecimal(1.0) );
+		dp.setY( new BigDecimal(2.0) );
+		s.persist(dp);
+		s.flush();
+		s.clear();
+
+		dp = (DataPoint) s.load( DataPoint.class, new Long( dp.getId() ) );
+		assertFalse( Hibernate.isInitialized(dp) );
+		s.close();
+		SerializationHelper.clone( dp );
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete( dp );
+		t.commit();
+		s.close();
+	}
+
+	public void testInitializedProxySerializationAfterSessionClosed() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		DataPoint dp = new DataPoint();
+		dp.setDescription("a data point");
+		dp.setX( new BigDecimal(1.0) );
+		dp.setY( new BigDecimal(2.0) );
+		s.persist(dp);
+		s.flush();
+		s.clear();
+
+		dp = (DataPoint) s.load( DataPoint.class, new Long( dp.getId() ) );
+		assertFalse( Hibernate.isInitialized(dp) );
+		Hibernate.initialize( dp );
+		assertTrue( Hibernate.isInitialized(dp) );
+		s.close();
+		SerializationHelper.clone( dp );
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete( dp );
+		t.commit();
+		s.close();
+	}
+
+	public void testProxySerialization() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		DataPoint dp = new DataPoint();
+		dp.setDescription("a data point");
+		dp.setX( new BigDecimal(1.0) );
+		dp.setY( new BigDecimal(2.0) );
+		s.persist(dp);
+		s.flush();
+		s.clear();
+
+		dp = (DataPoint) s.load( DataPoint.class, new Long( dp.getId() ) );
+		assertFalse( Hibernate.isInitialized(dp) );
+		dp.getId();
+		assertFalse( Hibernate.isInitialized(dp) );
+		dp.getDescription();
+		assertTrue( Hibernate.isInitialized(dp) );
+		Object none = s.load( DataPoint.class, new Long(666));
+		assertFalse( Hibernate.isInitialized(none) );
+		
+		t.commit();
+		s.disconnect();
+		
+		Object[] holder = new Object[] { s, dp, none };
+		
+		holder = (Object[]) SerializationHelper.clone(holder);
+		Session sclone = (Session) holder[0];
+		dp = (DataPoint) holder[1];
+		none = holder[2];
+		
+		//close the original:
+		s.close();
+		
+		sclone.reconnect();
+		t = sclone.beginTransaction();
+		
+		DataPoint sdp = (DataPoint) sclone.load( DataPoint.class, new Long( dp.getId() ) );
+		assertSame(dp, sdp);
+		assertFalse(sdp instanceof HibernateProxy);
+		Object snone = sclone.load( DataPoint.class, new Long(666) );
+		assertSame(none, snone);
+		assertTrue(snone instanceof HibernateProxy);
+		
+		sclone.delete(dp);
+		
+		t.commit();
+		sclone.close();
+		
+	}
+
+	public void testProxy() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		DataPoint dp = new DataPoint();
+		dp.setDescription("a data point");
+		dp.setX( new BigDecimal(1.0) );
+		dp.setY( new BigDecimal(2.0) );
+		s.persist(dp);
+		s.flush();
+		s.clear();
+
+		dp = (DataPoint) s.load( DataPoint.class, new Long(dp.getId() ));
+		assertFalse( Hibernate.isInitialized(dp) );
+		DataPoint dp2 = (DataPoint) s.get( DataPoint.class, new Long(dp.getId()) );
+		assertSame(dp, dp2);
+		assertTrue( Hibernate.isInitialized(dp) );
+		s.clear();
+
+		dp = (DataPoint) s.load( DataPoint.class, new Long( dp.getId() ) );
+		assertFalse( Hibernate.isInitialized(dp) );
+		dp2 = (DataPoint) s.load( DataPoint.class, new Long( dp.getId() ), LockMode.NONE );
+		assertSame(dp, dp2);
+		assertFalse( Hibernate.isInitialized(dp) );
+		s.clear();
+
+		dp = (DataPoint) s.load( DataPoint.class, new Long( dp.getId() ) );
+		assertFalse( Hibernate.isInitialized(dp) );
+		dp2 = (DataPoint) s.load( DataPoint.class, new Long( dp.getId() ), LockMode.READ );
+		assertSame(dp, dp2);
+		assertTrue( Hibernate.isInitialized(dp) );
+		s.clear();
+
+		dp = (DataPoint) s.load( DataPoint.class, new Long (dp.getId() ));
+		assertFalse( Hibernate.isInitialized(dp) );
+		dp2 = (DataPoint) s.get( DataPoint.class, new Long ( dp.getId() ) , LockMode.READ );
+		assertSame(dp, dp2);
+		assertTrue( Hibernate.isInitialized(dp) );
+		s.clear();
+
+		dp = (DataPoint) s.load( DataPoint.class, new Long  ( dp.getId() ) );
+		assertFalse( Hibernate.isInitialized(dp) );
+		dp2 = (DataPoint) s.createQuery("from DataPoint").uniqueResult();
+		assertSame(dp, dp2);
+		assertTrue( Hibernate.isInitialized(dp) );
+		s.delete( dp );
+		t.commit();
+		s.close();
+	}
+
+	public void testSubsequentNonExistentProxyAccess() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		DataPoint proxy = ( DataPoint ) s.load( DataPoint.class, new Long(-1) );
+		assertFalse( Hibernate.isInitialized( proxy ) );
+		try {
+			proxy.getDescription();
+			fail( "proxy access did not fail on non-existent proxy" );
+		}
+		catch( ObjectNotFoundException onfe ) {
+			// expected
+		}
+		catch( Throwable e ) {
+			fail( "unexpected exception type on non-existent proxy access : " + e );
+		}
+		// try it a second (subsequent) time...
+		try {
+			proxy.getDescription();
+			fail( "proxy access did not fail on non-existent proxy" );
+		}
+		catch( ObjectNotFoundException onfe ) {
+			// expected
+		}
+		catch( Throwable e ) {
+			fail( "unexpected exception type on non-existent proxy access : " + e );
+		}
+
+		t.commit();
+		s.close();
+	}
+
+	public void testProxyEviction() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Container container = new Container( "container" );
+		container.setOwner( new Owner( "owner" ) );
+		container.setInfo( new Info( "blah blah blah" ) );
+		container.getDataPoints().add( new DataPoint( new BigDecimal( 1 ), new BigDecimal( 1 ), "first data point" ) );
+		container.getDataPoints().add( new DataPoint( new BigDecimal( 2 ), new BigDecimal( 2 ), "second data point" ) );
+		s.save( container );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Container c = ( Container ) s.load( Container.class, container.getId() );
+		assertFalse( Hibernate.isInitialized( c ) );
+		s.evict( c );
+		try {
+			c.getName();
+			fail( "expecting LazyInitializationException" );
+		}
+		catch( LazyInitializationException e ) {
+			// expected result
+		}
+
+		c = ( Container ) s.load( Container.class, container.getId() );
+		assertFalse( Hibernate.isInitialized( c ) );
+		Info i = c.getInfo();
+		assertTrue( Hibernate.isInitialized( c ) );
+		assertFalse( Hibernate.isInitialized( i ) );
+		s.evict( c );
+		try {
+			i.getDetails();
+			fail( "expecting LazyInitializationException" );
+		}
+		catch( LazyInitializationException e ) {
+			// expected result
+		}
+
+		s.delete( c );
+
+		t.commit();
+		s.close();
+	}
+
+	public void testFullyLoadedPCSerialization() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Long lastContainerId = null;
+		int containerCount = 10;
+		int nestedDataPointCount = 5;
+		for ( int c_indx = 0; c_indx < containerCount; c_indx++ ) {
+			Owner owner = new Owner( "Owner #" + c_indx );
+			Container container = new Container( "Container #" + c_indx );
+			container.setOwner( owner );
+			for ( int dp_indx = 0; dp_indx < nestedDataPointCount; dp_indx++ ) {
+				DataPoint dp = new DataPoint();
+				dp.setDescription( "data-point [" + c_indx + ", " + dp_indx + "]" );
+// more HSQLDB fun...
+//				dp.setX( new BigDecimal( c_indx ) );
+				dp.setX( new BigDecimal( c_indx + dp_indx ) );
+				dp.setY( new BigDecimal( dp_indx ) );
+				container.getDataPoints().add( dp );
+			}
+			s.save( container );
+			lastContainerId = container.getId();
+		}
+		t.commit();
+		s.close();
+
+		s = openSession();
+		s.setFlushMode( FlushMode.MANUAL );
+		t = s.beginTransaction();
+		// load the last container as a proxy
+		Container proxy = ( Container ) s.load( Container.class, lastContainerId );
+		assertFalse( Hibernate.isInitialized( proxy ) );
+		// load the rest back into the PC
+		List all = s.createQuery( "from Container as c inner join fetch c.owner inner join fetch c.dataPoints where c.id <> :last" )
+				.setLong( "last", lastContainerId.longValue() )
+				.list();
+		Container container = ( Container ) all.get( 0 );
+		s.delete( container );
+		// force a snapshot retrieval of the proxied container
+		SessionImpl sImpl = ( SessionImpl ) s;
+		sImpl.getPersistenceContext().getDatabaseSnapshot(
+				lastContainerId,
+		        sImpl.getFactory().getEntityPersister( Container.class.getName() )
+		);
+		assertFalse( Hibernate.isInitialized( proxy ) );
+		t.commit();
+
+//		int iterations = 50;
+//		long cumulativeTime = 0;
+//		long cumulativeSize = 0;
+//		for ( int i = 0; i < iterations; i++ ) {
+//			final long start = System.currentTimeMillis();
+//			byte[] bytes = SerializationHelper.serialize( s );
+//			SerializationHelper.deserialize( bytes );
+//			final long end = System.currentTimeMillis();
+//			cumulativeTime += ( end - start );
+//			int size = bytes.length;
+//			cumulativeSize += size;
+////			System.out.println( "Iteration #" + i + " took " + ( end - start ) + " ms : size = " + size + " bytes" );
+//		}
+//		System.out.println( "Average time : " + ( cumulativeTime / iterations ) + " ms" );
+//		System.out.println( "Average size : " + ( cumulativeSize / iterations ) + " bytes" );
+
+		byte[] bytes = SerializationHelper.serialize( s );
+		SerializationHelper.deserialize( bytes );
+
+		t = s.beginTransaction();
+		int count = s.createQuery( "delete DataPoint" ).executeUpdate();
+		assertEquals( "unexpected DP delete count", ( containerCount * nestedDataPointCount ), count );
+		count = s.createQuery( "delete Container" ).executeUpdate();
+		assertEquals( "unexpected container delete count", containerCount, count );
+		count = s.createQuery( "delete Owner" ).executeUpdate();
+		assertEquals( "unexpected owner delete count", containerCount, count );
+		t.commit();
+		s.close();
+	}
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/proxy/ProxyTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/querycache/Item.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/querycache/Item.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/querycache/Item.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping 
+	package="org.hibernate.test.querycache">
+
+	<class name="Item" table="Items" batch-size="9">
+		<id name="id">
+			<generator class="native"/>
+		</id>
+		<property name="name" not-null="true"/>
+		<property name="description" not-null="true"/>
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/querycache/Item.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/querycache/Item.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/querycache/Item.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/querycache/Item.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,34 @@
+//$Id: Item.java 9587 2006-03-09 21:38:26Z steve.ebersole at jboss.com $
+package org.hibernate.test.querycache;
+
+import java.util.Set;
+import java.util.HashSet;
+
+
+/**
+ * @author Gavin King
+ */
+public class Item {
+	private long id;
+	private String name;
+	private String description;
+
+	public String getDescription() {
+		return description;
+	}
+	public void setDescription(String description) {
+		this.description = description;
+	}
+	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;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/querycache/Item.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/querycache/QueryCacheTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/querycache/QueryCacheTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/querycache/QueryCacheTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,320 @@
+//$Id: QueryCacheTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.querycache;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.stat.EntityStatistics;
+import org.hibernate.stat.QueryStatistics;
+import org.hibernate.transform.Transformers;
+
+/**
+ * @author Gavin King
+ */
+public class QueryCacheTest extends FunctionalTestCase {
+	
+	public QueryCacheTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "querycache/Item.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		super.configure( cfg );
+		cfg.setProperty( Environment.USE_QUERY_CACHE, "true" );
+		cfg.setProperty( Environment.CACHE_REGION_PREFIX, "foo" );
+		cfg.setProperty( Environment.USE_SECOND_LEVEL_CACHE, "true" );
+		cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( QueryCacheTest.class );
+	}
+	//https://jira.jboss.org/jira/browse/JBPAPP-4224
+	public void testHitCacheInSameSession() {
+		getSessions().evictQueries();
+		getSessions().getStatistics().clear();
+		Session s = openSession();
+		List list = new ArrayList();
+		s.beginTransaction();
+		for ( int i = 0; i < 3; i++ ) {
+			Item a = new Item();
+			a.setName( "a" + i );
+			a.setDescription( "a" + i );
+			list.add( a );
+			s.persist( a );
+		}
+		s.getTransaction().commit();
+		
+//		s.close();
+//		s=openSession();
+		
+		s.beginTransaction();
+		String queryString = "from Item";
+		// this query will hit the database and create the cache
+		s.createQuery( queryString ).setCacheable( true ).list();
+		s.getTransaction().commit();
+		
+		s.beginTransaction();
+		//and this one SHOULD served by the cache
+		s.createQuery( queryString ).setCacheable( true ).list();
+		s.getTransaction().commit();
+		QueryStatistics qs = s.getSessionFactory().getStatistics().getQueryStatistics( queryString );
+		assertEquals( 1, qs.getCacheHitCount() );
+		assertEquals( 1, qs.getCachePutCount() );
+		s.close();
+		s = openSession();
+		s.beginTransaction();
+		for(Object obj:list){
+			s.delete( obj );
+		}
+		s.getTransaction().commit();
+		s.close();
+		
+	}
+	
+	public void testQueryCacheInvalidation() throws Exception {
+		
+		getSessions().evictQueries();
+		getSessions().getStatistics().clear();
+
+		final String queryString = "from Item i where i.name='widget'";
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.createQuery( queryString ).setCacheable(true).list();
+		Item i = new Item();
+		i.setName("widget");
+		i.setDescription("A really top-quality, full-featured widget.");
+		s.save(i);
+		t.commit();
+		s.close();
+		
+		QueryStatistics qs = s.getSessionFactory().getStatistics().getQueryStatistics( queryString );
+		EntityStatistics es = s.getSessionFactory().getStatistics().getEntityStatistics( Item.class.getName() );
+
+		Thread.sleep(200);
+
+		s = openSession();
+		t = s.beginTransaction();
+		List result = s.createQuery( queryString ).setCacheable(true).list();
+		assertEquals( result.size(), 1 );
+		t.commit();
+		s.close();
+		
+		assertEquals( qs.getCacheHitCount(), 0 );
+				
+		s = openSession();
+		t = s.beginTransaction();
+		result = s.createQuery( queryString ).setCacheable(true).list();
+		assertEquals( result.size(), 1 );
+		t.commit();
+		s.close();
+		
+		assertEquals( qs.getCacheHitCount(), 1 );
+		assertEquals( s.getSessionFactory().getStatistics().getEntityFetchCount(), 0 );
+		
+		s = openSession();
+		t = s.beginTransaction();
+		result = s.createQuery( queryString ).setCacheable(true).list();
+		assertEquals( result.size(), 1 );
+		assertTrue( Hibernate.isInitialized( result.get(0) ) );
+		i = (Item) result.get(0);
+		i.setName("Widget");
+		t.commit();
+		s.close();
+		
+		assertEquals( qs.getCacheHitCount(), 2 );
+		assertEquals( qs.getCacheMissCount(), 2 );
+		assertEquals( s.getSessionFactory().getStatistics().getEntityFetchCount(), 0 );
+
+		Thread.sleep(200);
+
+		s = openSession();
+		t = s.beginTransaction();
+		result = s.createQuery( queryString ).setCacheable(true).list();
+		if ( dialectIsCaseSensitive("i.name='widget' should not match on case sensitive database.") ) {
+			assertEquals( result.size(), 0 );
+		}
+		i = (Item) s.get( Item.class, new Long(i.getId()) );
+		assertEquals( i.getName(), "Widget" );
+		
+		s.delete(i);
+		t.commit();
+		s.close();
+
+		assertEquals( qs.getCacheHitCount(), 2 );
+		assertEquals( qs.getCacheMissCount(), 3 );
+		assertEquals( qs.getCachePutCount(), 3 );
+		assertEquals( qs.getExecutionCount(), 3 );
+		assertEquals( es.getFetchCount(), 0 ); //check that it was being cached
+		
+	}
+
+	public void testQueryCacheFetch() throws Exception {
+		
+		getSessions().evictQueries();
+		getSessions().getStatistics().clear();
+		
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Item i = new Item();
+		i.setName("widget");
+		i.setDescription("A really top-quality, full-featured widget.");
+		Item i2 = new Item();
+		i2.setName("other widget");
+		i2.setDescription("Another decent widget.");
+		s.persist(i);
+		s.persist(i2);
+		t.commit();
+		s.close();
+
+		final String queryString = "from Item i where i.name like '%widget'";
+
+		QueryStatistics qs = s.getSessionFactory().getStatistics().getQueryStatistics( queryString );
+
+		Thread.sleep(200);
+
+		s = openSession();
+		t = s.beginTransaction();
+		List result = s.createQuery( queryString ).setCacheable(true).list();
+		assertEquals( result.size(), 2 );
+		t.commit();
+		s.close();
+		
+		assertEquals( qs.getCacheHitCount(), 0 );
+		assertEquals( s.getSessionFactory().getStatistics().getEntityFetchCount(), 0 );
+		
+		getSessions().evict(Item.class);
+				
+		s = openSession();
+		t = s.beginTransaction();
+		result = s.createQuery( queryString ).setCacheable(true).list();
+		assertEquals( result.size(), 2 );
+		assertTrue( Hibernate.isInitialized( result.get(0) ) );
+		assertTrue( Hibernate.isInitialized( result.get(1) ) );
+		t.commit();
+		s.close();
+		
+		assertEquals( qs.getCacheHitCount(), 1 );
+		assertEquals( s.getSessionFactory().getStatistics().getEntityFetchCount(), 1 );
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery("delete Item").executeUpdate();
+		t.commit();
+		s.close();
+		
+	}
+
+	public void testProjectionCache() throws Exception {
+
+		getSessions().evictQueries();
+        getSessions().getStatistics().clear();
+
+		final String queryString = "select i.description from Item i where i.name='widget'";
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.createQuery( queryString ).setCacheable(true).list();
+		Item i = new Item();
+		i.setName("widget");
+		i.setDescription("A really top-quality, full-featured widget.");
+		s.save(i);
+		t.commit();
+		s.close();
+
+        QueryStatistics qs = s.getSessionFactory().getStatistics().getQueryStatistics( queryString );
+		EntityStatistics es = s.getSessionFactory().getStatistics().getEntityStatistics( Item.class.getName() );
+
+		Thread.sleep(200);
+
+		s = openSession();
+		t = s.beginTransaction();
+		List result = s.createQuery( queryString ).setCacheable(true).list();
+		assertEquals( result.size(), 1 );
+		t.commit();
+		s.close();
+
+		assertEquals( qs.getCacheHitCount(), 0 );
+
+		s = openSession();
+		t = s.beginTransaction();
+		result = s.createQuery( queryString ).setCacheable(true).list();
+		assertEquals( result.size(), 1 );
+		t.commit();
+		s.close();
+
+		assertEquals( qs.getCacheHitCount(), 1 );
+
+		s = openSession();
+		t = s.beginTransaction();
+		result = s.createQuery( queryString ).setCacheable(true).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list();
+		assertEquals( result.size(), 1 );
+		Map m = (Map) result.get(0);
+		assertEquals(1, m.size());
+		t.commit();
+		s.close();
+
+		assertEquals( "hit count should not go up since we are adding a resulttransformer", qs.getCacheHitCount(), 1 );
+		
+		s = openSession();
+		t = s.beginTransaction();
+		result = s.createQuery( queryString ).setCacheable(true).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list();
+		assertEquals( result.size(), 1 );
+		m = (Map) result.get(0);
+		assertEquals(1, m.size());
+		t.commit();
+		s.close();
+		
+		assertEquals( "hit count should go up since we are using the same resulttransformer", qs.getCacheHitCount(), 2 );
+		
+		s = openSession();
+		t = s.beginTransaction();
+		result = s.createQuery( queryString ).setCacheable(true).list();
+		assertEquals( result.size(), 1 );
+		assertTrue( Hibernate.isInitialized( result.get(0) ) );
+		i = (Item) s.get( Item.class, new Long(i.getId()) );
+        i.setName("widget");
+		i.setDescription("A middle-quality widget.");
+		t.commit();
+		s.close();
+
+		assertEquals( qs.getCacheHitCount(), 3 );
+		assertEquals( qs.getCacheMissCount(), 3 );
+
+		Thread.sleep(200);
+
+		s = openSession();
+		t = s.beginTransaction();
+		result = s.createQuery( queryString ).setCacheable(true).list();
+		assertEquals( result.size(), 1 );
+		i = (Item) s.get( Item.class, new Long(i.getId()) );
+		assertEquals( (String) result.get(0), "A middle-quality widget." );
+		
+		s.delete(i);
+		t.commit();
+		s.close();
+
+		assertEquals( qs.getCacheHitCount(), 3 );
+		assertEquals( qs.getCacheMissCount(), 4 );
+		assertEquals( qs.getCachePutCount(), 4 );
+		assertEquals( qs.getExecutionCount(), 4 );
+		assertEquals( es.getFetchCount(), 0 ); //check that it was being cached
+
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/querycache/QueryCacheTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/Customer.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/Customer.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/Customer.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,51 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.queryplan;
+
+/**
+ * Leaf subclass
+ *
+ * @author Steve Ebersole
+ */
+public class Customer extends User {
+	private String company;
+
+	protected Customer() {
+		super();
+	}
+
+	public Customer(String name, char sex, String username, String company) {
+		super( name, sex, username );
+		this.company = company;
+	}
+
+	public String getCompany() {
+		return company;
+	}
+
+	public void setCompany(String company) {
+		this.company = company;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/Customer.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/Employee.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/Employee.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/Employee.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,53 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.queryplan;
+
+import java.util.Date;
+
+/**
+ * Leaf subclass
+ *
+ * @author Steve Ebersole
+ */
+public class Employee extends User {
+	private Date hireDate;
+
+	protected Employee() {
+		super();
+	}
+
+	public Employee(String name, char sex, String username, Date hireDate) {
+		super( name, sex, username );
+		this.hireDate = hireDate;
+	}
+
+	public Date getHireDate() {
+		return hireDate;
+	}
+
+	public void setHireDate(Date hireDate) {
+		this.hireDate = hireDate;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/Employee.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/GetHqlQueryPlanTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/GetHqlQueryPlanTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/GetHqlQueryPlanTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,113 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.queryplan;
+
+import java.util.Map;
+
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.engine.query.HQLQueryPlan;
+import org.hibernate.engine.query.QueryPlanCache;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.Session;
+
+/**
+ * Tests for HQL query plans
+ *
+ * @author Gail Badner
+ */
+public class GetHqlQueryPlanTest extends FunctionalTestCase {
+	public GetHqlQueryPlanTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[]{
+			"queryplan/filter-defs.hbm.xml",
+			"queryplan/Joined.hbm.xml"
+		};
+	}
+
+	protected Map getEnabledFilters(Session s) {
+		return ( ( SessionImplementor ) s ).getLoadQueryInfluencers().getEnabledFilters();
+	}
+
+	public void testHqlQueryPlan() {
+		Session s = openSession();
+		QueryPlanCache cache = ( ( SessionImplementor ) s ).getFactory().getQueryPlanCache();
+		assertTrue( getEnabledFilters( s ).isEmpty() );
+
+		HQLQueryPlan plan1 = cache.getHQLQueryPlan( "from Person", false, getEnabledFilters( s ) );
+		HQLQueryPlan plan2 = cache.getHQLQueryPlan( "from Person where name is null", false, getEnabledFilters( s ) );
+		HQLQueryPlan plan3 = cache.getHQLQueryPlan( "from Person where name = :name", false, getEnabledFilters( s ) );
+		HQLQueryPlan plan4 = cache.getHQLQueryPlan( "from Person where name = ?", false, getEnabledFilters( s ) );
+
+		assertNotSame( plan1, plan2 );
+		assertNotSame( plan1, plan3 );
+		assertNotSame( plan1, plan4 );
+		assertNotSame( plan2, plan3 );
+		assertNotSame( plan2, plan4 );
+		assertNotSame( plan3, plan4 );
+
+		assertSame( plan1, cache.getHQLQueryPlan( "from Person", false, getEnabledFilters( s ) ) );
+		assertSame( plan2, cache.getHQLQueryPlan( "from Person where name is null", false, getEnabledFilters( s ) ) );
+		assertSame( plan3, cache.getHQLQueryPlan( "from Person where name = :name", false, getEnabledFilters( s ) ) );
+		assertSame( plan4, cache.getHQLQueryPlan( "from Person where name = ?", false, getEnabledFilters( s ) ) );
+
+		s.close();
+	}
+
+	public void testHqlQueryPlanWithEnabledFilter() {
+		Session s = openSession();
+		QueryPlanCache cache = ( ( SessionImplementor ) s ).getFactory().getQueryPlanCache();
+
+		HQLQueryPlan plan1A = cache.getHQLQueryPlan( "from Person", true, getEnabledFilters( s ) );
+		HQLQueryPlan plan1B = cache.getHQLQueryPlan( "from Person", false, getEnabledFilters( s ) );
+
+		s.enableFilter( "sex" ).setParameter( "sexCode", new Character( 'F' ) );
+		HQLQueryPlan plan2A = cache.getHQLQueryPlan( "from Person", true, getEnabledFilters( s ) );
+		HQLQueryPlan plan2B = cache.getHQLQueryPlan( "from Person", false, getEnabledFilters( s ) );
+
+		s.disableFilter( "sex" );
+		HQLQueryPlan plan3A = cache.getHQLQueryPlan( "from Person", true, getEnabledFilters( s ) );
+		HQLQueryPlan plan3B = cache.getHQLQueryPlan( "from Person", false, getEnabledFilters( s ) );
+
+		s.enableFilter( "sex" ).setParameter( "sexCode", new Character( 'M' ) );
+		HQLQueryPlan plan4A = cache.getHQLQueryPlan( "from Person", true, getEnabledFilters( s ) );
+		HQLQueryPlan plan4B = cache.getHQLQueryPlan( "from Person", false, getEnabledFilters( s ) );
+
+		assertSame( plan1A, plan3A );
+		assertSame( plan1B, plan3B );
+		assertSame( plan2A, plan4A );
+		assertSame( plan2B, plan4B );
+
+		assertNotSame( plan1A, plan1B );
+		assertNotSame( plan1A, plan2A );
+		assertNotSame( plan1A, plan2B );
+		assertNotSame( plan1B, plan2A );
+		assertNotSame( plan1B, plan2B );
+
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/GetHqlQueryPlanTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/Joined.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/Joined.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/Joined.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,52 @@
+<?xml version="1.0"?>
+<!--
+  ~ Hibernate, Relational Persistence for Idiomatic Java
+  ~
+  ~ Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+  ~ indicated by the @author tags or express copyright attribution
+  ~ statements applied by the authors.  All third-party contributions are
+  ~ distributed under license by Red Hat Middleware LLC.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, as published by the Free Software Foundation.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  ~ or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+  ~ for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public License
+  ~ along with this distribution; if not, write to:
+  ~ Free Software Foundation, Inc.
+  ~ 51 Franklin Street, Fifth Floor
+  ~ Boston, MA  02110-1301  USA
+  ~
+  -->
+
+<!DOCTYPE hibernate-mapping
+        SYSTEM
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<hibernate-mapping package="org.hibernate.test.queryplan">
+    <class name="Person" table="FILTER_HQL_JOINED_PERSON">
+        <id column="ID" name="id" type="long">
+            <generator class="increment"/>
+        </id>
+        <property name="name" type="string"/>
+        <property name="sex" column="SEX_CODE" type="char"/>
+        <joined-subclass name="User" table="FILTER_HQL_JOINED_USER">
+            <key column="USER_ID"/>
+            <property name="username" type="string"/>
+            <joined-subclass name="Employee" table="FILTER_HQL_JOINED_EMP">
+                <key column="EMP_ID"/>
+                <property name="hireDate" type="date"/>
+            </joined-subclass>
+            <joined-subclass name="Customer" table="FILTER_HQL_JOINED_CUST">
+                <key column="CUST_ID"/>
+                <property name="company" type="string"/>
+            </joined-subclass>
+        </joined-subclass>
+        <filter name="sex"/>
+    </class>
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/Joined.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/NativeSQLQueryPlanEqualsTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/NativeSQLQueryPlanEqualsTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/NativeSQLQueryPlanEqualsTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,70 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.queryplan;
+
+import org.hibernate.engine.query.QueryPlanCache;
+import org.hibernate.engine.query.NativeSQLQueryPlan;
+import org.hibernate.engine.query.sql.NativeSQLQueryScalarReturn;
+import org.hibernate.engine.query.sql.NativeSQLQueryReturn;
+import org.hibernate.engine.query.sql.NativeSQLQuerySpecification;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+
+/**
+ * Tests equals() for NativeSQLQueryReturn implementations.
+ *
+ * @author Michael Stevens
+ */
+public class NativeSQLQueryPlanEqualsTest extends FunctionalTestCase {
+	public NativeSQLQueryPlanEqualsTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] {};
+	}
+
+	public void testNativeSQLQuerySpecEquals() {
+		QueryPlanCache cache = new QueryPlanCache(null);
+		NativeSQLQuerySpecification firstSpec = createSpec();
+
+		NativeSQLQuerySpecification secondSpec = createSpec();
+		
+		NativeSQLQueryPlan firstPlan = cache.getNativeSQLQueryPlan(firstSpec);
+		NativeSQLQueryPlan secondPlan = cache.getNativeSQLQueryPlan(secondSpec);
+		
+		assertEquals(firstPlan, secondPlan);
+		
+	}
+
+	private NativeSQLQuerySpecification createSpec() {
+		String blah = "blah";
+		String select = "select blah from blah";
+		NativeSQLQueryReturn[] queryReturns = 
+			new NativeSQLQueryScalarReturn[] {new NativeSQLQueryScalarReturn(blah, sfi().getTypeResolver().basic( "int" ) ) };
+		NativeSQLQuerySpecification spec = new NativeSQLQuerySpecification(select,
+			queryReturns, null);
+		return spec;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/NativeSQLQueryPlanEqualsTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/NativeSQLQueryReturnEqualsAndHashCodeTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/NativeSQLQueryReturnEqualsAndHashCodeTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/NativeSQLQueryReturnEqualsAndHashCodeTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,270 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.queryplan;
+
+import java.util.Collections;
+import java.util.HashMap;
+
+import org.hibernate.LockMode;
+import org.hibernate.engine.query.sql.NativeSQLQueryCollectionReturn;
+import org.hibernate.engine.query.sql.NativeSQLQueryJoinReturn;
+import org.hibernate.engine.query.sql.NativeSQLQueryReturn;
+import org.hibernate.engine.query.sql.NativeSQLQueryRootReturn;
+import org.hibernate.engine.query.sql.NativeSQLQueryScalarReturn;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+
+/**
+ * Tests equals() and hashCode() for NativeSQLQueryReturn implementations.
+ *
+ * @author Gail Badner
+ */
+public class NativeSQLQueryReturnEqualsAndHashCodeTest extends FunctionalTestCase {
+	public NativeSQLQueryReturnEqualsAndHashCodeTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] {};
+	}
+
+	public void testNativeSQLQueryScalarReturn() {
+		NativeSQLQueryScalarReturn typeNoAlias = new NativeSQLQueryScalarReturn( null, sfi().getTypeResolver().basic( "int" ) );
+		NativeSQLQueryScalarReturn aliasNoType = new NativeSQLQueryScalarReturn( "abc", null );
+		NativeSQLQueryScalarReturn aliasTypeInt = new NativeSQLQueryScalarReturn( "abc", sfi().getTypeResolver().basic( "int" ) );
+		NativeSQLQueryScalarReturn aliasTypeLong =  new NativeSQLQueryScalarReturn( "abc", sfi().getTypeResolver().basic( "long" ) );
+		NativeSQLQueryScalarReturn aliasTypeLongClass =  new NativeSQLQueryScalarReturn( "abc", sfi().getTypeResolver().basic( Long.class.getName() ) );
+		NativeSQLQueryScalarReturn aliasTypeString =  new NativeSQLQueryScalarReturn( "abc", sfi().getTypeResolver().basic( "string" ) );
+		NativeSQLQueryScalarReturn aliasTypeStringClass =  new NativeSQLQueryScalarReturn( "abc", sfi().getTypeResolver().basic( String.class.getName() ) );
+
+		check( false, typeNoAlias, aliasNoType );
+		check( false, typeNoAlias, aliasTypeInt );
+		check( false, typeNoAlias, aliasTypeLong );
+		check( false, typeNoAlias, aliasTypeLongClass );
+		check( false, typeNoAlias, aliasTypeString );
+		check( false, typeNoAlias, aliasTypeStringClass );
+
+		check( false, aliasNoType, aliasTypeInt );
+		check( false, aliasNoType, aliasTypeLong );
+		check( false, aliasNoType, aliasTypeLongClass );
+		check( false, aliasNoType, aliasTypeString );
+		check( false, aliasNoType, aliasTypeStringClass );
+
+		check( false, aliasTypeInt, aliasTypeLong );
+		check( false, aliasTypeInt, aliasTypeLongClass );
+		check( false, aliasTypeInt, aliasTypeString );
+		check( false, aliasTypeInt, aliasTypeStringClass );
+
+		check( true, aliasTypeLong, aliasTypeLongClass );
+		check( false, aliasTypeLong, aliasTypeString );
+		check( false, aliasTypeLong, aliasTypeStringClass );
+
+		check( false, aliasTypeLongClass, aliasTypeString );
+		check( false, aliasTypeLongClass, aliasTypeStringClass );
+
+		check( true, aliasTypeString, aliasTypeStringClass );
+
+		check( true, typeNoAlias, new NativeSQLQueryScalarReturn( null, sfi().getTypeResolver().basic( "int" ) ) );
+		check( true, aliasNoType, new NativeSQLQueryScalarReturn( "abc", null ) );
+		check( true, aliasTypeInt, new NativeSQLQueryScalarReturn( "abc", sfi().getTypeResolver().basic( "int" ) ) );
+		check( true, aliasTypeLong, new NativeSQLQueryScalarReturn( "abc", sfi().getTypeResolver().basic( "long" ) ) );
+		check( true, aliasTypeLongClass,  new NativeSQLQueryScalarReturn( "abc", sfi().getTypeResolver().basic( Long.class.getName() ) ) );
+		check( true, aliasTypeString, new NativeSQLQueryScalarReturn( "abc", sfi().getTypeResolver().basic( "string" ) ) );
+		check( true, aliasTypeStringClass, new NativeSQLQueryScalarReturn( "abc", sfi().getTypeResolver().basic( String.class.getName() ) ) );
+	}
+
+	public void testNativeSQLQueryRootReturn() {
+		NativeSQLQueryRootReturn alias = new NativeSQLQueryRootReturn( "abc", null, null);
+		NativeSQLQueryRootReturn diffAlias = new NativeSQLQueryRootReturn( "def", null, null);
+		NativeSQLQueryRootReturn aliasEntityName = new NativeSQLQueryRootReturn( "abc", "Person", null);
+		NativeSQLQueryRootReturn aliasDiffEntityName = new NativeSQLQueryRootReturn( "abc", "Customer", null);
+		NativeSQLQueryRootReturn aliasEntityNameLockMode = new NativeSQLQueryRootReturn( "abc", "Person", LockMode.NONE );
+		NativeSQLQueryRootReturn aliasEntityNameDiffLockMode = new NativeSQLQueryRootReturn( "abc", "Person", LockMode.OPTIMISTIC );
+
+		check( false, alias, diffAlias );
+		check( false, alias, aliasEntityName );
+		check( false, alias, aliasDiffEntityName );
+		check( false, alias, aliasEntityNameLockMode );
+		check( false, alias, aliasEntityNameDiffLockMode );
+
+		check( false, diffAlias, aliasEntityName );
+		check( false, diffAlias, aliasDiffEntityName );
+		check( false, diffAlias, aliasEntityNameLockMode );
+		check( false, diffAlias, aliasEntityNameDiffLockMode );
+
+		check( false, aliasEntityName, aliasDiffEntityName );
+		check( false, aliasEntityName, aliasEntityNameLockMode );
+		check( false, aliasEntityName, aliasEntityNameDiffLockMode );
+
+		check( false, aliasDiffEntityName, aliasEntityNameLockMode );
+		check( false, aliasDiffEntityName, aliasEntityNameDiffLockMode );
+
+		check( false, aliasEntityNameLockMode, aliasEntityNameDiffLockMode );
+
+		check( true, alias, new NativeSQLQueryRootReturn( "abc", null, null) );
+		check( true, diffAlias, new NativeSQLQueryRootReturn( "def", null, null) );
+		check( true, aliasEntityName, new NativeSQLQueryRootReturn( "abc", "Person", null) );
+		check( true, aliasDiffEntityName, new NativeSQLQueryRootReturn( "abc", "Customer", null) );
+		check( true, aliasEntityNameLockMode, new NativeSQLQueryRootReturn( "abc", "Person", LockMode.NONE ) );
+		check( true, aliasEntityNameDiffLockMode, new NativeSQLQueryRootReturn( "abc", "Person", LockMode.OPTIMISTIC ) );
+	}
+
+	public void testNativeSQLQueryJoinReturn() {
+		NativeSQLQueryJoinReturn r1 = new NativeSQLQueryJoinReturn( "a", "b", "c", null, null);
+		NativeSQLQueryJoinReturn r2 = new NativeSQLQueryJoinReturn( "a", "c", "b", null, null);
+		NativeSQLQueryJoinReturn r3NullMap = new NativeSQLQueryJoinReturn( "b", "c", "a", null, null);
+		NativeSQLQueryJoinReturn r3EmptyMap= new NativeSQLQueryJoinReturn( "b", "c", "a", new HashMap(), null);
+		NativeSQLQueryJoinReturn r4 = new NativeSQLQueryJoinReturn( "b", "c", "a", Collections.singletonMap( "key", "value" ), null);
+		NativeSQLQueryJoinReturn r5 = new NativeSQLQueryJoinReturn( "b", "c", "a", Collections.singletonMap( "otherkey", "othervalue" ), null);
+		NativeSQLQueryJoinReturn r6 = new NativeSQLQueryJoinReturn( "b", "c", "a", Collections.singletonMap( "key", "value" ), LockMode.NONE );
+		NativeSQLQueryJoinReturn r7 = new NativeSQLQueryJoinReturn( "b", "c", "a", null, LockMode.NONE );
+
+		check( false, r1, r2 );
+		check( false, r1, r3NullMap );
+		check( false, r1, r3EmptyMap );
+		check( false, r1, r4 );
+		check( false, r1, r5 );
+		check( false, r1, r6 );
+		check( false, r1, r7 );
+
+		check( false, r2, r3NullMap );
+		check( false, r2, r3EmptyMap );
+		check( false, r2, r4 );
+		check( false, r2, r5 );
+		check( false, r2, r6 );
+		check( false, r2, r7 );
+
+		check( true, r3NullMap, r3EmptyMap );
+		check( false, r3NullMap, r4 );
+		check( false, r3NullMap, r5 );
+		check( false, r3NullMap, r6 );
+		check( false, r3NullMap, r7 );
+
+		check( false, r3EmptyMap, r4 );
+		check( false, r3EmptyMap, r5 );
+		check( false, r3EmptyMap, r6 );
+		check( false, r3EmptyMap, r7 );
+
+		check( false, r4, r5 );
+		check( false, r4, r6 );
+		check( false, r4, r7 );
+
+		check( false, r5, r6 );
+		check( false, r5, r7 );
+
+		check( false, r6, r7 );
+
+		check( true, r1, new NativeSQLQueryJoinReturn( "a", "b", "c", null, null) );
+		check( true, r2, new NativeSQLQueryJoinReturn( "a", "c", "b", null, null) );
+		check( true, r3NullMap, new NativeSQLQueryJoinReturn( "b", "c", "a", null, null) );
+		check( true, r3EmptyMap, new NativeSQLQueryJoinReturn( "b", "c", "a", new HashMap(), null) );
+		check( true, r4, new NativeSQLQueryJoinReturn( "b", "c", "a", Collections.singletonMap( "key", "value" ), null) );
+		check( true, r5, new NativeSQLQueryJoinReturn( "b", "c", "a", Collections.singletonMap( "otherkey", "othervalue" ), null) );
+		check( true, r6, new NativeSQLQueryJoinReturn( "b", "c", "a", Collections.singletonMap( "key", "value" ), LockMode.NONE ) );
+		check( true, r7, new NativeSQLQueryJoinReturn( "b", "c", "a", null, LockMode.NONE ) );
+	}
+
+	public void testNativeSQLQueryCollectionReturn() {
+		NativeSQLQueryCollectionReturn r1 = new NativeSQLQueryCollectionReturn( "a", "b", "c", null, null);
+		NativeSQLQueryCollectionReturn r2 = new NativeSQLQueryCollectionReturn( "a", "c", "b", null, null);
+		NativeSQLQueryCollectionReturn r3NullMap = new NativeSQLQueryCollectionReturn( "b", "c", "a", null, null);
+		NativeSQLQueryCollectionReturn r3EmptyMap= new NativeSQLQueryCollectionReturn( "b", "c", "a", new HashMap(), null);
+		NativeSQLQueryCollectionReturn r4 = new NativeSQLQueryCollectionReturn( "b", "c", "a", Collections.singletonMap( "key", "value" ), null);
+		NativeSQLQueryCollectionReturn r5 = new NativeSQLQueryCollectionReturn( "b", "c", "a", Collections.singletonMap( "otherkey", "othervalue" ), null);
+		NativeSQLQueryCollectionReturn r6 = new NativeSQLQueryCollectionReturn( "b", "c", "a", Collections.singletonMap( "key", "value" ), LockMode.NONE );
+		NativeSQLQueryCollectionReturn r7 = new NativeSQLQueryCollectionReturn( "b", "c", "a", null, LockMode.NONE );
+
+		check( false, r1, r2 );
+		check( false, r1, r3NullMap );
+		check( false, r1, r3EmptyMap );
+		check( false, r1, r4 );
+		check( false, r1, r5 );
+		check( false, r1, r6 );
+		check( false, r1, r7 );
+
+		check( false, r2, r3NullMap );
+		check( false, r2, r3EmptyMap );
+		check( false, r2, r4 );
+		check( false, r2, r5 );
+		check( false, r2, r6 );
+		check( false, r2, r7 );
+
+		check( true, r3NullMap, r3EmptyMap );
+		check( false, r3NullMap, r4 );
+		check( false, r3NullMap, r5 );
+		check( false, r3NullMap, r6 );
+		check( false, r3NullMap, r7 );
+
+		check( false, r3EmptyMap, r4 );
+		check( false, r3EmptyMap, r5 );
+		check( false, r3EmptyMap, r6 );
+		check( false, r3EmptyMap, r7 );
+
+		check( false, r4, r5 );
+		check( false, r4, r6 );
+		check( false, r4, r7 );
+
+		check( false, r5, r6 );
+		check( false, r5, r7 );
+
+		check( false, r6, r7 );
+
+		check( true, r1, new NativeSQLQueryCollectionReturn( "a", "b", "c", null, null) );
+		check( true, r2, new NativeSQLQueryCollectionReturn( "a", "c", "b", null, null) );
+		check( true, r3NullMap, new NativeSQLQueryCollectionReturn( "b", "c", "a", null, null) );
+		check( true, r3EmptyMap, new NativeSQLQueryCollectionReturn( "b", "c", "a", new HashMap(), null) );
+		check( true, r4, new NativeSQLQueryCollectionReturn( "b", "c", "a", Collections.singletonMap( "key", "value" ), null) );
+		check( true, r5, new NativeSQLQueryCollectionReturn( "b", "c", "a", Collections.singletonMap( "otherkey", "othervalue" ), null) );
+		check( true, r6, new NativeSQLQueryCollectionReturn( "b", "c", "a", Collections.singletonMap( "key", "value" ), LockMode.NONE ) );
+		check( true, r7, new NativeSQLQueryCollectionReturn( "b", "c", "a", null, LockMode.NONE ) );
+	}
+
+	public void testNativeSQLQueryReturnTypes() {
+		NativeSQLQueryScalarReturn r1 = new NativeSQLQueryScalarReturn( "a", sfi().getTypeResolver().basic( "int" ) );
+		NativeSQLQueryRootReturn r2 = new NativeSQLQueryRootReturn( "a", "b", LockMode.NONE );
+		NativeSQLQueryJoinReturn r3 = new NativeSQLQueryJoinReturn( "a", "b", "c", Collections.singletonMap( "key", "value" ), LockMode.NONE );
+		NativeSQLQueryCollectionReturn r4 = new NativeSQLQueryCollectionReturn( "a", "b", "c", Collections.singletonMap( "key", "value" ), LockMode.NONE);
+
+		check( false, r1, r2 );
+		check( false, r1, r3 );
+		check( false, r1, r4 );
+
+		check( false, r2, r3 );
+		check( false, r2, r4 );
+
+		check( false, r3, r4 );
+	}
+
+	private void check(boolean expectedEquals, NativeSQLQueryReturn queryReturn1, NativeSQLQueryReturn queryReturn2) {
+		if ( expectedEquals ) {
+			assertTrue( queryReturn1.equals( queryReturn2 ) );
+			assertTrue( queryReturn2.equals( queryReturn1 ) );
+			assertTrue( queryReturn1.hashCode() == queryReturn2.hashCode() );
+		}
+		else {
+			assertFalse( queryReturn1.equals( queryReturn2 ) );
+			assertFalse( queryReturn2.equals( queryReturn1 ) );
+			assertFalse( queryReturn1.hashCode() == queryReturn2.hashCode() );
+		}
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/NativeSQLQueryReturnEqualsAndHashCodeTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,71 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.queryplan;
+
+/**
+ * Base of inheritence hierarchy
+ *
+ * @author Steve Ebersole
+ */
+public class Person {
+	private Long id;
+	private String name;
+	private char sex;
+
+	/**
+	 * Used by persistence
+	 */
+	protected Person() {
+	}
+
+	public Person(String name, char sex) {
+		this.name = name;
+		this.sex = sex;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	private void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public char getSex() {
+		return sex;
+	}
+
+	public void setSex(char sex) {
+		this.sex = sex;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/Person.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/User.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/User.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/User.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,51 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.queryplan;
+
+/**
+ * Non-leaf subclass
+ *
+ * @author Steve Ebersole
+ */
+public class User extends Person {
+	private String username;
+
+	protected User() {
+		super();
+	}
+
+	public User(String name, char sex, String username) {
+		super( name, sex );
+		this.username = username;
+	}
+
+	public String getUsername() {
+		return username;
+	}
+
+	public void setUsername(String username) {
+		this.username = username;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/User.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/filter-defs.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/filter-defs.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/filter-defs.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<!--
+  ~ Hibernate, Relational Persistence for Idiomatic Java
+  ~
+  ~ Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+  ~ indicated by the @author tags or express copyright attribution
+  ~ statements applied by the authors.  All third-party contributions are
+  ~ distributed under license by Red Hat Middleware LLC.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, as published by the Free Software Foundation.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  ~ or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+  ~ for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public License
+  ~ along with this distribution; if not, write to:
+  ~ Free Software Foundation, Inc.
+  ~ 51 Franklin Street, Fifth Floor
+  ~ Boston, MA  02110-1301  USA
+  ~
+  -->
+
+<!DOCTYPE hibernate-mapping
+        SYSTEM
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<hibernate-mapping package="org.hibernate.test.queryplan">
+    <filter-def name="sex" condition="SEX_CODE = :sexCode">
+        <filter-param name="sexCode" type="char"/>
+    </filter-def>
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/queryplan/filter-defs.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/AbstractReadOnlyTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/AbstractReadOnlyTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/AbstractReadOnlyTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,79 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.readonly;
+
+import org.hibernate.CacheMode;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+
+/**
+ *
+ * @author Gail Badner
+ */
+public abstract class AbstractReadOnlyTest extends FunctionalTestCase {
+
+	public AbstractReadOnlyTest(String str) {
+		super(str);
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setProperty( Environment.GENERATE_STATISTICS, "true");
+		cfg.setProperty( Environment.STATEMENT_BATCH_SIZE, "0" );
+	}
+
+	public org.hibernate.classic.Session openSession() {
+		org.hibernate.classic.Session s = super.openSession();
+		s.setCacheMode( getSessionCacheMode() );
+		return s;
+	}
+
+	protected CacheMode getSessionCacheMode() {
+		return CacheMode.IGNORE;
+	}
+
+	public String getCacheConcurrencyStrategy() {
+		return null;
+	}
+
+	protected void clearCounts() {
+		getSessions().getStatistics().clear();
+	}
+
+	protected void assertInsertCount(int expected) {
+		int inserts = ( int ) getSessions().getStatistics().getEntityInsertCount();
+		assertEquals( "unexpected insert count", expected, inserts );
+	}
+
+	protected void assertUpdateCount(int expected) {
+		int updates = ( int ) getSessions().getStatistics().getEntityUpdateCount();
+		assertEquals( "unexpected update counts", expected, updates );
+	}
+
+	protected void assertDeleteCount(int expected) {
+		int deletes = ( int ) getSessions().getStatistics().getEntityDeleteCount();
+		assertEquals( "unexpected delete counts", expected, deletes );
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/AbstractReadOnlyTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/Container.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/Container.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/Container.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,117 @@
+package org.hibernate.test.readonly;
+
+import java.util.Set;
+import java.util.HashSet;
+import java.io.Serializable;
+
+/**
+ * @author Steve Ebersole, Gail Badner (adapted this from "proxy" tests version)
+ */
+public class Container implements Serializable {
+	private Long id;
+	private String name;
+	private Owner noProxyOwner;
+	private Owner proxyOwner;
+	private Owner nonLazyOwner;
+	private Info noProxyInfo;
+	private Info proxyInfo;
+	private Info nonLazyInfo;
+	private Set lazyDataPoints = new HashSet();
+	private Set nonLazyJoinDataPoints = new HashSet();
+	private Set nonLazySelectDataPoints = new HashSet();
+
+	public Container() {
+	}
+
+	public Container(String name) {
+		this.name = name;
+	}
+
+	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 Owner getNoProxyOwner() {
+		return noProxyOwner;
+	}
+
+	public void setNoProxyOwner(Owner noProxyOwner) {
+		this.noProxyOwner = noProxyOwner;
+	}
+
+	public Owner getProxyOwner() {
+		return proxyOwner;
+	}
+
+	public void setProxyOwner(Owner proxyOwner) {
+		this.proxyOwner = proxyOwner;
+	}
+
+	public Owner getNonLazyOwner() {
+		return nonLazyOwner;
+	}
+
+	public void setNonLazyOwner(Owner nonLazyOwner) {
+		this.nonLazyOwner = nonLazyOwner;
+	}
+
+	public Info getNoProxyInfo() {
+		return noProxyInfo;
+	}
+
+	public void setNoProxyInfo(Info noProxyInfo) {
+		this.noProxyInfo = noProxyInfo;
+	}
+
+	public Info getProxyInfo() {
+		return proxyInfo;
+	}
+
+	public void setProxyInfo(Info proxyInfo) {
+		this.proxyInfo = proxyInfo;
+	}
+
+	public Info getNonLazyInfo() {
+		return nonLazyInfo;
+	}
+
+	public void setNonLazyInfo(Info nonLazyInfo) {
+		this.nonLazyInfo = nonLazyInfo;
+	}
+
+	public Set getLazyDataPoints() {
+		return lazyDataPoints;
+	}
+
+	public void setLazyDataPoints(Set lazyDataPoints) {
+		this.lazyDataPoints = lazyDataPoints;
+	}
+
+	public Set getNonLazyJoinDataPoints() {
+		return nonLazyJoinDataPoints;
+	}
+
+	public void setNonLazyJoinDataPoints(Set nonLazyJoinDataPoints) {
+		this.nonLazyJoinDataPoints = nonLazyJoinDataPoints;
+	}
+
+	public Set getNonLazySelectDataPoints() {
+		return nonLazySelectDataPoints;
+	}
+
+	public void setNonLazySelectDataPoints(Set nonLazySelectDataPoints) {
+		this.nonLazySelectDataPoints = nonLazySelectDataPoints;
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/Container.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/Course.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/Course.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/Course.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,22 @@
+//$Id: Course.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.readonly;
+
+/**
+ * @author Gavin King
+ */
+public class Course {
+	private String courseCode;
+	private String description;
+	public String getCourseCode() {
+		return courseCode;
+	}
+	public void setCourseCode(String courseCode) {
+		this.courseCode = courseCode;
+	}
+	public String getDescription() {
+		return description;
+	}
+	public void setDescription(String description) {
+		this.description = description;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/Course.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/DataPoint.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/DataPoint.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/DataPoint.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,63 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping 
+	package="org.hibernate.test.readonly">
+
+	<class name="DataPoint" 
+		dynamic-update="true">
+		<!--rowid="rowid"--> <!-- remove this if not oracle -->
+		<id name="id">
+			<generator class="increment"/>
+		</id>
+		<property name="x">
+			<column name="xval" not-null="true" precision="25" scale="19" unique-key="xy"/>
+		</property>
+		<property name="y">
+			<column name="yval" not-null="true" precision="25" scale="19" unique-key="xy"/>
+		</property>
+		<property name="description"/>
+	</class>
+
+    <class name="Owner">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <property name="name" unique="true"/>
+    </class>
+
+    <class name="Info">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <property name="details"/>
+    </class>
+
+    <class name="Container">
+        <id name="id">
+            <generator class="increment"/>
+        </id>
+        <property name="name"/>
+        <many-to-one name="noProxyOwner" class="Owner" column="no_proxy_owner_name" property-ref="name" lazy="no-proxy" cascade="all"/>
+        <many-to-one name="proxyOwner" class="Owner" column="proxy_owner_name" property-ref="name" lazy="proxy" cascade="all"/>
+        <many-to-one name="nonLazyOwner" class="Owner" column="non_lazy_owner_name" property-ref="name" lazy="false" cascade="all"/>
+        <many-to-one name="noProxyInfo" class="Info" column="no_proxy_info_id" lazy="no-proxy" cascade="all"/>
+        <many-to-one name="proxyInfo" class="Info" column="proxy_info_id" lazy="proxy" cascade="all"/>
+        <many-to-one name="nonLazyInfo" class="Info" column="non_lazy_info_id" lazy="false" cascade="all"/>
+        <set name="lazyDataPoints" lazy="true" inverse="false" cascade="all">
+            <key column="c_lazy_id"/>
+            <one-to-many class="DataPoint"/>
+        </set>
+        <set name="nonLazySelectDataPoints" lazy="false" inverse="false" cascade="all" fetch="select">
+            <key column="c_non_lazy_select_id"/>
+            <one-to-many class="DataPoint"/>
+        </set>
+        <set name="nonLazyJoinDataPoints" lazy="false" inverse="false" cascade="all" fetch="join">
+            <key column="c_non_lazy_join_id"/>
+            <one-to-many class="DataPoint"/>
+        </set>
+    </class>
+    
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/DataPoint.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/DataPoint.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/DataPoint.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/DataPoint.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,75 @@
+//$Id: DataPoint.java 7231 2005-06-19 22:04:00Z oneovthafew $
+package org.hibernate.test.readonly;
+
+import java.math.BigDecimal;
+import java.io.Serializable;
+
+/**
+ * @author Gavin King
+ */
+public class DataPoint implements Serializable {
+	private long id;
+	private BigDecimal x;
+	private BigDecimal y;
+	private String description;
+
+	public DataPoint() {}
+
+	public DataPoint(BigDecimal x, BigDecimal y, String description) {
+		this.x = x;
+		this.y = y;
+		this.description = description;
+	}
+
+	/**
+	 * @return Returns the description.
+	 */
+	public String getDescription() {
+		return description;
+	}
+	/**
+	 * @param description The description to set.
+	 */
+	public void setDescription(String description) {
+		this.description = description;
+	}
+	/**
+	 * @return Returns the id.
+	 */
+	public long getId() {
+		return id;
+	}
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(long id) {
+		this.id = id;
+	}
+	/**
+	 * @return Returns the x.
+	 */
+	public BigDecimal getX() {
+		return x;
+	}
+	/**
+	 * @param x The x to set.
+	 */
+	public void setX(BigDecimal x) {
+		this.x = x;
+	}
+	/**
+	 * @return Returns the y.
+	 */
+	public BigDecimal getY() {
+		return y;
+	}
+	/**
+	 * @param y The y to set.
+	 */
+	public void setY(BigDecimal y) {
+		this.y = y;
+	}
+	void exception() throws Exception {
+		throw new Exception("foo");
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/DataPoint.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/Enrolment.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/Enrolment.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/Enrolment.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,45 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.readonly">
+	
+	<class name="Course">
+		<id name="courseCode">
+			<generator class="assigned"/>
+		</id>
+		<property name="description"/>
+	</class>
+	
+	<class name="Student">
+		<id name="studentNumber">
+		    <column name="studentId"/>
+			<generator class="assigned"/>
+		</id>
+		<property name="name" not-null="true"/>
+		<set name="enrolments" inverse="true" cascade="delete">
+			<key column="studentId"/>
+			<one-to-many class="Enrolment"/>
+		</set>
+        <many-to-one name="preferredCourse" column="preferredCourseCode"/>
+	</class>
+	
+	<class name="Enrolment">
+		<composite-id>
+			<key-property name="studentNumber">
+				<column name="studentId"/>
+			</key-property>
+			<key-property name="courseCode"/>
+		</composite-id>
+		<many-to-one name="student" insert="false" update="false">
+			<column name="studentId"/>
+		</many-to-one>
+		<many-to-one name="course" insert="false" update="false">
+			<column name="courseCode"/>
+		</many-to-one>
+		<property name="semester" not-null="true"/>
+		<property name="year" column="`year`" not-null="true"/>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/Enrolment.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/Enrolment.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/Enrolment.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/Enrolment.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,63 @@
+//$Id: Enrolment.java 6970 2005-05-31 20:24:41Z oneovthafew $
+package org.hibernate.test.readonly;
+
+import java.io.Serializable;
+
+/**
+ * @author Gavin King
+ */
+public class Enrolment implements Serializable {
+	private Student student;
+	private Course course;
+	private long studentNumber;
+	private String courseCode;
+	private short year;
+	private short semester;
+	public String getCourseCode() {
+		return courseCode;
+	}
+	public void setCourseCode(String courseId) {
+		this.courseCode = courseId;
+	}
+	public long getStudentNumber() {
+		return studentNumber;
+	}
+	public void setStudentNumber(long studentId) {
+		this.studentNumber = studentId;
+	}
+	public Course getCourse() {
+		return course;
+	}
+	public void setCourse(Course course) {
+		this.course = course;
+	}
+	public Student getStudent() {
+		return student;
+	}
+	public void setStudent(Student student) {
+		this.student = student;
+	}
+	public short getSemester() {
+		return semester;
+	}
+	public void setSemester(short semester) {
+		this.semester = semester;
+	}
+	public short getYear() {
+		return year;
+	}
+	public void setYear(short year) {
+		this.year = year;
+	}
+	
+	public boolean equals(Object other) {
+		if ( !(other instanceof Enrolment) ) return false;
+		Enrolment that = (Enrolment) other;
+		return studentNumber==that.studentNumber &&
+			courseCode.equals(that.courseCode);
+	}
+	
+	public int hashCode() {
+		return courseCode.hashCode();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/Enrolment.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/Info.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/Info.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/Info.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,34 @@
+package org.hibernate.test.readonly;
+
+/**
+ * todo: describe Info
+ *
+ * @author Steve Ebersole, Gail Badner (adapted this from "proxy" tests version)
+ */
+public class Info {
+	private Long id;
+	private String details;
+
+	public Info() {
+	}
+
+	public Info(String details) {
+		this.details = details;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getDetails() {
+		return details;
+	}
+
+	public void setDetails(String details) {
+		this.details = details;
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/Info.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/Owner.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/Owner.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/Owner.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,34 @@
+package org.hibernate.test.readonly;
+
+import java.io.Serializable;
+
+/**
+ * @author Steve Ebersole, Gail Badner (adapted this from "proxy" tests version)
+ */
+public class Owner implements Serializable {
+	private Long id;
+	private String name;
+
+	public Owner() {
+	}
+
+	public Owner(String name) {
+		this.name = name;
+	}
+
+	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;
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/Owner.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/ReadOnlyCriteriaQueryTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/ReadOnlyCriteriaQueryTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/ReadOnlyCriteriaQueryTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,1652 @@
+//$Id: CriteriaQueryTest.java 10976 2006-12-12 23:22:26Z steve.ebersole at jboss.com $
+package org.hibernate.test.readonly;
+
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.Criteria;
+import org.hibernate.Hibernate;
+import org.hibernate.ScrollableResults;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.criterion.DetachedCriteria;
+import org.hibernate.criterion.Order;
+import org.hibernate.criterion.Property;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.criterion.Subqueries;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.proxy.HibernateProxy;
+import org.hibernate.proxy.LazyInitializer;
+import org.hibernate.util.SerializationHelper;
+
+/**
+ * @author Gail Badner (adapted from org.hibernate.test.criteria.CriteriaQueryTest by Gavin King)
+ */
+public class ReadOnlyCriteriaQueryTest extends AbstractReadOnlyTest {
+	
+	public ReadOnlyCriteriaQueryTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "readonly/Enrolment.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		super.configure( cfg );
+		cfg.setProperty( Environment.USE_QUERY_CACHE, "true" );
+		cfg.setProperty( Environment.CACHE_REGION_PREFIX, "criteriaquerytest" );
+		cfg.setProperty( Environment.USE_SECOND_LEVEL_CACHE, "true" );
+		cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
+	}
+	
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( ReadOnlyCriteriaQueryTest.class );
+	}
+
+	public void testModifiableSessionDefaultCriteria() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Course course = new Course();
+		course.setCourseCode("HIB");
+		course.setDescription("Hibernate Training");
+		s.persist(course);
+
+		Course coursePreferred = new Course();
+		coursePreferred.setCourseCode( "JBOSS" );
+		coursePreferred.setDescription( "JBoss" );
+		s.persist(  coursePreferred );
+
+		Student gavin = new Student();
+		gavin.setName("Gavin King");
+		gavin.setStudentNumber(232);
+		gavin.setPreferredCourse( coursePreferred );
+		s.persist(gavin);
+
+		Enrolment enrolment = new Enrolment();
+		enrolment.setCourse(course);
+		enrolment.setCourseCode(course.getCourseCode());
+		enrolment.setSemester((short) 3);
+		enrolment.setYear((short) 1998);
+		enrolment.setStudent(gavin);
+		enrolment.setStudentNumber(gavin.getStudentNumber());
+		gavin.getEnrolments().add( enrolment );
+		s.persist( enrolment );
+
+		t.commit();
+		s.close();
+
+		assertInsertCount( 4 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Criteria criteria = s.createCriteria( Student.class );
+		assertFalse( s.isDefaultReadOnly() );
+		assertFalse( criteria.isReadOnlyInitialized() );
+		assertFalse( criteria.isReadOnly() );
+		gavin = ( Student ) criteria.uniqueResult();
+		assertFalse( s.isDefaultReadOnly() );
+		assertFalse( criteria.isReadOnlyInitialized() );
+		assertFalse( criteria.isReadOnly() );
+		assertFalse( s.isReadOnly( gavin ) );
+		assertFalse( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+		checkProxyReadOnly( s, gavin.getPreferredCourse(), false );
+		assertFalse( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+		Hibernate.initialize( gavin.getPreferredCourse() );
+		assertTrue( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+		checkProxyReadOnly( s, gavin.getPreferredCourse(), false );
+		assertFalse( Hibernate.isInitialized( gavin.getEnrolments() ) );
+		Hibernate.initialize( gavin.getEnrolments() );
+		assertTrue( Hibernate.isInitialized( gavin.getEnrolments() ) );
+		assertEquals( 1, gavin.getEnrolments().size() );
+		enrolment = ( Enrolment ) gavin.getEnrolments().iterator().next();
+		assertFalse( s.isReadOnly( enrolment ) );
+		assertFalse( Hibernate.isInitialized( enrolment.getCourse() ) );
+		checkProxyReadOnly( s, enrolment.getCourse(), false );
+		Hibernate.initialize( enrolment.getCourse() );
+		checkProxyReadOnly( s, enrolment.getCourse(), false );
+		s.delete(gavin.getPreferredCourse());
+		s.delete(gavin);
+		s.delete( enrolment.getCourse() );
+		s.delete(enrolment);
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 1 );
+		assertDeleteCount( 4 );
+	}
+
+	public void testModifiableSessionReadOnlyCriteria() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Course course = new Course();
+		course.setCourseCode("HIB");
+		course.setDescription("Hibernate Training");
+		s.persist(course);
+
+		Course coursePreferred = new Course();
+		coursePreferred.setCourseCode( "JBOSS" );
+		coursePreferred.setDescription( "JBoss" );
+		s.persist(  coursePreferred );
+
+		Student gavin = new Student();
+		gavin.setName("Gavin King");
+		gavin.setStudentNumber(232);
+		gavin.setPreferredCourse( coursePreferred );
+		s.persist(gavin);
+
+		Enrolment enrolment = new Enrolment();
+		enrolment.setCourse(course);
+		enrolment.setCourseCode(course.getCourseCode());
+		enrolment.setSemester((short) 3);
+		enrolment.setYear((short) 1998);
+		enrolment.setStudent(gavin);
+		enrolment.setStudentNumber(gavin.getStudentNumber());
+		gavin.getEnrolments().add( enrolment );
+		s.persist( enrolment );
+
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Criteria criteria = s.createCriteria( Student.class ).setReadOnly( true );
+		assertFalse( s.isDefaultReadOnly() );
+		assertTrue( criteria.isReadOnlyInitialized() );
+		assertTrue( criteria.isReadOnly() );
+		gavin = ( Student ) criteria.uniqueResult();
+		assertFalse( s.isDefaultReadOnly() );
+		assertTrue( criteria.isReadOnlyInitialized() );
+		assertTrue( criteria.isReadOnly() );
+		assertTrue( s.isReadOnly( gavin ) );
+		assertFalse( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+		checkProxyReadOnly( s, gavin.getPreferredCourse(), true );
+		assertFalse( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+		Hibernate.initialize( gavin.getPreferredCourse() );
+		assertTrue( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+		checkProxyReadOnly( s, gavin.getPreferredCourse(), true );
+		assertFalse( Hibernate.isInitialized( gavin.getEnrolments() ) );
+		Hibernate.initialize( gavin.getEnrolments() );
+		assertTrue( Hibernate.isInitialized( gavin.getEnrolments() ) );
+		assertEquals( 1, gavin.getEnrolments().size() );
+		enrolment = ( Enrolment ) gavin.getEnrolments().iterator().next();
+		assertFalse( s.isReadOnly( enrolment ) );
+		assertFalse( Hibernate.isInitialized( enrolment.getCourse() ) );
+		checkProxyReadOnly( s, enrolment.getCourse(), false );
+		Hibernate.initialize( enrolment.getCourse() );
+		checkProxyReadOnly( s, enrolment.getCourse(), false );
+		s.delete(gavin.getPreferredCourse());
+		s.delete(gavin);
+		s.delete( enrolment.getCourse() );
+		s.delete(enrolment);
+		t.commit();
+		s.close();
+	}
+
+	public void testModifiableSessionModifiableCriteria() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Course course = new Course();
+		course.setCourseCode("HIB");
+		course.setDescription("Hibernate Training");
+		s.persist(course);
+
+		Course coursePreferred = new Course();
+		coursePreferred.setCourseCode( "JBOSS" );
+		coursePreferred.setDescription( "JBoss" );
+		s.persist(  coursePreferred );
+
+		Student gavin = new Student();
+		gavin.setName("Gavin King");
+		gavin.setStudentNumber(232);
+		gavin.setPreferredCourse( coursePreferred );
+		s.persist(gavin);
+
+		Enrolment enrolment = new Enrolment();
+		enrolment.setCourse(course);
+		enrolment.setCourseCode(course.getCourseCode());
+		enrolment.setSemester((short) 3);
+		enrolment.setYear((short) 1998);
+		enrolment.setStudent(gavin);
+		enrolment.setStudentNumber(gavin.getStudentNumber());
+		gavin.getEnrolments().add( enrolment );
+		s.persist( enrolment );
+
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Criteria criteria = s.createCriteria( Student.class );
+		assertFalse( s.isDefaultReadOnly() );
+		assertFalse( criteria.isReadOnlyInitialized() );
+		assertFalse( criteria.isReadOnly() );
+		criteria.setReadOnly( false );
+		assertTrue( criteria.isReadOnlyInitialized() );
+		assertFalse( criteria.isReadOnly() );
+		gavin = ( Student ) criteria.uniqueResult();
+		assertFalse( s.isDefaultReadOnly() );
+		assertTrue( criteria.isReadOnlyInitialized() );
+		assertFalse( criteria.isReadOnly() );
+		assertFalse( s.isReadOnly( gavin ) );
+		assertFalse( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+		checkProxyReadOnly( s, gavin.getPreferredCourse(), false );
+		assertFalse( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+		Hibernate.initialize( gavin.getPreferredCourse() );
+		assertTrue( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+		checkProxyReadOnly( s, gavin.getPreferredCourse(), false );
+		assertFalse( Hibernate.isInitialized( gavin.getEnrolments() ) );
+		Hibernate.initialize( gavin.getEnrolments() );
+		assertTrue( Hibernate.isInitialized( gavin.getEnrolments() ) );
+		assertEquals( 1, gavin.getEnrolments().size() );
+		enrolment = ( Enrolment ) gavin.getEnrolments().iterator().next();
+		assertFalse( s.isReadOnly( enrolment ) );
+		assertFalse( Hibernate.isInitialized( enrolment.getCourse() ) );
+		checkProxyReadOnly( s, enrolment.getCourse(), false );
+		Hibernate.initialize( enrolment.getCourse() );
+		checkProxyReadOnly( s, enrolment.getCourse(), false );
+		s.delete(gavin.getPreferredCourse());
+		s.delete(gavin);
+		s.delete( enrolment.getCourse() );
+		s.delete(enrolment);
+		t.commit();
+		s.close();
+	}
+
+	public void testReadOnlySessionDefaultCriteria() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Course course = new Course();
+		course.setCourseCode("HIB");
+		course.setDescription("Hibernate Training");
+		s.persist(course);
+
+		Course coursePreferred = new Course();
+		coursePreferred.setCourseCode( "JBOSS" );
+		coursePreferred.setDescription( "JBoss" );
+		s.persist(  coursePreferred );
+
+		Student gavin = new Student();
+		gavin.setName("Gavin King");
+		gavin.setStudentNumber(232);
+		gavin.setPreferredCourse( coursePreferred );
+		s.persist(gavin);
+
+		Enrolment enrolment = new Enrolment();
+		enrolment.setCourse(course);
+		enrolment.setCourseCode(course.getCourseCode());
+		enrolment.setSemester((short) 3);
+		enrolment.setYear((short) 1998);
+		enrolment.setStudent(gavin);
+		enrolment.setStudentNumber(gavin.getStudentNumber());
+		gavin.getEnrolments().add( enrolment );
+		s.persist( enrolment );
+
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.setDefaultReadOnly( true );
+		Criteria criteria = s.createCriteria( Student.class );
+		assertTrue( s.isDefaultReadOnly() );
+		assertFalse( criteria.isReadOnlyInitialized() );
+		assertTrue( criteria.isReadOnly() );
+		gavin = ( Student ) criteria.uniqueResult();
+		assertTrue( s.isDefaultReadOnly() );
+		assertFalse( criteria.isReadOnlyInitialized() );
+		assertTrue( criteria.isReadOnly() );
+		assertTrue( s.isReadOnly( gavin ) );
+		assertFalse( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+		checkProxyReadOnly( s, gavin.getPreferredCourse(), true );
+		assertFalse( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+		Hibernate.initialize( gavin.getPreferredCourse() );
+		assertTrue( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+		checkProxyReadOnly( s, gavin.getPreferredCourse(), true );
+		assertFalse( Hibernate.isInitialized( gavin.getEnrolments() ) );
+		Hibernate.initialize( gavin.getEnrolments() );
+		assertTrue( Hibernate.isInitialized( gavin.getEnrolments() ) );
+		assertEquals( 1, gavin.getEnrolments().size() );
+		enrolment = ( Enrolment ) gavin.getEnrolments().iterator().next();
+		assertTrue( s.isReadOnly( enrolment ) );
+		assertFalse( Hibernate.isInitialized( enrolment.getCourse() ) );
+		checkProxyReadOnly( s, enrolment.getCourse(), true );
+		Hibernate.initialize( enrolment.getCourse() );
+		checkProxyReadOnly( s, enrolment.getCourse(), true );
+		s.delete(gavin.getPreferredCourse());
+		s.delete(gavin);
+		s.delete( enrolment.getCourse() );
+		s.delete(enrolment);
+		t.commit();
+		s.close();
+	}
+
+	public void testReadOnlySessionReadOnlyCriteria() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Course course = new Course();
+		course.setCourseCode("HIB");
+		course.setDescription("Hibernate Training");
+		s.persist(course);
+
+		Course coursePreferred = new Course();
+		coursePreferred.setCourseCode( "JBOSS" );
+		coursePreferred.setDescription( "JBoss" );
+		s.persist(  coursePreferred );
+
+		Student gavin = new Student();
+		gavin.setName("Gavin King");
+		gavin.setStudentNumber(232);
+		gavin.setPreferredCourse( coursePreferred );
+		s.persist(gavin);
+
+		Enrolment enrolment = new Enrolment();
+		enrolment.setCourse(course);
+		enrolment.setCourseCode(course.getCourseCode());
+		enrolment.setSemester((short) 3);
+		enrolment.setYear((short) 1998);
+		enrolment.setStudent(gavin);
+		enrolment.setStudentNumber(gavin.getStudentNumber());
+		gavin.getEnrolments().add( enrolment );
+		s.persist( enrolment );
+
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.setDefaultReadOnly( true );
+		Criteria criteria = s.createCriteria( Student.class );
+		assertTrue( s.isDefaultReadOnly() );
+		assertFalse( criteria.isReadOnlyInitialized() );
+		assertTrue( criteria.isReadOnly() );
+		criteria.setReadOnly( true );
+		assertTrue( criteria.isReadOnlyInitialized() );
+		assertTrue( criteria.isReadOnly() );
+		gavin = ( Student ) criteria.uniqueResult();
+		assertTrue( s.isDefaultReadOnly() );
+		assertTrue( criteria.isReadOnlyInitialized() );
+		assertTrue( criteria.isReadOnly() );
+		assertTrue( s.isReadOnly( gavin ) );
+		assertFalse( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+		checkProxyReadOnly( s, gavin.getPreferredCourse(), true );
+		assertFalse( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+		Hibernate.initialize( gavin.getPreferredCourse() );
+		assertTrue( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+		checkProxyReadOnly( s, gavin.getPreferredCourse(), true );
+		assertFalse( Hibernate.isInitialized( gavin.getEnrolments() ) );
+		Hibernate.initialize( gavin.getEnrolments() );
+		assertTrue( Hibernate.isInitialized( gavin.getEnrolments() ) );
+		assertEquals( 1, gavin.getEnrolments().size() );
+		enrolment = ( Enrolment ) gavin.getEnrolments().iterator().next();
+		assertTrue( s.isReadOnly( enrolment ) );
+		assertFalse( Hibernate.isInitialized( enrolment.getCourse() ) );
+		checkProxyReadOnly( s, enrolment.getCourse(), true );
+		Hibernate.initialize( enrolment.getCourse() );
+		checkProxyReadOnly( s, enrolment.getCourse(), true );
+		s.delete(gavin.getPreferredCourse());
+		s.delete(gavin);
+		s.delete( enrolment.getCourse() );
+		s.delete(enrolment);
+		t.commit();
+		s.close();
+	}
+
+	public void testReadOnlySessionModifiableCriteria() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Course course = new Course();
+		course.setCourseCode("HIB");
+		course.setDescription("Hibernate Training");
+		s.persist(course);
+
+		Course coursePreferred = new Course();
+		coursePreferred.setCourseCode( "JBOSS" );
+		coursePreferred.setDescription( "JBoss" );
+		s.persist(  coursePreferred );
+
+		Student gavin = new Student();
+		gavin.setName("Gavin King");
+		gavin.setStudentNumber(232);
+		gavin.setPreferredCourse( coursePreferred );
+		s.persist(gavin);
+
+		Enrolment enrolment = new Enrolment();
+		enrolment.setCourse(course);
+		enrolment.setCourseCode(course.getCourseCode());
+		enrolment.setSemester((short) 3);
+		enrolment.setYear((short) 1998);
+		enrolment.setStudent(gavin);
+		enrolment.setStudentNumber(gavin.getStudentNumber());
+		gavin.getEnrolments().add( enrolment );
+		s.persist( enrolment );
+
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.setDefaultReadOnly( true );
+		Criteria criteria = s.createCriteria( Student.class );
+		assertTrue( s.isDefaultReadOnly() );
+		assertFalse( criteria.isReadOnlyInitialized() );
+		assertTrue( criteria.isReadOnly() );
+		criteria.setReadOnly( false );
+		assertTrue( criteria.isReadOnlyInitialized() );
+		assertFalse( criteria.isReadOnly() );
+		gavin = ( Student ) criteria.uniqueResult();
+		assertTrue( s.isDefaultReadOnly() );
+		assertTrue( criteria.isReadOnlyInitialized() );
+		assertFalse( criteria.isReadOnly() );
+		assertFalse( s.isReadOnly( gavin ) );
+		assertFalse( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+		checkProxyReadOnly( s, gavin.getPreferredCourse(), false );
+		assertFalse( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+		Hibernate.initialize( gavin.getPreferredCourse() );
+		assertTrue( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+		checkProxyReadOnly( s, gavin.getPreferredCourse(), false);
+		assertFalse( Hibernate.isInitialized( gavin.getEnrolments() ) );
+		Hibernate.initialize( gavin.getEnrolments() );
+		assertTrue( Hibernate.isInitialized( gavin.getEnrolments() ) );
+		assertEquals( 1, gavin.getEnrolments().size() );
+		enrolment = ( Enrolment ) gavin.getEnrolments().iterator().next();
+		assertTrue( s.isReadOnly( enrolment ) );
+		assertFalse( Hibernate.isInitialized( enrolment.getCourse() ) );
+		checkProxyReadOnly( s, enrolment.getCourse(), true );
+		Hibernate.initialize( enrolment.getCourse() );
+		checkProxyReadOnly( s, enrolment.getCourse(), true );
+		s.delete(gavin.getPreferredCourse());
+		s.delete(gavin);
+		s.delete( enrolment.getCourse() );
+		s.delete(enrolment);
+		t.commit();
+		s.close();
+	}
+
+	public void testReadOnlyCriteriaReturnsModifiableExistingEntity() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Course course = new Course();
+		course.setCourseCode("HIB");
+		course.setDescription("Hibernate Training");
+		s.persist(course);
+
+		Course coursePreferred = new Course();
+		coursePreferred.setCourseCode( "JBOSS" );
+		coursePreferred.setDescription( "JBoss" );
+		s.persist(  coursePreferred );
+
+		Student gavin = new Student();
+		gavin.setName("Gavin King");
+		gavin.setStudentNumber(232);
+		gavin.setPreferredCourse( coursePreferred );
+		s.persist(gavin);
+
+		Enrolment enrolment = new Enrolment();
+		enrolment.setCourse(course);
+		enrolment.setCourseCode(course.getCourseCode());
+		enrolment.setSemester((short) 3);
+		enrolment.setYear((short) 1998);
+		enrolment.setStudent(gavin);
+		enrolment.setStudentNumber(gavin.getStudentNumber());
+		gavin.getEnrolments().add( enrolment );
+		s.persist( enrolment );
+
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		assertFalse( s.isDefaultReadOnly() );
+		coursePreferred = ( Course ) s.get( Course.class, coursePreferred.getCourseCode() );
+		assertFalse( s.isReadOnly( coursePreferred ) );
+		Criteria criteria = s.createCriteria( Student.class ).setReadOnly( true );
+		assertTrue( criteria.isReadOnlyInitialized() );
+		assertTrue( criteria.isReadOnly() );
+		gavin = ( Student ) criteria.uniqueResult();
+		assertFalse( s.isDefaultReadOnly() );
+		assertTrue( criteria.isReadOnlyInitialized() );
+		assertTrue( criteria.isReadOnly() );
+		assertTrue( s.isReadOnly( gavin ) );
+		assertFalse( s.isReadOnly( coursePreferred ) );
+		assertFalse( Hibernate.isInitialized( gavin.getEnrolments() ) );
+		Hibernate.initialize( gavin.getEnrolments() );
+		assertTrue( Hibernate.isInitialized( gavin.getEnrolments() ) );
+		assertEquals( 1, gavin.getEnrolments().size() );
+		enrolment = ( Enrolment ) gavin.getEnrolments().iterator().next();
+		assertFalse( s.isReadOnly( enrolment ) );
+		assertFalse( Hibernate.isInitialized( enrolment.getCourse() ) );
+		checkProxyReadOnly( s, enrolment.getCourse(), false );
+		Hibernate.initialize( enrolment.getCourse() );
+		checkProxyReadOnly( s, enrolment.getCourse(), false );
+		s.delete(gavin.getPreferredCourse());
+		s.delete(gavin);
+		s.delete( enrolment.getCourse() );
+		s.delete(enrolment);
+		t.commit();
+		s.close();
+	}
+
+	public void testReadOnlyCriteriaReturnsExistingModifiableProxyNotInit() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Course course = new Course();
+		course.setCourseCode("HIB");
+		course.setDescription("Hibernate Training");
+		s.persist(course);
+
+		Course coursePreferred = new Course();
+		coursePreferred.setCourseCode( "JBOSS" );
+		coursePreferred.setDescription( "JBoss" );
+		s.persist(  coursePreferred );
+
+		Student gavin = new Student();
+		gavin.setName("Gavin King");
+		gavin.setStudentNumber(232);
+		gavin.setPreferredCourse( coursePreferred );
+		s.persist(gavin);
+
+		Enrolment enrolment = new Enrolment();
+		enrolment.setCourse(course);
+		enrolment.setCourseCode(course.getCourseCode());
+		enrolment.setSemester((short) 3);
+		enrolment.setYear((short) 1998);
+		enrolment.setStudent(gavin);
+		enrolment.setStudentNumber(gavin.getStudentNumber());
+		gavin.getEnrolments().add( enrolment );
+		s.persist( enrolment );
+
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		assertFalse( s.isDefaultReadOnly() );
+		coursePreferred = ( Course ) s.load( Course.class, coursePreferred.getCourseCode() );
+		assertFalse( Hibernate.isInitialized( coursePreferred ) );
+		checkProxyReadOnly( s, coursePreferred, false );
+		Criteria criteria = s.createCriteria( Student.class ).setReadOnly( true );
+		assertTrue( criteria.isReadOnlyInitialized() );
+		assertTrue( criteria.isReadOnly() );
+		gavin = ( Student ) criteria.uniqueResult();
+		assertFalse( s.isDefaultReadOnly() );
+		assertTrue( criteria.isReadOnlyInitialized() );
+		assertTrue( criteria.isReadOnly() );
+		assertTrue( s.isReadOnly( gavin ) );
+		assertFalse( Hibernate.isInitialized( coursePreferred ) );
+		checkProxyReadOnly( s, coursePreferred, false );
+		Hibernate.initialize( coursePreferred );
+		checkProxyReadOnly( s, coursePreferred, false );		
+		assertFalse( Hibernate.isInitialized( gavin.getEnrolments() ) );
+		Hibernate.initialize( gavin.getEnrolments() );
+		assertTrue( Hibernate.isInitialized( gavin.getEnrolments() ) );
+		assertEquals( 1, gavin.getEnrolments().size() );
+		enrolment = ( Enrolment ) gavin.getEnrolments().iterator().next();
+		assertFalse( s.isReadOnly( enrolment ) );
+		assertFalse( Hibernate.isInitialized( enrolment.getCourse() ) );
+		checkProxyReadOnly( s, enrolment.getCourse(), false );
+		Hibernate.initialize( enrolment.getCourse() );
+		checkProxyReadOnly( s, enrolment.getCourse(), false );
+		s.delete(gavin.getPreferredCourse());
+		s.delete(gavin);
+		s.delete( enrolment.getCourse() );
+		s.delete(enrolment);
+		t.commit();
+		s.close();
+	}
+
+	public void testReadOnlyCriteriaReturnsExistingModifiableProxyInit() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Course course = new Course();
+		course.setCourseCode("HIB");
+		course.setDescription("Hibernate Training");
+		s.persist(course);
+
+		Course coursePreferred = new Course();
+		coursePreferred.setCourseCode( "JBOSS" );
+		coursePreferred.setDescription( "JBoss" );
+		s.persist(  coursePreferred );
+
+		Student gavin = new Student();
+		gavin.setName("Gavin King");
+		gavin.setStudentNumber(232);
+		gavin.setPreferredCourse( coursePreferred );
+		s.persist(gavin);
+
+		Enrolment enrolment = new Enrolment();
+		enrolment.setCourse(course);
+		enrolment.setCourseCode(course.getCourseCode());
+		enrolment.setSemester((short) 3);
+		enrolment.setYear((short) 1998);
+		enrolment.setStudent(gavin);
+		enrolment.setStudentNumber(gavin.getStudentNumber());
+		gavin.getEnrolments().add( enrolment );
+		s.persist( enrolment );
+
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		assertFalse( s.isDefaultReadOnly() );
+		coursePreferred = ( Course ) s.load( Course.class, coursePreferred.getCourseCode() );
+		assertFalse( Hibernate.isInitialized( coursePreferred ) );
+		checkProxyReadOnly( s, coursePreferred, false );
+		Hibernate.initialize( coursePreferred );
+		checkProxyReadOnly( s, coursePreferred, false );
+		Criteria criteria = s.createCriteria( Student.class ).setReadOnly( true );
+		assertTrue( criteria.isReadOnlyInitialized() );
+		assertTrue( criteria.isReadOnly() );
+		gavin = ( Student ) criteria.uniqueResult();
+		assertFalse( s.isDefaultReadOnly() );
+		assertTrue( criteria.isReadOnlyInitialized() );
+		assertTrue( criteria.isReadOnly() );
+		assertTrue( s.isReadOnly( gavin ) );
+		assertTrue( Hibernate.isInitialized( coursePreferred ) );
+		checkProxyReadOnly( s, coursePreferred, false );
+		assertFalse( Hibernate.isInitialized( gavin.getEnrolments() ) );
+		Hibernate.initialize( gavin.getEnrolments() );
+		assertTrue( Hibernate.isInitialized( gavin.getEnrolments() ) );
+		assertEquals( 1, gavin.getEnrolments().size() );
+		enrolment = ( Enrolment ) gavin.getEnrolments().iterator().next();
+		assertFalse( s.isReadOnly( enrolment ) );
+		assertFalse( Hibernate.isInitialized( enrolment.getCourse() ) );
+		checkProxyReadOnly( s, enrolment.getCourse(), false );
+		Hibernate.initialize( enrolment.getCourse() );
+		checkProxyReadOnly( s, enrolment.getCourse(), false );
+		s.delete(gavin.getPreferredCourse());
+		s.delete(gavin);
+		s.delete( enrolment.getCourse() );
+		s.delete(enrolment);
+		t.commit();
+		s.close();
+	}
+
+	public void testModifiableCriteriaReturnsExistingReadOnlyEntity() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Course course = new Course();
+		course.setCourseCode("HIB");
+		course.setDescription("Hibernate Training");
+		s.persist(course);
+
+		Course coursePreferred = new Course();
+		coursePreferred.setCourseCode( "JBOSS" );
+		coursePreferred.setDescription( "JBoss" );
+		s.persist(  coursePreferred );
+
+		Student gavin = new Student();
+		gavin.setName("Gavin King");
+		gavin.setStudentNumber(232);
+		gavin.setPreferredCourse( coursePreferred );
+		s.persist(gavin);
+
+		Enrolment enrolment = new Enrolment();
+		enrolment.setCourse(course);
+		enrolment.setCourseCode(course.getCourseCode());
+		enrolment.setSemester((short) 3);
+		enrolment.setYear((short) 1998);
+		enrolment.setStudent(gavin);
+		enrolment.setStudentNumber(gavin.getStudentNumber());
+		gavin.getEnrolments().add( enrolment );
+		s.persist( enrolment );
+
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		assertFalse( s.isDefaultReadOnly() );
+		coursePreferred = ( Course ) s.get( Course.class, coursePreferred.getCourseCode() );
+		assertFalse( s.isReadOnly( coursePreferred ) );
+		s.setReadOnly( coursePreferred, true );
+		Criteria criteria = s.createCriteria( Student.class ).setReadOnly( false );
+		assertTrue( criteria.isReadOnlyInitialized() );
+		assertFalse( criteria.isReadOnly() );
+		gavin = ( Student ) criteria.uniqueResult();
+		assertFalse( s.isDefaultReadOnly() );
+		assertTrue( criteria.isReadOnlyInitialized() );
+		assertFalse( criteria.isReadOnly() );
+		assertFalse( s.isReadOnly( gavin ) );
+		assertTrue( s.isReadOnly( coursePreferred ) );
+		assertFalse( Hibernate.isInitialized( gavin.getEnrolments() ) );
+		Hibernate.initialize( gavin.getEnrolments() );
+		assertTrue( Hibernate.isInitialized( gavin.getEnrolments() ) );
+		assertEquals( 1, gavin.getEnrolments().size() );
+		enrolment = ( Enrolment ) gavin.getEnrolments().iterator().next();
+		assertFalse( s.isReadOnly( enrolment ) );
+		assertFalse( Hibernate.isInitialized( enrolment.getCourse() ) );
+		checkProxyReadOnly( s, enrolment.getCourse(), false );
+		Hibernate.initialize( enrolment.getCourse() );
+		checkProxyReadOnly( s, enrolment.getCourse(), false );
+		s.delete(gavin.getPreferredCourse());
+		s.delete(gavin);
+		s.delete( enrolment.getCourse() );
+		s.delete(enrolment);
+		t.commit();
+		s.close();
+	}
+
+	public void testModifiableCriteriaReturnsExistingReadOnlyProxyNotInit() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Course course = new Course();
+		course.setCourseCode("HIB");
+		course.setDescription("Hibernate Training");
+		s.persist(course);
+
+		Course coursePreferred = new Course();
+		coursePreferred.setCourseCode( "JBOSS" );
+		coursePreferred.setDescription( "JBoss" );
+		s.persist(  coursePreferred );
+
+		Student gavin = new Student();
+		gavin.setName("Gavin King");
+		gavin.setStudentNumber(232);
+		gavin.setPreferredCourse( coursePreferred );
+		s.persist(gavin);
+
+		Enrolment enrolment = new Enrolment();
+		enrolment.setCourse(course);
+		enrolment.setCourseCode(course.getCourseCode());
+		enrolment.setSemester((short) 3);
+		enrolment.setYear((short) 1998);
+		enrolment.setStudent(gavin);
+		enrolment.setStudentNumber(gavin.getStudentNumber());
+		gavin.getEnrolments().add( enrolment );
+		s.persist( enrolment );
+
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		assertFalse( s.isDefaultReadOnly() );
+		coursePreferred = ( Course ) s.load( Course.class, coursePreferred.getCourseCode() );
+		assertFalse( Hibernate.isInitialized( coursePreferred ) );
+		checkProxyReadOnly( s, coursePreferred, false );
+		s.setReadOnly( coursePreferred, true );
+		checkProxyReadOnly( s, coursePreferred, true );
+		Criteria criteria = s.createCriteria( Student.class ).setReadOnly( false );
+		assertTrue( criteria.isReadOnlyInitialized() );
+		assertFalse( criteria.isReadOnly() );
+		gavin = ( Student ) criteria.uniqueResult();
+		assertFalse( s.isDefaultReadOnly() );
+		assertTrue( criteria.isReadOnlyInitialized() );
+		assertFalse( criteria.isReadOnly() );
+		assertFalse( s.isReadOnly( gavin ) );
+		assertFalse( Hibernate.isInitialized( coursePreferred ) );
+		checkProxyReadOnly( s, coursePreferred, true );
+		Hibernate.initialize( coursePreferred );
+		checkProxyReadOnly( s, coursePreferred, true );
+		assertFalse( Hibernate.isInitialized( gavin.getEnrolments() ) );
+		Hibernate.initialize( gavin.getEnrolments() );
+		assertTrue( Hibernate.isInitialized( gavin.getEnrolments() ) );
+		assertEquals( 1, gavin.getEnrolments().size() );
+		enrolment = ( Enrolment ) gavin.getEnrolments().iterator().next();
+		assertFalse( s.isReadOnly( enrolment ) );
+		assertFalse( Hibernate.isInitialized( enrolment.getCourse() ) );
+		checkProxyReadOnly( s, enrolment.getCourse(), false );
+		Hibernate.initialize( enrolment.getCourse() );
+		checkProxyReadOnly( s, enrolment.getCourse(), false );
+		s.delete(gavin.getPreferredCourse());
+		s.delete(gavin);
+		s.delete( enrolment.getCourse() );
+		s.delete(enrolment);
+		t.commit();
+		s.close();
+	}
+
+	public void testModifiableCriteriaReturnsExistingReadOnlyProxyInit() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Course course = new Course();
+		course.setCourseCode("HIB");
+		course.setDescription("Hibernate Training");
+		s.persist(course);
+
+		Course coursePreferred = new Course();
+		coursePreferred.setCourseCode( "JBOSS" );
+		coursePreferred.setDescription( "JBoss" );
+		s.persist(  coursePreferred );
+
+		Student gavin = new Student();
+		gavin.setName("Gavin King");
+		gavin.setStudentNumber(232);
+		gavin.setPreferredCourse( coursePreferred );
+		s.persist(gavin);
+
+		Enrolment enrolment = new Enrolment();
+		enrolment.setCourse(course);
+		enrolment.setCourseCode(course.getCourseCode());
+		enrolment.setSemester((short) 3);
+		enrolment.setYear((short) 1998);
+		enrolment.setStudent(gavin);
+		enrolment.setStudentNumber(gavin.getStudentNumber());
+		gavin.getEnrolments().add( enrolment );
+		s.persist( enrolment );
+
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		assertFalse( s.isDefaultReadOnly() );
+		coursePreferred = ( Course ) s.load( Course.class, coursePreferred.getCourseCode() );
+		assertFalse( Hibernate.isInitialized( coursePreferred ) );
+		checkProxyReadOnly( s, coursePreferred, false );
+		Hibernate.initialize( coursePreferred );
+		checkProxyReadOnly( s, coursePreferred, false );
+		s.setReadOnly( coursePreferred, true );
+		checkProxyReadOnly( s, coursePreferred, true );
+		Criteria criteria = s.createCriteria( Student.class ).setReadOnly( false );
+		assertTrue( criteria.isReadOnlyInitialized() );
+		assertFalse( criteria.isReadOnly() );
+		gavin = ( Student ) criteria.uniqueResult();
+		assertFalse( s.isDefaultReadOnly() );
+		assertTrue( criteria.isReadOnlyInitialized() );
+		assertFalse( criteria.isReadOnly() );
+		assertFalse( s.isReadOnly( gavin ) );
+		assertTrue( Hibernate.isInitialized( coursePreferred ) );
+		checkProxyReadOnly( s, coursePreferred, true );
+		assertFalse( Hibernate.isInitialized( gavin.getEnrolments() ) );
+		Hibernate.initialize( gavin.getEnrolments() );
+		assertTrue( Hibernate.isInitialized( gavin.getEnrolments() ) );
+		assertEquals( 1, gavin.getEnrolments().size() );
+		enrolment = ( Enrolment ) gavin.getEnrolments().iterator().next();
+		assertFalse( s.isReadOnly( enrolment ) );
+		assertFalse( Hibernate.isInitialized( enrolment.getCourse() ) );
+		checkProxyReadOnly( s, enrolment.getCourse(), false );
+		Hibernate.initialize( enrolment.getCourse() );
+		checkProxyReadOnly( s, enrolment.getCourse(), false );
+		s.delete(gavin.getPreferredCourse());
+		s.delete(gavin);
+		s.delete( enrolment.getCourse() );
+		s.delete(enrolment);
+		t.commit();
+		s.close();
+	}
+	
+	public void testScrollCriteria() {
+		Session session = openSession();
+		Transaction t = session.beginTransaction();
+
+		Course course = new Course();
+		course.setCourseCode("HIB");
+		course.setDescription("Hibernate Training");
+		session.persist(course);
+		session.flush();
+		session.clear();
+		ScrollableResults sr = session.createCriteria(Course.class).setReadOnly( true ).scroll();
+		assertTrue( sr.next() );
+		course = (Course) sr.get(0);
+		assertNotNull(course);
+		assertTrue( session.isReadOnly( course ) );
+		sr.close();
+		session.delete(course);
+		
+		t.commit();
+		session.close();
+		
+	}
+	
+	public void testSubselect() {
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Course course = new Course();
+		course.setCourseCode("HIB");
+		course.setDescription("Hibernate Training");
+		s.persist(course);
+		
+		Course coursePreferred = new Course();
+		coursePreferred.setCourseCode( "JBOSS" );
+		coursePreferred.setDescription( "JBoss" );
+		s.persist( coursePreferred );
+
+		Student gavin = new Student();
+		gavin.setName("Gavin King");
+		gavin.setStudentNumber(232);
+		gavin.setPreferredCourse( coursePreferred );
+		s.persist(gavin);
+
+		Enrolment enrolment = new Enrolment();
+		enrolment.setCourse(course);
+		enrolment.setCourseCode(course.getCourseCode());
+		enrolment.setSemester((short) 3);
+		enrolment.setYear((short) 1998);
+		enrolment.setStudent(gavin);
+		enrolment.setStudentNumber(gavin.getStudentNumber());
+		gavin.getEnrolments().add(enrolment);
+		s.persist(enrolment);
+
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		DetachedCriteria dc = DetachedCriteria.forClass(Student.class)
+			.add( Property.forName("studentNumber").eq( new Long(232) ) )
+			.setProjection( Property.forName("name") );
+		gavin = ( Student ) s.createCriteria(Student.class)
+			.add( Subqueries.exists(dc) )
+			.setReadOnly( true )
+			.uniqueResult();
+		assertFalse( s.isDefaultReadOnly() );
+		assertTrue( s.isReadOnly( gavin ) );
+		assertFalse( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+		checkProxyReadOnly( s, gavin.getPreferredCourse(), true );
+		assertFalse( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+		Hibernate.initialize( gavin.getPreferredCourse() );
+		assertTrue( Hibernate.isInitialized( gavin.getPreferredCourse() ) );
+		checkProxyReadOnly( s, gavin.getPreferredCourse(), true );
+		assertFalse( Hibernate.isInitialized( gavin.getEnrolments() ) );
+		Hibernate.initialize( gavin.getEnrolments() );
+		assertTrue( Hibernate.isInitialized( gavin.getEnrolments() ) );
+		assertEquals( 1, gavin.getEnrolments().size() );
+		enrolment = ( Enrolment ) gavin.getEnrolments().iterator().next();
+		assertFalse( s.isReadOnly( enrolment ) );
+		assertFalse( Hibernate.isInitialized( enrolment.getCourse() ) );
+		checkProxyReadOnly( s, enrolment.getCourse(), false );
+		Hibernate.initialize( enrolment.getCourse() );
+		checkProxyReadOnly( s, enrolment.getCourse(), false );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		DetachedCriteria dc2 = DetachedCriteria.forClass(Student.class, "st")
+			.add( Property.forName("st.studentNumber").eqProperty("e.studentNumber") )
+			.setProjection( Property.forName("name") );
+		enrolment = ( Enrolment ) s.createCriteria(Enrolment.class, "e")
+			.add( Subqueries.eq("Gavin King", dc2) )
+			.setReadOnly( true )
+			.uniqueResult();
+		assertTrue( s.isReadOnly( enrolment ) );
+		assertFalse( Hibernate.isInitialized( enrolment.getCourse() ) );
+		checkProxyReadOnly( s, enrolment.getCourse(), true );
+		Hibernate.initialize( enrolment.getCourse() );
+		assertTrue( Hibernate.isInitialized( enrolment.getCourse() ) );
+		checkProxyReadOnly( s, enrolment.getCourse(), true );
+		assertFalse( Hibernate.isInitialized( enrolment.getStudent() ) );
+		checkProxyReadOnly( s, enrolment.getStudent(), true );
+		Hibernate.initialize( enrolment.getStudent() );
+		assertTrue( Hibernate.isInitialized( enrolment.getStudent() ) );
+		checkProxyReadOnly( s, enrolment.getStudent(), true );
+		assertFalse( Hibernate.isInitialized( enrolment.getStudent().getPreferredCourse() ) );
+		checkProxyReadOnly( s, enrolment.getStudent().getPreferredCourse(), false );
+		Hibernate.initialize( enrolment.getStudent().getPreferredCourse() );
+		assertTrue( Hibernate.isInitialized( enrolment.getStudent().getPreferredCourse() ) );
+		checkProxyReadOnly( s, enrolment.getStudent().getPreferredCourse(), false );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		DetachedCriteria dc3 = DetachedCriteria.forClass(Student.class, "st")
+			.createCriteria("enrolments")
+				.createCriteria("course")
+					.add( Property.forName("description").eq("Hibernate Training") )
+					.setProjection( Property.forName("st.name") );
+		enrolment = ( Enrolment ) s.createCriteria(Enrolment.class, "e")
+			.add( Subqueries.eq("Gavin King", dc3) )
+			.setReadOnly( true )
+			.uniqueResult();
+		assertTrue( s.isReadOnly( enrolment ) );
+		assertFalse( Hibernate.isInitialized( enrolment.getCourse() ) );
+		checkProxyReadOnly( s, enrolment.getCourse(), true );
+		Hibernate.initialize( enrolment.getCourse() );
+		assertTrue( Hibernate.isInitialized( enrolment.getCourse() ) );
+		checkProxyReadOnly( s, enrolment.getCourse(), true );
+		assertFalse( Hibernate.isInitialized( enrolment.getStudent() ) );
+		checkProxyReadOnly( s, enrolment.getStudent(), true );
+		Hibernate.initialize( enrolment.getStudent() );
+		assertTrue( Hibernate.isInitialized( enrolment.getStudent() ) );
+		checkProxyReadOnly( s, enrolment.getStudent(), true );
+		assertFalse( Hibernate.isInitialized( enrolment.getStudent().getPreferredCourse() ) );
+		checkProxyReadOnly( s, enrolment.getStudent().getPreferredCourse(), false );
+		Hibernate.initialize( enrolment.getStudent().getPreferredCourse() );
+		assertTrue( Hibernate.isInitialized( enrolment.getStudent().getPreferredCourse() ) );
+		checkProxyReadOnly( s, enrolment.getStudent().getPreferredCourse(), false );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete(gavin.getPreferredCourse());
+		s.delete(gavin);
+		enrolment = ( Enrolment ) gavin.getEnrolments().iterator().next();
+		s.delete( enrolment.getCourse() );
+		s.delete(enrolment);
+		t.commit();
+		s.close();		
+	}
+	
+	public void testDetachedCriteria() {
+		
+		DetachedCriteria dc = DetachedCriteria.forClass(Student.class)
+			.add( Property.forName("name").eq("Gavin King") )
+			.addOrder( Order.asc("studentNumber") );
+		
+		byte[] bytes = SerializationHelper.serialize(dc);
+		
+		dc = (DetachedCriteria) SerializationHelper.deserialize(bytes);
+		
+		Session session = openSession();
+		Transaction t = session.beginTransaction();
+
+		Student gavin = new Student();
+		gavin.setName("Gavin King");
+		gavin.setStudentNumber(232);
+		Student bizarroGavin = new Student();
+		bizarroGavin.setName("Gavin King");
+		bizarroGavin.setStudentNumber(666);
+		session.persist(bizarroGavin);
+		session.persist(gavin);
+
+		t.commit();
+		session.close();
+
+		session = openSession();
+		t = session.beginTransaction();
+
+		List result = dc.getExecutableCriteria(session)
+			.setMaxResults(3)
+			.setReadOnly( true )
+			.list();
+
+		assertEquals( result.size(), 2 );
+		gavin = ( Student ) result.get( 0 );
+		bizarroGavin = ( Student ) result.get( 1 );
+		assertEquals( 232, gavin.getStudentNumber() );
+		assertEquals( 666, bizarroGavin.getStudentNumber() );
+		assertTrue( session.isReadOnly( gavin ) );
+		assertTrue( session.isReadOnly( bizarroGavin ) );
+
+		session.delete(gavin);
+		session.delete(bizarroGavin);
+		t.commit();
+		session.close();
+	}
+	
+		public void testTwoAliasesCache() {
+			Session s = openSession();
+			Transaction t = s.beginTransaction();
+			
+			Course course = new Course();
+			course.setCourseCode("HIB");
+			course.setDescription("Hibernate Training");
+			s.save(course);
+			
+			Student gavin = new Student();
+			gavin.setName("Gavin King");
+			gavin.setStudentNumber(666);
+			s.save(gavin);
+			
+			Student xam = new Student();
+			xam.setName("Max Rydahl Andersen");
+			xam.setStudentNumber(101);
+			s.save(xam);
+			
+			Enrolment enrolment1 = new Enrolment();
+			enrolment1.setCourse(course);
+			enrolment1.setCourseCode(course.getCourseCode());
+			enrolment1.setSemester((short) 1);
+			enrolment1.setYear((short) 1999);
+			enrolment1.setStudent(xam);
+			enrolment1.setStudentNumber(xam.getStudentNumber());
+			xam.getEnrolments().add(enrolment1);
+			s.save(enrolment1);
+			
+			Enrolment enrolment2 = new Enrolment();
+			enrolment2.setCourse(course);
+			enrolment2.setCourseCode(course.getCourseCode());
+			enrolment2.setSemester((short) 3);
+			enrolment2.setYear((short) 1998);
+			enrolment2.setStudent(gavin);
+			enrolment2.setStudentNumber(gavin.getStudentNumber());
+			gavin.getEnrolments().add(enrolment2);
+			s.save(enrolment2);
+			t.commit();
+			s.close();
+
+			s = openSession();
+			t = s.beginTransaction();
+			
+			List list = s.createCriteria(Enrolment.class)
+				.createAlias("student", "s")
+				.createAlias("course", "c")
+				.add( Restrictions.isNotEmpty("s.enrolments") )
+				.setCacheable(true)
+				.setReadOnly( true )
+				.list();
+			
+			assertEquals( list.size(), 2 );
+
+			Enrolment e = ( Enrolment ) list.get( 0 );
+			if ( e.getStudent().getStudentNumber() == xam.getStudentNumber() ) {
+				enrolment1 = e;
+				enrolment2 = ( Enrolment ) list.get( 1 );
+			}
+			else if ( e.getStudent().getStudentNumber() == xam.getStudentNumber() ) {
+				enrolment2 = e;
+				enrolment1 = ( Enrolment ) list.get( 1 );
+			}
+			else {
+				fail( "Enrolment has unknown student number: " + e.getStudent().getStudentNumber() );
+			}
+
+			assertTrue( s.isReadOnly( enrolment1 ) );
+			assertTrue( s.isReadOnly( enrolment2 ) );
+			assertTrue( s.isReadOnly( enrolment1.getCourse() ) );
+			assertTrue( s.isReadOnly( enrolment2.getCourse() ) );
+			assertSame( enrolment1.getCourse(), enrolment2.getCourse() );
+			assertTrue( s.isReadOnly( enrolment1.getStudent() ) );
+			assertTrue( s.isReadOnly( enrolment2.getStudent() ) );
+
+			t.commit();
+			s.close();
+	
+			s = openSession();
+			t = s.beginTransaction();
+			
+			list = s.createCriteria(Enrolment.class)
+				.createAlias("student", "s")
+				.createAlias("course", "c")
+				.setReadOnly( true )
+				.add( Restrictions.isNotEmpty("s.enrolments") )
+				.setCacheable(true)
+				.setReadOnly( true )
+				.list();
+		
+			assertEquals( list.size(), 2 );
+
+			e = ( Enrolment ) list.get( 0 );
+			if ( e.getStudent().getStudentNumber() == xam.getStudentNumber() ) {
+				enrolment1 = e;
+				enrolment2 = ( Enrolment ) list.get( 1 );
+			}
+			else if ( e.getStudent().getStudentNumber() == xam.getStudentNumber() ) {
+				enrolment2 = e;
+				enrolment1 = ( Enrolment ) list.get( 1 );
+			}
+			else {
+				fail( "Enrolment has unknown student number: " + e.getStudent().getStudentNumber() );
+			}
+
+			assertTrue( s.isReadOnly( enrolment1 ) );
+			assertTrue( s.isReadOnly( enrolment2 ) );
+			assertTrue( s.isReadOnly( enrolment1.getCourse() ) );
+			assertTrue( s.isReadOnly( enrolment2.getCourse() ) );
+			assertSame( enrolment1.getCourse(), enrolment2.getCourse() );
+			assertTrue( s.isReadOnly( enrolment1.getStudent() ) );
+			assertTrue( s.isReadOnly( enrolment2.getStudent() ) );
+
+			t.commit();
+			s.close();
+	
+			s = openSession();
+			t = s.beginTransaction();
+			
+			list = s.createCriteria(Enrolment.class)
+				.setReadOnly( true )
+				.createAlias("student", "s")
+				.createAlias("course", "c")
+				.add( Restrictions.isNotEmpty("s.enrolments") )
+				.setCacheable(true)
+				.list();
+			
+			assertEquals( list.size(), 2 );
+
+			e = ( Enrolment ) list.get( 0 );
+			if ( e.getStudent().getStudentNumber() == xam.getStudentNumber() ) {
+				enrolment1 = e;
+				enrolment2 = ( Enrolment ) list.get( 1 );
+			}
+			else if ( e.getStudent().getStudentNumber() == xam.getStudentNumber() ) {
+				enrolment2 = e;
+				enrolment1 = ( Enrolment ) list.get( 1 );
+			}
+			else {
+				fail( "Enrolment has unknown student number: " + e.getStudent().getStudentNumber() );
+			}
+
+			assertTrue( s.isReadOnly( enrolment1 ) );
+			assertTrue( s.isReadOnly( enrolment2 ) );
+			assertTrue( s.isReadOnly( enrolment1.getCourse() ) );
+			assertTrue( s.isReadOnly( enrolment2.getCourse() ) );
+			assertSame( enrolment1.getCourse(), enrolment2.getCourse() );
+			assertTrue( s.isReadOnly( enrolment1.getStudent() ) );
+			assertTrue( s.isReadOnly( enrolment2.getStudent() ) );
+
+			s.delete( enrolment1 );
+			s.delete( enrolment2 );
+			s.delete( enrolment1.getCourse() );
+			s.delete( enrolment1.getStudent() );
+			s.delete( enrolment2.getStudent() );
+		
+			t.commit();
+			s.close();
+	}
+
+	/*
+	public void testProjectionsUsingProperty() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		
+		Course course = new Course();
+		course.setCourseCode("HIB");
+		course.setDescription("Hibernate Training");
+		s.save(course);
+		
+		Student gavin = new Student();
+		gavin.setName("Gavin King");
+		gavin.setStudentNumber(667);
+		s.save(gavin);
+		
+		Student xam = new Student();
+		xam.setName("Max Rydahl Andersen");
+		xam.setStudentNumber(101);
+		s.save(xam);
+		
+		Enrolment enrolment = new Enrolment();
+		enrolment.setCourse(course);
+		enrolment.setCourseCode(course.getCourseCode());
+		enrolment.setSemester((short) 1);
+		enrolment.setYear((short) 1999);
+		enrolment.setStudent(xam);
+		enrolment.setStudentNumber(xam.getStudentNumber());
+		xam.getEnrolments().add(enrolment);
+		s.save(enrolment);
+		
+		enrolment = new Enrolment();
+		enrolment.setCourse(course);
+		enrolment.setCourseCode(course.getCourseCode());
+		enrolment.setSemester((short) 3);
+		enrolment.setYear((short) 1998);
+		enrolment.setStudent(gavin);
+		enrolment.setStudentNumber(gavin.getStudentNumber());
+		gavin.getEnrolments().add(enrolment);
+		s.save(enrolment);
+		
+		s.flush();
+		
+		Long count = (Long) s.createCriteria(Enrolment.class)
+			.setProjection( Property.forName("studentNumber").count().setDistinct() )
+			.uniqueResult();
+		assertEquals(count, new Long(2));
+		
+		Object object = s.createCriteria(Enrolment.class)
+			.setProjection( Projections.projectionList()
+					.add( Property.forName("studentNumber").count() )
+					.add( Property.forName("studentNumber").max() )
+					.add( Property.forName("studentNumber").min() )
+					.add( Property.forName("studentNumber").avg() )
+			)
+			.uniqueResult();
+		Object[] result = (Object[])object; 
+		
+		assertEquals(new Long(2),result[0]);
+		assertEquals(new Long(667),result[1]);
+		assertEquals(new Long(101),result[2]);
+		assertEquals(384.0, ( (Double) result[3] ).doubleValue(), 0.01);
+		
+		
+		s.createCriteria(Enrolment.class)
+		    .add( Property.forName("studentNumber").gt( new Long(665) ) )
+		    .add( Property.forName("studentNumber").lt( new Long(668) ) )
+		    .add( Property.forName("courseCode").like("HIB", MatchMode.START) )
+		    .add( Property.forName("year").eq( new Short( (short) 1999 ) ) )
+		    .addOrder( Property.forName("studentNumber").asc() )
+			.uniqueResult();
+	
+		List resultWithMaps = s.createCriteria(Enrolment.class)
+			.setProjection( Projections.projectionList()
+					.add( Property.forName("studentNumber").as("stNumber") )
+					.add( Property.forName("courseCode").as("cCode") )
+			)
+		    .add( Property.forName("studentNumber").gt( new Long(665) ) )
+		    .add( Property.forName("studentNumber").lt( new Long(668) ) )
+		    .addOrder( Property.forName("studentNumber").asc() )
+			.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP)
+			.list();
+		
+		assertEquals(1, resultWithMaps.size());
+		Map m1 = (Map) resultWithMaps.get(0);
+		
+		assertEquals(new Long(667), m1.get("stNumber"));
+		assertEquals(course.getCourseCode(), m1.get("cCode"));		
+
+		resultWithMaps = s.createCriteria(Enrolment.class)
+			.setProjection( Property.forName("studentNumber").as("stNumber") )
+		    .addOrder( Order.desc("stNumber") )
+			.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP)
+			.list();
+		
+		assertEquals(2, resultWithMaps.size());
+		Map m0 = (Map) resultWithMaps.get(0);
+		m1 = (Map) resultWithMaps.get(1);
+		
+		assertEquals(new Long(101), m1.get("stNumber"));
+		assertEquals(new Long(667), m0.get("stNumber"));
+
+	
+		List resultWithAliasedBean = s.createCriteria(Enrolment.class)
+			.createAlias("student", "st")
+			.createAlias("course", "co")
+			.setProjection( Projections.projectionList()
+					.add( Property.forName("st.name").as("studentName") )
+					.add( Property.forName("co.description").as("courseDescription") )
+			)
+			.addOrder( Order.desc("studentName") )
+			.setResultTransformer( Transformers.aliasToBean(StudentDTO.class) )
+			.list();
+		
+		assertEquals(2, resultWithAliasedBean.size());
+		
+		StudentDTO dto = (StudentDTO) resultWithAliasedBean.get(0);
+		assertNotNull(dto.getDescription());
+		assertNotNull(dto.getName());
+	
+		s.createCriteria(Student.class)
+			.add( Restrictions.like("name", "Gavin", MatchMode.START) )
+			.addOrder( Order.asc("name") )
+			.createCriteria("enrolments", "e")
+				.addOrder( Order.desc("year") )
+				.addOrder( Order.desc("semester") )
+			.createCriteria("course","c")
+				.addOrder( Order.asc("description") )
+				.setProjection( Projections.projectionList()
+					.add( Property.forName("this.name") )
+					.add( Property.forName("e.year") )
+					.add( Property.forName("e.semester") )
+					.add( Property.forName("c.courseCode") )
+					.add( Property.forName("c.description") )
+				)
+			.uniqueResult();
+			
+		Projection p1 = Projections.projectionList()
+			.add( Property.forName("studentNumber").count() )
+			.add( Property.forName("studentNumber").max() )
+			.add( Projections.rowCount() );
+		
+		Projection p2 = Projections.projectionList()
+			.add( Property.forName("studentNumber").min() )
+			.add( Property.forName("studentNumber").avg() )
+			.add( Projections.sqlProjection(
+					"1 as constOne, count(*) as countStar", 
+					new String[] { "constOne", "countStar" }, 
+					new Type[] { Hibernate.INTEGER, Hibernate.INTEGER }
+			) );
+	
+		Object[] array = (Object[]) s.createCriteria(Enrolment.class)
+			.setProjection( Projections.projectionList().add(p1).add(p2) )
+			.uniqueResult();
+		
+		assertEquals( array.length, 7 );
+		
+		List list = s.createCriteria(Enrolment.class)
+			.createAlias("student", "st")
+			.createAlias("course", "co")
+			.setProjection( Projections.projectionList()
+					.add( Property.forName("co.courseCode").group() )
+					.add( Property.forName("st.studentNumber").count().setDistinct() )
+					.add( Property.forName("year").group() )
+			)
+			.list();
+		
+		assertEquals( list.size(), 2 );
+		
+		s.delete(gavin);
+		s.delete(xam);
+		s.delete(course);
+		
+		t.commit();
+		s.close();
+	}
+
+	public void testRestrictionOnSubclassCollection() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		s.createCriteria( Reptile.class )
+				.add( Restrictions.isEmpty( "offspring" ) )
+				.list();
+
+		s.createCriteria( Reptile.class )
+				.add( Restrictions.isNotEmpty( "offspring" ) )
+				.list();
+
+		t.rollback();
+		s.close();
+	}
+
+	public void testClassProperty() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		// HQL: from Animal a where a.mother.class = Reptile
+		Criteria c = s.createCriteria(Animal.class,"a")
+			.createAlias("mother","m")
+			.add( Property.forName("m.class").eq(Reptile.class) );
+		c.list();
+		t.rollback();
+		s.close();
+	}
+
+	public void testProjectedId() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.createCriteria(Course.class).setProjection( Projections.property("courseCode") ).list();
+		s.createCriteria(Course.class).setProjection( Projections.id() ).list();
+		t.rollback();
+		s.close();
+	}
+
+	public void testSubcriteriaJoinTypes() {
+		Session session = openSession();
+		Transaction t = session.beginTransaction();
+
+		Course courseA = new Course();
+		courseA.setCourseCode("HIB-A");
+		courseA.setDescription("Hibernate Training A");
+		session.persist(courseA);
+
+		Course courseB = new Course();
+		courseB.setCourseCode("HIB-B");
+		courseB.setDescription("Hibernate Training B");
+		session.persist(courseB);
+
+		Student gavin = new Student();
+		gavin.setName("Gavin King");
+		gavin.setStudentNumber(232);
+		gavin.setPreferredCourse(courseA);
+		session.persist(gavin);
+
+		Student leonardo = new Student();
+		leonardo.setName("Leonardo Quijano");
+		leonardo.setStudentNumber(233);
+		leonardo.setPreferredCourse(courseB);
+		session.persist(leonardo);
+
+		Student johnDoe = new Student();
+		johnDoe.setName("John Doe");
+		johnDoe.setStudentNumber(235);
+		johnDoe.setPreferredCourse(null);
+		session.persist(johnDoe);
+
+		List result = session.createCriteria( Student.class )
+				.setProjection( Property.forName("preferredCourse.courseCode") )
+				.createCriteria( "preferredCourse", Criteria.LEFT_JOIN )
+						.addOrder( Order.asc( "courseCode" ) )
+						.list();
+		assertEquals( 3, result.size() );
+		// can't be sure of NULL comparison ordering aside from they should
+		// either come first or last
+		if ( result.get( 0 ) == null ) {
+			assertEquals( "HIB-A", result.get(1) );
+			assertEquals( "HIB-B", result.get(2) );
+		}
+		else {
+			assertNull( result.get(2) );
+			assertEquals( "HIB-A", result.get(0) );
+			assertEquals( "HIB-B", result.get(1) );
+		}
+
+		result = session.createCriteria( Student.class )
+				.setFetchMode( "preferredCourse", FetchMode.JOIN )
+				.createCriteria( "preferredCourse", Criteria.LEFT_JOIN )
+						.addOrder( Order.asc( "courseCode" ) )
+						.list();
+		assertEquals( 3, result.size() );
+		assertNotNull( result.get(0) );
+		assertNotNull( result.get(1) );
+		assertNotNull( result.get(2) );
+
+		result = session.createCriteria( Student.class )
+				.setFetchMode( "preferredCourse", FetchMode.JOIN )
+				.createAlias( "preferredCourse", "pc", Criteria.LEFT_JOIN )
+				.addOrder( Order.asc( "pc.courseCode" ) )
+				.list();
+		assertEquals( 3, result.size() );
+		assertNotNull( result.get(0) );
+		assertNotNull( result.get(1) );
+		assertNotNull( result.get(2) );
+
+		session.delete(gavin);
+		session.delete(leonardo);
+		session.delete(johnDoe);
+		session.delete(courseA);
+		session.delete(courseB);
+		t.commit();
+		session.close();
+	}
+	
+	public void testAliasJoinCriterion() {
+		Session session = openSession();
+		Transaction t = session.beginTransaction();
+
+		Course courseA = new Course();
+		courseA.setCourseCode("HIB-A");
+		courseA.setDescription("Hibernate Training A");
+		session.persist(courseA);
+
+		Course courseB = new Course();
+		courseB.setCourseCode("HIB-B");
+		courseB.setDescription("Hibernate Training B");
+		session.persist(courseB);
+
+		Student gavin = new Student();
+		gavin.setName("Gavin King");
+		gavin.setStudentNumber(232);
+		gavin.setPreferredCourse(courseA);
+		session.persist(gavin);
+
+		Student leonardo = new Student();
+		leonardo.setName("Leonardo Quijano");
+		leonardo.setStudentNumber(233);
+		leonardo.setPreferredCourse(courseB);
+		session.persist(leonardo);
+
+		Student johnDoe = new Student();
+		johnDoe.setName("John Doe");
+		johnDoe.setStudentNumber(235);
+		johnDoe.setPreferredCourse(null);
+		session.persist(johnDoe);
+
+		// test == on one value exists
+		List result = session.createCriteria( Student.class )
+			.createAlias( "preferredCourse", "pc", Criteria.LEFT_JOIN, Restrictions.eq("pc.courseCode", "HIB-A") )
+			.setProjection( Property.forName("pc.courseCode") )
+			.addOrder(Order.asc("pc.courseCode"))
+			.list();
+		
+		assertEquals( 3, result.size() );
+		
+		// can't be sure of NULL comparison ordering aside from they should
+		// either come first or last
+		if ( result.get( 0 ) == null ) {
+			assertNull(result.get(1));
+			assertEquals( "HIB-A", result.get(2) );
+		}
+		else {
+			assertNull( result.get(2) );
+			assertNull( result.get(1) );
+			assertEquals( "HIB-A", result.get(0) );
+		}
+		
+		// test == on non existent value
+		result = session.createCriteria( Student.class )
+		.createAlias( "preferredCourse", "pc", Criteria.LEFT_JOIN, Restrictions.eq("pc.courseCode", "HIB-R") )
+		.setProjection( Property.forName("pc.courseCode") )
+		.addOrder(Order.asc("pc.courseCode"))
+		.list();
+	
+		assertEquals( 3, result.size() );
+		assertNull( result.get(2) );
+		assertNull( result.get(1) );
+		assertNull(result.get(0) );
+		
+		// test != on one existing value
+		result = session.createCriteria( Student.class )
+		.createAlias( "preferredCourse", "pc", Criteria.LEFT_JOIN, Restrictions.ne("pc.courseCode", "HIB-A") )
+		.setProjection( Property.forName("pc.courseCode") )
+		.addOrder(Order.asc("pc.courseCode"))
+		.list();
+	
+		assertEquals( 3, result.size() );
+		// can't be sure of NULL comparison ordering aside from they should
+		// either come first or last
+		if ( result.get( 0 ) == null ) {
+			assertNull( result.get(1) );
+			assertEquals( "HIB-B", result.get(2) );
+		}
+		else {
+			assertEquals( "HIB-B", result.get(0) );
+			assertNull( result.get(1) );
+			assertNull( result.get(2) );
+		}
+
+		session.delete(gavin);
+		session.delete(leonardo);
+		session.delete(johnDoe);
+		session.delete(courseA);
+		session.delete(courseB);
+		t.commit();
+		session.close();
+	}
+	*/
+	
+	private void checkProxyReadOnly(Session s, Object proxy, boolean expectedReadOnly) {
+		assertTrue( proxy instanceof HibernateProxy );
+		LazyInitializer li = ( ( HibernateProxy ) proxy ).getHibernateLazyInitializer();
+		assertSame( s, li.getSession() );
+		assertEquals( expectedReadOnly, s.isReadOnly( proxy ) );
+		assertEquals( expectedReadOnly, li.isReadOnly() );
+		assertEquals( Hibernate.isInitialized( proxy ), ! li.isUninitialized() );
+		if ( Hibernate.isInitialized( proxy ) ) {
+			assertEquals( expectedReadOnly, s.isReadOnly( li.getImplementation() ) );
+		}
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/ReadOnlyCriteriaQueryTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/ReadOnlyProxyTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/ReadOnlyProxyTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/ReadOnlyProxyTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,1689 @@
+//$Id: ReadOnlyTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.readonly;
+
+import java.math.BigDecimal;
+
+import junit.framework.Test;
+
+import org.hibernate.CacheMode;
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.TransientObjectException;
+import org.hibernate.SessionException;
+import org.hibernate.UnresolvableObjectException;
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.proxy.HibernateProxy;
+import org.hibernate.proxy.LazyInitializer;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Tests making initialized and uninitialized proxies read-only/modifiable
+ * 
+ * @author Gail Badner
+ */
+public class ReadOnlyProxyTest extends AbstractReadOnlyTest {
+
+	public ReadOnlyProxyTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "readonly/DataPoint.hbm.xml", "readonly/TextHolder.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( ReadOnlyProxyTest.class );
+	}
+
+	public void testReadOnlyViaSessionDoesNotInit() {
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		checkReadOnly( s, dp, false );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		s.setReadOnly( dp, true );
+		checkReadOnly( s, dp, true );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		s.setReadOnly( dp, false );
+		checkReadOnly( s, dp, false );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		s.flush();
+		checkReadOnly( s, dp, false );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		s.getTransaction().commit();
+		checkReadOnly( s, dp, false );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dpOrig.getId() );
+		assertEquals( dpOrig.getId(), dp.getId() );
+		assertEquals( dpOrig.getDescription(), dp.getDescription() );
+		assertEquals( dpOrig.getX(), dp.getX() );
+		assertEquals( dpOrig.getY(), dp.getY() );
+		s.delete( dp );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testReadOnlyViaLazyInitializerDoesNotInit() {
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		LazyInitializer dpLI = ( ( HibernateProxy ) dp ).getHibernateLazyInitializer();
+		checkReadOnly( s, dp, false );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		dpLI.setReadOnly( true );
+		checkReadOnly( s, dp, true );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		dpLI.setReadOnly( false );
+		checkReadOnly( s, dp, false );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		s.flush();
+		checkReadOnly( s, dp, false );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		s.getTransaction().commit();
+		checkReadOnly( s, dp, false );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dpOrig.getId() );
+		assertEquals( dpOrig.getId(), dp.getId() );
+		assertEquals( dpOrig.getDescription(), dp.getDescription() );
+		assertEquals( dpOrig.getX(), dp.getX() );
+		assertEquals( dpOrig.getY(), dp.getY() );
+		s.delete( dp );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testReadOnlyViaSessionNoChangeAfterInit() {
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		checkReadOnly( s, dp, false );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		Hibernate.initialize( dp );
+		assertTrue( Hibernate.isInitialized( dp ) );
+		checkReadOnly( s, dp, false );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.beginTransaction();
+		dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		s.setReadOnly( dp, true );
+		checkReadOnly( s, dp, true );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		Hibernate.initialize( dp );
+		assertTrue( Hibernate.isInitialized( dp ) );
+		checkReadOnly( s, dp, true );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.beginTransaction();
+		dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		s.setReadOnly( dp, true );
+		checkReadOnly( s, dp, true );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		s.setReadOnly( dp, false );
+		checkReadOnly( s, dp, false );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		Hibernate.initialize( dp );
+		assertTrue( Hibernate.isInitialized( dp ) );
+		checkReadOnly( s, dp, false );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dpOrig.getId() );
+		assertEquals( dpOrig.getId(), dp.getId() );
+		assertEquals( dpOrig.getDescription(), dp.getDescription() );
+		assertEquals( dpOrig.getX(), dp.getX() );
+		assertEquals( dpOrig.getY(), dp.getY() );
+		s.delete( dp );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testReadOnlyViaLazyInitializerNoChangeAfterInit() {
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		LazyInitializer dpLI = ( ( HibernateProxy ) dp ).getHibernateLazyInitializer();
+		checkReadOnly( s, dp, false );
+		assertTrue( dpLI.isUninitialized() );
+		Hibernate.initialize( dp );
+		assertFalse( dpLI.isUninitialized() );
+		checkReadOnly( s, dp, false );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.beginTransaction();
+		dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		dpLI = ( ( HibernateProxy ) dp ).getHibernateLazyInitializer();
+		dpLI.setReadOnly( true );
+		checkReadOnly( s, dp, true );
+		assertTrue( dpLI.isUninitialized() );
+		Hibernate.initialize( dp );
+		assertFalse( dpLI.isUninitialized() );
+		checkReadOnly( s, dp, true );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.beginTransaction();
+		dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		dpLI = ( ( HibernateProxy ) dp ).getHibernateLazyInitializer();
+		dpLI.setReadOnly( true );
+		checkReadOnly( s, dp, true );
+		assertTrue( dpLI.isUninitialized() );
+		dpLI.setReadOnly( false );
+		checkReadOnly( s, dp, false );
+		assertTrue( dpLI.isUninitialized() );
+		Hibernate.initialize( dp );
+		assertFalse( dpLI.isUninitialized() );
+		checkReadOnly( s, dp, false );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dpOrig.getId() );
+		assertEquals( dpOrig.getId(), dp.getId() );
+		assertEquals( dpOrig.getDescription(), dp.getDescription() );
+		assertEquals( dpOrig.getX(), dp.getX() );
+		assertEquals( dpOrig.getY(), dp.getY() );
+		s.delete( dp );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testReadOnlyViaSessionBeforeInit() {
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		s.setReadOnly( dp, true );
+		dp.setDescription( "changed" );
+		assertTrue( Hibernate.isInitialized( dp ) );
+		assertEquals( "changed", dp.getDescription() );
+		checkReadOnly( s, dp, true );
+		s.flush();
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dpOrig.getId() );
+		assertEquals( dpOrig.getId(), dp.getId() );
+		assertEquals( dpOrig.getDescription(), dp.getDescription() );
+		assertEquals( dpOrig.getX(), dp.getX() );
+		assertEquals( dpOrig.getY(), dp.getY() );
+		s.delete( dp );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testModifiableViaSessionBeforeInit() {
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		checkReadOnly( s, dp, false );
+		dp.setDescription( "changed" );
+		assertTrue( Hibernate.isInitialized( dp ) );
+		assertEquals( "changed", dp.getDescription() );
+		checkReadOnly( s, dp, false );
+		s.flush();
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dpOrig.getId() );
+		assertEquals( dpOrig.getId(), dp.getId() );
+		assertEquals( "changed", dp.getDescription() );
+		assertEquals( dpOrig.getX(), dp.getX() );
+		assertEquals( dpOrig.getY(), dp.getY() );
+		s.delete( dp );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testReadOnlyViaSessionBeforeInitByModifiableQuery() {
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		checkReadOnly( s, dp, false );
+		s.setReadOnly( dp, true );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		checkReadOnly( s, dp, true );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		DataPoint dpFromQuery = ( DataPoint ) s.createQuery( "from DataPoint where id=" + dpOrig.getId() ).setReadOnly( false ).uniqueResult();
+		assertTrue( Hibernate.isInitialized( dpFromQuery ) );
+		assertSame( dp, dpFromQuery );
+		checkReadOnly( s, dp, true );
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		s.flush();
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dpOrig.getId() );
+		assertEquals( dpOrig.getId(), dp.getId() );
+		assertEquals( dpOrig.getDescription(), dp.getDescription() );
+		assertEquals( dpOrig.getX(), dp.getX() );
+		assertEquals( dpOrig.getY(), dp.getY() );
+		s.delete( dp );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testReadOnlyViaSessionBeforeInitByReadOnlyQuery() {
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		checkReadOnly( s, dp, false );
+		s.setReadOnly( dp, true );
+		checkReadOnly( s, dp, true );
+		DataPoint dpFromQuery = ( DataPoint ) s.createQuery( "from DataPoint where id=" + dpOrig.getId() ).setReadOnly( true ).uniqueResult();
+		assertTrue( Hibernate.isInitialized( dpFromQuery ) );
+		assertSame( dp, dpFromQuery );
+		checkReadOnly( s, dp, true );
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		s.flush();
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dpOrig.getId() );
+		assertEquals( dpOrig.getId(), dp.getId() );
+		assertEquals( dpOrig.getDescription(), dp.getDescription() );
+		assertEquals( dpOrig.getX(), dp.getX() );
+		assertEquals( dpOrig.getY(), dp.getY() );
+		s.delete( dp );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testModifiableViaSessionBeforeInitByModifiableQuery() {
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		checkReadOnly( s, dp, false );
+		DataPoint dpFromQuery = ( DataPoint ) s.createQuery( "from DataPoint where id=" + dpOrig.getId() ).setReadOnly( false ).uniqueResult();
+		assertTrue( Hibernate.isInitialized( dpFromQuery ) );
+		assertSame( dp, dpFromQuery );
+		checkReadOnly( s, dp, false );
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		s.flush();
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dpOrig.getId() );
+		assertEquals( dpOrig.getId(), dp.getId() );
+		assertEquals( "changed", dp.getDescription() );
+		assertEquals( dpOrig.getX(), dp.getX() );
+		assertEquals( dpOrig.getY(), dp.getY() );
+		s.delete( dp );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testModifiableViaSessionBeforeInitByReadOnlyQuery() {
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		checkReadOnly( s, dp, false );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		DataPoint dpFromQuery = ( DataPoint ) s.createQuery( "from DataPoint where id=" + dpOrig.getId() ).setReadOnly( true ).uniqueResult();
+		assertTrue( Hibernate.isInitialized( dpFromQuery ) );
+		assertSame( dp, dpFromQuery );
+		checkReadOnly( s, dp, false );
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		s.flush();
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dpOrig.getId() );
+		assertEquals( dpOrig.getId(), dp.getId() );
+		assertEquals( "changed", dp.getDescription() );
+		assertEquals( dpOrig.getX(), dp.getX() );
+		assertEquals( dpOrig.getY(), dp.getY() );
+		s.delete( dp );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testReadOnlyViaLazyInitializerBeforeInit() {
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		LazyInitializer dpLI = ( ( HibernateProxy ) dp ).getHibernateLazyInitializer();
+		assertTrue( dpLI.isUninitialized() );
+		checkReadOnly( s, dp, false );
+		dpLI.setReadOnly( true );
+		checkReadOnly( s, dp, true );
+		dp.setDescription( "changed" );
+		assertFalse( dpLI.isUninitialized() );
+		assertEquals( "changed", dp.getDescription() );
+		checkReadOnly( s, dp, true );
+		s.flush();
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dpOrig.getId() );
+		assertEquals( dpOrig.getId(), dp.getId() );
+		assertEquals( dpOrig.getDescription(), dp.getDescription() );
+		assertEquals( dpOrig.getX(), dp.getX() );
+		assertEquals( dpOrig.getY(), dp.getY() );
+		s.delete( dp );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testModifiableViaLazyInitializerBeforeInit() {
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		LazyInitializer dpLI = ( ( HibernateProxy ) dp ).getHibernateLazyInitializer();
+		assertTrue( dp instanceof HibernateProxy );
+		assertTrue( dpLI.isUninitialized() );
+		checkReadOnly( s, dp, false );
+		dp.setDescription( "changed" );
+		assertFalse( dpLI.isUninitialized() );
+		assertEquals( "changed", dp.getDescription() );
+		checkReadOnly( s, dp, false );
+		s.flush();
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dpOrig.getId() );
+		assertEquals( dpOrig.getId(), dp.getId() );
+		assertEquals( "changed", dp.getDescription() );
+		assertEquals( dpOrig.getX(), dp.getX() );
+		assertEquals( dpOrig.getY(), dp.getY() );
+		s.delete( dp );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+
+	public void testReadOnlyViaLazyInitializerAfterInit() {
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		LazyInitializer dpLI = ( ( HibernateProxy ) dp ).getHibernateLazyInitializer();
+		assertTrue( dpLI.isUninitialized() );
+		checkReadOnly( s, dp, false );
+		dp.setDescription( "changed" );
+		assertFalse( dpLI.isUninitialized() );
+		assertEquals( "changed", dp.getDescription() );
+		checkReadOnly( s, dp, false );
+		dpLI.setReadOnly( true );
+		checkReadOnly( s, dp, true );
+		s.flush();
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dpOrig.getId() );
+		assertEquals( dpOrig.getId(), dp.getId() );
+		assertEquals( dpOrig.getDescription(), dp.getDescription() );
+		assertEquals( dpOrig.getX(), dp.getX() );
+		assertEquals( dpOrig.getY(), dp.getY() );
+		s.delete( dp );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testModifiableViaLazyInitializerAfterInit() {
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		LazyInitializer dpLI = ( ( HibernateProxy ) dp ).getHibernateLazyInitializer();
+		assertTrue( dpLI.isUninitialized() );
+		checkReadOnly( s, dp, false );
+		dp.setDescription( "changed" );
+		assertFalse( dpLI.isUninitialized() );
+		assertEquals( "changed", dp.getDescription() );
+		checkReadOnly( s, dp, false );
+		s.flush();
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dpOrig.getId() );
+		assertEquals( dpOrig.getId(), dp.getId() );
+		assertEquals( "changed", dp.getDescription() );
+		assertEquals( dpOrig.getX(), dp.getX() );
+		assertEquals( dpOrig.getY(), dp.getY() );
+		s.delete( dp );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testModifyToReadOnlyToModifiableIsUpdatedFailureExpected() {
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		assertFalse( Hibernate.isInitialized( dp ));
+		checkReadOnly( s, dp, false );
+		dp.setDescription( "changed" );
+		assertTrue( Hibernate.isInitialized( dp ) );
+		assertEquals( "changed", dp.getDescription() );
+		s.setReadOnly( dp, true );
+		checkReadOnly( s, dp,true );
+		s.setReadOnly( dp, false );
+		checkReadOnly( s, dp, false );
+		assertEquals( "changed", dp.getDescription() );
+		s.flush();
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dpOrig.getId() );
+		assertEquals( dpOrig.getId(), dp.getId() );
+		assertEquals( dpOrig.getDescription(), dp.getDescription() );
+		assertEquals( dpOrig.getX(), dp.getX() );
+		assertEquals( dpOrig.getY(), dp.getY() );
+		try {
+			assertEquals( "changed", dp.getDescription() );
+			// should fail due to HHH-4642
+		}
+		finally {
+			s.getTransaction().rollback();
+			s.close();
+			s = openSession();
+			s.beginTransaction();			
+			s.delete( dp );
+			s.getTransaction().commit();
+			s.close();
+		}
+	}
+
+	public void testReadOnlyModifiedToModifiableIsUpdatedFailureExpected() {
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		assertFalse( Hibernate.isInitialized( dp ));
+		checkReadOnly( s, dp, false );
+		s.setReadOnly( dp, true );
+		checkReadOnly( s, dp,true );
+		dp.setDescription( "changed" );
+		assertTrue( Hibernate.isInitialized( dp ) );
+		assertEquals( "changed", dp.getDescription() );
+		s.setReadOnly( dp, false );
+		checkReadOnly( s, dp, false );
+		assertEquals( "changed", dp.getDescription() );
+		s.flush();
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dpOrig.getId() );
+		assertEquals( dpOrig.getId(), dp.getId() );
+		assertEquals( dpOrig.getDescription(), dp.getDescription() );
+		assertEquals( dpOrig.getX(), dp.getX() );
+		assertEquals( dpOrig.getY(), dp.getY() );
+		try {
+			assertEquals( "changed", dp.getDescription() );
+			// should fail due to HHH-4642
+		}
+		finally {
+			s.getTransaction().rollback();
+			s.close();
+			s = openSession();
+			s.beginTransaction();
+			s.delete( dp );
+			s.getTransaction().commit();
+			s.close();
+		}
+	}
+
+	public void testReadOnlyChangedEvictedUpdate() {
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		assertFalse( Hibernate.isInitialized( dp ));
+		checkReadOnly( s, dp, false );
+		s.setReadOnly( dp, true );
+		checkReadOnly( s, dp,true );
+		dp.setDescription( "changed" );
+		assertTrue( Hibernate.isInitialized( dp ) );
+		assertEquals( "changed", dp.getDescription() );
+		s.evict( dp );
+		assertFalse( s.contains( dp ) );
+		s.update( dp );
+		checkReadOnly( s, dp, false );
+		assertEquals( "changed", dp.getDescription() );
+		s.flush();
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dpOrig.getId() );
+		assertEquals( "changed", dp.getDescription() );
+		assertEquals( dpOrig.getId(), dp.getId() );
+		assertEquals( dpOrig.getX(), dp.getX() );
+		assertEquals( dpOrig.getY(), dp.getY() );
+		s.delete( dp );
+		s.getTransaction().commit();
+		s.close();
+	}	
+
+	public void testReadOnlyToModifiableInitWhenModifiedIsUpdated() {
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		checkReadOnly( s, dp, false );
+		s.setReadOnly( dp, true );
+		checkReadOnly( s, dp,true );
+		s.setReadOnly( dp, false );
+		checkReadOnly( s, dp, false );
+		assertFalse( Hibernate.isInitialized( dp ));
+		dp.setDescription( "changed" );
+		assertTrue( Hibernate.isInitialized( dp ) );
+		assertEquals( "changed", dp.getDescription() );
+		s.flush();
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dpOrig.getId() );
+		assertEquals( dpOrig.getId(), dp.getId() );
+		assertEquals( "changed", dp.getDescription() );
+		assertEquals( dpOrig.getX(), dp.getX() );
+		assertEquals( dpOrig.getY(), dp.getY() );
+		s.delete( dp );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testReadOnlyInitToModifiableModifiedIsUpdated() {
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		checkReadOnly( s, dp, false );
+		s.setReadOnly( dp, true );
+		checkReadOnly( s, dp,true );
+		assertFalse( Hibernate.isInitialized( dp ));
+		Hibernate.initialize( dp );
+		assertTrue( Hibernate.isInitialized( dp ));
+		checkReadOnly( s, dp,true );
+		s.setReadOnly( dp, false );
+		checkReadOnly( s, dp, false );
+		dp.setDescription( "changed" );
+		assertTrue( Hibernate.isInitialized( dp ) );
+		assertEquals( "changed", dp.getDescription() );
+		s.flush();
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dpOrig.getId() );
+		assertEquals( dpOrig.getId(), dp.getId() );
+		assertEquals( "changed", dp.getDescription() );
+		assertEquals( dpOrig.getX(), dp.getX() );
+		assertEquals( dpOrig.getY(), dp.getY() );
+		s.delete( dp );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testReadOnlyModifiedUpdate() {
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		checkReadOnly( s, dp, false );
+		s.setReadOnly( dp, true );
+		checkReadOnly( s, dp,true );
+		assertFalse( Hibernate.isInitialized( dp ));
+		dp.setDescription( "changed" );
+		assertTrue( Hibernate.isInitialized( dp ) );
+		assertEquals( "changed", dp.getDescription() );
+		checkReadOnly( s, dp,true );
+		s.update( dp );
+		s.flush();
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dpOrig.getId() );
+		assertEquals( dpOrig.getId(), dp.getId() );
+		assertEquals( dpOrig.getDescription(), dp.getDescription() );
+		assertEquals( dpOrig.getX(), dp.getX() );
+		assertEquals( dpOrig.getY(), dp.getY() );
+		s.delete( dp );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testReadOnlyDelete() {
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		checkReadOnly( s, dp, false );
+		s.setReadOnly( dp, true );
+		checkReadOnly( s, dp,true );
+		assertFalse( Hibernate.isInitialized( dp ));
+		s.delete( dp );
+		s.flush();
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dpOrig.getId() );
+		assertNull( dp );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testReadOnlyRefresh() {
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		Transaction t = s.beginTransaction();
+		DataPoint dp = new DataPoint();
+		dp.setDescription( "original" );
+		dp.setX( new BigDecimal(0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+		dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+		s.save(dp);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		t = s.beginTransaction();
+		dp = ( DataPoint ) s.load( DataPoint.class, dp.getId() );
+		s.setReadOnly( dp, true );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		s.refresh( dp );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		assertEquals( "original", dp.getDescription() );
+		assertTrue( Hibernate.isInitialized( dp ) );
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		assertTrue( s.isReadOnly( dp ) );
+		assertTrue( s.isReadOnly( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().getImplementation() ) );
+		s.refresh( dp );
+		assertEquals( "original", dp.getDescription() );
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		assertTrue( s.isReadOnly( dp ) );
+		assertTrue( s.isReadOnly( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().getImplementation() ) );
+		t.commit();
+
+		s.clear();
+		t = s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dp.getId() );
+		assertEquals( "original", dp.getDescription() );
+		s.delete( dp );
+		t.commit();
+		s.close();
+	}
+
+
+	public void testReadOnlyRefreshDeleted() {
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		Transaction t = s.beginTransaction();
+		DataPoint dp = new DataPoint();
+		dp.setDescription( "original" );
+		dp.setX( new BigDecimal(0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+		dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+		s.save(dp);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		t = s.beginTransaction();
+		HibernateProxy dpProxy = ( HibernateProxy ) s.load( DataPoint.class, dp.getId() );
+		assertFalse( Hibernate.isInitialized( dpProxy ) );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		t = s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dp.getId() );
+		s.delete( dp );
+		s.flush();
+		try {
+			s.refresh( dp );
+			fail( "should have thrown UnresolvableObjectException" );
+		}
+		catch ( UnresolvableObjectException ex ) {
+			// expected
+		}
+		finally {
+			t.rollback();
+			s.close();
+		}
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.setCacheMode(CacheMode.IGNORE);
+		DataPoint dpProxyInit = ( DataPoint ) s.load( DataPoint.class, dp.getId() );
+		assertEquals( "original", dp.getDescription() );
+		s.delete( dpProxyInit );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		assertTrue( dpProxyInit instanceof HibernateProxy );
+		assertTrue( Hibernate.isInitialized( dpProxyInit ) );
+		try {
+			s.refresh( dpProxyInit );
+			fail( "should have thrown UnresolvableObjectException" );
+		}
+		catch ( UnresolvableObjectException ex ) {
+			// expected
+		}
+		finally {
+			t.rollback();
+			s.close();
+		}
+
+		s = openSession();
+		t = s.beginTransaction();
+		assertTrue( dpProxy instanceof HibernateProxy );
+		try {
+			s.refresh( dpProxy );
+			assertFalse( Hibernate.isInitialized( dpProxy ) );
+			Hibernate.initialize( dpProxy );
+			fail( "should have thrown UnresolvableObjectException" );
+		}
+		catch ( UnresolvableObjectException ex ) {
+			// expected
+		}
+		finally {
+			t.rollback();
+			s.close();
+		}
+	}
+
+	public void testReadOnlyRefreshDetached() {
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		Transaction t = s.beginTransaction();
+		DataPoint dp = new DataPoint();
+		dp.setDescription( "original" );
+		dp.setX( new BigDecimal(0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+		dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+		s.save(dp);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		t = s.beginTransaction();
+		dp = ( DataPoint ) s.load( DataPoint.class, dp.getId() );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		assertFalse( s.isReadOnly( dp ) );
+		s.setReadOnly( dp, true );
+		assertTrue( s.isReadOnly( dp ) );
+		s.evict( dp );
+		s.refresh( dp );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		assertFalse( s.isReadOnly( dp ) );
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		assertTrue( Hibernate.isInitialized( dp ) );
+		s.setReadOnly( dp, true );
+		s.evict( dp );
+		s.refresh( dp );
+		assertEquals( "original", dp.getDescription() );
+		assertFalse( s.isReadOnly( dp ) );
+		t.commit();
+
+		s.clear();
+		t = s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dp.getId() );
+		assertEquals( "original", dp.getDescription() );
+		s.delete( dp );
+		t.commit();
+		s.close();
+	}
+
+	public void testReadOnlyProxyMergeDetachedProxyWithChange() {
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		checkReadOnly( s, dp, false );
+		assertFalse( Hibernate.isInitialized( dp ));
+		Hibernate.initialize( dp );
+		assertTrue( Hibernate.isInitialized( dp ) );
+		s.getTransaction().commit();
+		s.close();
+
+		// modify detached proxy
+		dp.setDescription( "changed" );
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.beginTransaction();
+		DataPoint dpLoaded = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dpLoaded instanceof HibernateProxy );
+		checkReadOnly( s, dpLoaded, false );
+		s.setReadOnly( dpLoaded, true );
+		checkReadOnly( s, dpLoaded,true );
+		assertFalse( Hibernate.isInitialized( dpLoaded ) );
+		DataPoint dpMerged = ( DataPoint ) s.merge( dp );
+		assertSame( dpLoaded, dpMerged );
+		assertTrue( Hibernate.isInitialized( dpLoaded ) );
+		assertEquals( "changed", dpLoaded.getDescription() );
+		checkReadOnly( s, dpLoaded, true );
+		s.flush();
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dpOrig.getId() );
+		assertEquals( dpOrig.getId(), dp.getId() );
+		assertEquals( dpOrig.getDescription(), dp.getDescription() );
+		assertEquals( dpOrig.getX(), dp.getX() );
+		assertEquals( dpOrig.getY(), dp.getY() );
+		s.delete( dp );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testReadOnlyProxyInitMergeDetachedProxyWithChange() {
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		checkReadOnly( s, dp, false );
+		assertFalse( Hibernate.isInitialized( dp ));
+		Hibernate.initialize( dp );
+		assertTrue( Hibernate.isInitialized( dp ) );
+		s.getTransaction().commit();
+		s.close();
+
+		// modify detached proxy
+		dp.setDescription( "changed" );
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.beginTransaction();
+		DataPoint dpLoaded = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dpLoaded instanceof HibernateProxy );
+		assertFalse( Hibernate.isInitialized( dpLoaded ) );
+		Hibernate.initialize( dpLoaded );
+		assertTrue( Hibernate.isInitialized( dpLoaded ) );
+		checkReadOnly( s, dpLoaded, false );
+		s.setReadOnly( dpLoaded, true );
+		checkReadOnly( s, dpLoaded,true );
+		DataPoint dpMerged = ( DataPoint ) s.merge( dp );
+		assertSame( dpLoaded, dpMerged );
+		assertEquals( "changed", dpLoaded.getDescription() );
+		checkReadOnly( s, dpLoaded, true );
+		s.flush();
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dpOrig.getId() );
+		assertEquals( dpOrig.getId(), dp.getId() );
+		assertEquals( dpOrig.getDescription(), dp.getDescription() );
+		assertEquals( dpOrig.getX(), dp.getX() );
+		assertEquals( dpOrig.getY(), dp.getY() );
+		s.delete( dp );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testReadOnlyProxyMergeDetachedEntityWithChange() {
+
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		checkReadOnly( s, dp, false );
+		assertFalse( Hibernate.isInitialized( dp ));
+		Hibernate.initialize( dp );
+		assertTrue( Hibernate.isInitialized( dp ) );
+		s.getTransaction().commit();
+		s.close();
+
+		// modify detached proxy target
+		DataPoint dpEntity = ( DataPoint ) ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().getImplementation();
+		dpEntity.setDescription( "changed" );
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.beginTransaction();
+		DataPoint dpLoaded = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dpLoaded instanceof HibernateProxy );
+		checkReadOnly( s, dpLoaded, false );
+		s.setReadOnly( dpLoaded, true );
+		checkReadOnly( s, dpLoaded,true );
+		assertFalse( Hibernate.isInitialized( dpLoaded ) );
+		DataPoint dpMerged = ( DataPoint ) s.merge( dpEntity );
+		assertSame( dpLoaded, dpMerged );
+		assertTrue( Hibernate.isInitialized( dpLoaded ) );
+		assertEquals( "changed", dpLoaded.getDescription() );
+		checkReadOnly( s, dpLoaded, true );
+		s.flush();
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dpOrig.getId() );
+		assertEquals( dpOrig.getId(), dp.getId() );
+		assertEquals( dpOrig.getDescription(), dp.getDescription() );
+		assertEquals( dpOrig.getX(), dp.getX() );
+		assertEquals( dpOrig.getY(), dp.getY() );
+		s.delete( dp );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testReadOnlyProxyInitMergeDetachedEntityWithChange() {
+
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		checkReadOnly( s, dp, false );
+		assertFalse( Hibernate.isInitialized( dp ));
+		Hibernate.initialize( dp );
+		assertTrue( Hibernate.isInitialized( dp ) );
+		s.getTransaction().commit();
+		s.close();
+
+		// modify detached proxy target
+		DataPoint dpEntity = ( DataPoint ) ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().getImplementation();
+		dpEntity.setDescription( "changed" );
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.beginTransaction();
+		DataPoint dpLoaded = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dpLoaded instanceof HibernateProxy );
+		assertFalse( Hibernate.isInitialized( dpLoaded ) );
+		Hibernate.initialize( dpLoaded );
+		assertTrue( Hibernate.isInitialized( dpLoaded ) );
+		checkReadOnly( s, dpLoaded, false );
+		s.setReadOnly( dpLoaded, true );
+		checkReadOnly( s, dpLoaded,true );
+		DataPoint dpMerged = ( DataPoint ) s.merge( dpEntity );
+		assertSame( dpLoaded, dpMerged );
+		assertEquals( "changed", dpLoaded.getDescription() );
+		checkReadOnly( s, dpLoaded, true );
+		s.flush();
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dpOrig.getId() );
+		assertEquals( dpOrig.getId(), dp.getId() );
+		assertEquals( dpOrig.getDescription(), dp.getDescription() );
+		assertEquals( dpOrig.getX(), dp.getX() );
+		assertEquals( dpOrig.getY(), dp.getY() );
+		s.delete( dp );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testReadOnlyEntityMergeDetachedProxyWithChange() {
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		checkReadOnly( s, dp, false );
+		assertFalse( Hibernate.isInitialized( dp ));
+		Hibernate.initialize( dp );
+		assertTrue( Hibernate.isInitialized( dp ) );
+		s.getTransaction().commit();
+		s.close();
+
+		// modify detached proxy
+		dp.setDescription( "changed" );
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.beginTransaction();
+		DataPoint dpEntity = ( DataPoint ) s.get( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertFalse( dpEntity instanceof HibernateProxy );
+		assertFalse( s.isReadOnly( dpEntity ) );
+		s.setReadOnly( dpEntity, true );
+		assertTrue( s.isReadOnly( dpEntity ) );
+		DataPoint dpMerged = ( DataPoint ) s.merge( dp );
+		assertSame( dpEntity, dpMerged );
+		assertEquals( "changed", dpEntity.getDescription() );
+		assertTrue( s.isReadOnly( dpEntity ) );
+		s.flush();
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dpOrig.getId() );
+		assertEquals( dpOrig.getId(), dp.getId() );
+		assertEquals( dpOrig.getDescription(), dp.getDescription() );
+		assertEquals( dpOrig.getX(), dp.getX() );
+		assertEquals( dpOrig.getY(), dp.getY() );
+		s.delete( dp );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testSetReadOnlyInTwoTransactionsSameSession() {
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		checkReadOnly( s, dp, false );
+		s.setReadOnly( dp, true );
+		checkReadOnly( s, dp, true );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		dp.setDescription( "changed" );
+		assertTrue( Hibernate.isInitialized( dp ) );
+		assertEquals( "changed", dp.getDescription() );
+		s.flush();
+		s.getTransaction().commit();
+
+		checkReadOnly( s, dp, true );
+
+		s.beginTransaction();
+		checkReadOnly( s, dp, true );
+		dp.setDescription( "changed again" );
+		assertEquals( "changed again", dp.getDescription() );
+		s.flush();
+		s.getTransaction().commit();
+
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dpOrig.getId() );
+		assertEquals( dpOrig.getId(), dp.getId() );
+		assertEquals( dpOrig.getDescription(), dp.getDescription() );
+		assertEquals( dpOrig.getX(), dp.getX() );
+		assertEquals( dpOrig.getY(), dp.getY() );
+		s.delete( dp );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testSetReadOnlyBetweenTwoTransactionsSameSession() {
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		checkReadOnly( s, dp, false );
+		dp.setDescription( "changed" );
+		assertTrue( Hibernate.isInitialized( dp ) );
+		assertEquals( "changed", dp.getDescription() );
+		checkReadOnly( s, dp, false );
+		s.flush();
+		s.getTransaction().commit();
+
+		checkReadOnly( s, dp, false );
+		s.setReadOnly( dp, true );
+		checkReadOnly( s, dp, true );
+
+		s.beginTransaction();
+		checkReadOnly( s, dp, true );
+		dp.setDescription( "changed again" );
+		assertEquals( "changed again", dp.getDescription() );
+		s.flush();
+		s.getTransaction().commit();
+
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dpOrig.getId() );
+		assertEquals( dpOrig.getId(), dp.getId() );
+		assertEquals( "changed", dp.getDescription() );
+		assertEquals( dpOrig.getX(), dp.getX() );
+		assertEquals( dpOrig.getY(), dp.getY() );
+		s.delete( dp );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testSetModifiableBetweenTwoTransactionsSameSession() {
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		checkReadOnly( s, dp, false );
+		s.setReadOnly( dp, true );
+		checkReadOnly( s, dp, true );
+		dp.setDescription( "changed" );
+		assertTrue( Hibernate.isInitialized( dp ) );
+		assertEquals( "changed", dp.getDescription() );
+		checkReadOnly( s, dp, true );
+		s.flush();
+		s.getTransaction().commit();
+
+		checkReadOnly( s, dp, true );
+		s.setReadOnly( dp, false );
+		checkReadOnly( s, dp, false );
+
+		s.beginTransaction();
+		checkReadOnly( s, dp, false );
+		assertEquals( "changed", dp.getDescription() );
+		s.refresh( dp );
+		assertEquals( dpOrig.getDescription(), dp.getDescription() );
+		checkReadOnly( s, dp, false );
+		dp.setDescription( "changed again" );
+		assertEquals( "changed again", dp.getDescription() );
+		s.flush();
+		s.getTransaction().commit();
+
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dpOrig.getId() );
+		assertEquals( dpOrig.getId(), dp.getId() );
+		assertEquals( "changed again", dp.getDescription() );
+		assertEquals( dpOrig.getX(), dp.getX() );
+		assertEquals( dpOrig.getY(), dp.getY() );
+		s.delete( dp );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testIsReadOnlyAfterSessionClosed() {
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		checkReadOnly( s, dp, false );
+		s.getTransaction().commit();
+		s.close();
+
+		try {
+ 			s.isReadOnly( dp );
+			fail( "should have failed because session was closed" );
+		}
+		catch ( SessionException ex) {
+			// expected
+			assertFalse( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().isReadOnlySettingAvailable() );
+		}
+		finally {
+			s = openSession();
+			s.beginTransaction();
+			s.delete( dp );
+			s.getTransaction().commit();
+			s.close();
+		}
+	}
+
+	public void testIsReadOnlyAfterSessionClosedViaLazyInitializer() {
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		checkReadOnly( s, dp, false );
+		s.getTransaction().commit();
+		assertTrue( s.contains( dp ) );
+		s.close();
+
+		assertNull( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().getSession() );
+		try {
+ 			( ( HibernateProxy ) dp ).getHibernateLazyInitializer().isReadOnly();
+			fail( "should have failed because session was detached" );
+		}
+		catch ( TransientObjectException ex) {
+			// expected
+			assertFalse( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().isReadOnlySettingAvailable() );
+		}
+		finally {
+			s = openSession();
+			s.beginTransaction();
+			s.delete( dp );
+			s.getTransaction().commit();
+			s.close();
+		}
+	}
+
+
+	public void testDetachedIsReadOnlyAfterEvictViaSession() {
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		checkReadOnly( s, dp, false );
+		assertTrue( s.contains( dp ) );
+		s.evict( dp );
+		assertFalse( s.contains( dp ) );
+		assertNull( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().getSession() );
+
+		try {
+ 			s.isReadOnly( dp );
+			fail( "should have failed because proxy was detached" );
+		}
+		catch ( TransientObjectException ex) {
+			// expected
+			assertFalse( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().isReadOnlySettingAvailable() );
+		}
+		finally {
+			s.delete( dp );
+			s.getTransaction().commit();
+			s.close();
+		}
+	}
+
+	public void testDetachedIsReadOnlyAfterEvictViaLazyInitializer() {
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		checkReadOnly( s, dp, false );
+		s.evict( dp );
+		assertFalse( s.contains( dp ) );
+		assertNull( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().getSession() );
+		try {
+ 			( ( HibernateProxy ) dp ).getHibernateLazyInitializer().isReadOnly();
+			fail( "should have failed because proxy was detached" );
+		}
+		catch ( TransientObjectException ex) {
+			// expected
+			assertFalse( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().isReadOnlySettingAvailable() );
+		}
+		finally {
+			s.beginTransaction();
+			s.delete( dp );
+			s.getTransaction().commit();
+			s.close();
+		}
+	}
+
+	public void testSetReadOnlyAfterSessionClosed() {
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		checkReadOnly( s, dp, false );
+		s.getTransaction().commit();
+		s.close();
+
+		try {
+ 			s.setReadOnly( dp, true );
+			fail( "should have failed because session was closed" );
+		}
+		catch ( SessionException ex) {
+			// expected
+			assertFalse( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().isReadOnlySettingAvailable() );
+		}
+		finally {
+			s = openSession();
+			s.beginTransaction();
+			s.delete( dp );
+			s.getTransaction().commit();
+			s.close();
+		}
+	}
+
+	public void testSetReadOnlyAfterSessionClosedViaLazyInitializer() {
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		checkReadOnly( s, dp, false );
+		s.getTransaction().commit();
+		assertTrue( s.contains( dp ) );
+		s.close();
+
+		assertNull( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().getSession() );
+		try {
+ 			( ( HibernateProxy ) dp ).getHibernateLazyInitializer().setReadOnly( true );
+			fail( "should have failed because session was detached" );
+		}
+		catch ( TransientObjectException ex) {
+			// expected
+			assertFalse( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().isReadOnlySettingAvailable() );
+		}
+		finally {
+			s = openSession();
+			s.beginTransaction();
+			s.delete( dp );
+			s.getTransaction().commit();
+			s.close();
+		}
+	}
+
+	public void testSetClosedSessionInLazyInitializer() {
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		checkReadOnly( s, dp, false );
+		s.getTransaction().commit();
+		assertTrue( s.contains( dp ) );
+		s.close();
+
+		assertNull( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().getSession() );
+		assertTrue( ( ( SessionImplementor ) s ).isClosed() );
+		try {
+			( ( HibernateProxy ) dp ).getHibernateLazyInitializer().setSession( ( SessionImplementor ) s );			
+			fail( "should have failed because session was closed" );
+		}
+		catch ( SessionException ex) {
+			// expected
+			assertFalse( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().isReadOnlySettingAvailable() );
+		}
+		finally {
+			s = openSession();
+			s.beginTransaction();
+			s.delete( dp );
+			s.getTransaction().commit();
+			s.close();
+		}
+	}
+
+	public void testDetachedSetReadOnlyAfterEvictViaSession() {
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		checkReadOnly( s, dp, false );
+		assertTrue( s.contains( dp ) );
+		s.evict( dp );
+		assertFalse( s.contains( dp ) );
+		assertNull( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().getSession() );
+
+		try {
+ 			s.setReadOnly( dp, true );
+			fail( "should have failed because proxy was detached" );
+		}
+		catch ( TransientObjectException ex) {
+			// expected
+			assertFalse( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().isReadOnlySettingAvailable() );
+		}
+		finally {
+			s.delete( dp );
+			s.getTransaction().commit();
+			s.close();
+		}
+	}
+
+	public void testDetachedSetReadOnlyAfterEvictViaLazyInitializer() {
+		DataPoint dpOrig = createDataPoint( CacheMode.IGNORE );
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+
+		s.beginTransaction();
+		DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) );
+		assertTrue( dp instanceof HibernateProxy );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		checkReadOnly( s, dp, false );
+		s.evict( dp );
+		assertFalse( s.contains( dp ) );
+		assertNull( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().getSession() );
+		try {
+ 			( ( HibernateProxy ) dp ).getHibernateLazyInitializer().setReadOnly( true );
+			fail( "should have failed because proxy was detached" );
+		}
+		catch ( TransientObjectException ex) {
+			// expected
+			assertFalse( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().isReadOnlySettingAvailable() );
+		}
+		finally {
+			s.beginTransaction();
+			s.delete( dp );
+			s.getTransaction().commit();
+			s.close();
+		}
+	}
+
+	private DataPoint createDataPoint(CacheMode cacheMode) {
+		Session s = openSession();
+		s.setCacheMode( cacheMode );
+		s.beginTransaction();
+		DataPoint dp = new DataPoint();
+		dp.setX( new BigDecimal( 0.1d ).setScale(19, BigDecimal.ROUND_DOWN) );
+		dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+		dp.setDescription( "original" );
+		s.save( dp );
+		s.getTransaction().commit();
+		s.close();
+		return dp;
+	}
+
+	private void checkReadOnly(Session s, Object proxy, boolean expectedReadOnly) {
+		assertTrue( proxy instanceof HibernateProxy );
+		LazyInitializer li = ( ( HibernateProxy ) proxy ).getHibernateLazyInitializer();
+		assertSame( s, li.getSession() );
+		assertEquals( expectedReadOnly, s.isReadOnly( proxy ) );
+		assertEquals( expectedReadOnly, li.isReadOnly() );
+		assertEquals( Hibernate.isInitialized( proxy ), ! li.isUninitialized() );
+		if ( Hibernate.isInitialized( proxy ) ) {
+			assertEquals( expectedReadOnly, s.isReadOnly( li.getImplementation() ) );
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/ReadOnlyProxyTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/ReadOnlySessionLazyNonLazyTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/ReadOnlySessionLazyNonLazyTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/ReadOnlySessionLazyNonLazyTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,1413 @@
+//$Id: ReadOnlyTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.readonly;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Set;
+import java.util.HashSet;
+import java.util.Arrays;
+import java.util.Iterator;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.proxy.HibernateProxy;
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Model:
+ *
+ * Container
+ * |-- N : 1 -- noProxyOwner (property-ref="name" lazy="no-proxy" cascade="all")
+ * |-- N : 1 -- proxyOwner (property-ref="name" lazy="proxy" cascade="all")
+ * |-- N : 1 -- nonLazyOwner (property-ref="name" lazy="false" cascade="all")
+ * |-- N : 1 -- noProxyInfo" (lazy="no-proxy" cascade="all")
+ * |-- N : 1 -- proxyInfo (lazy="proxy" cascade="all"
+ * |-- N : 1 -- nonLazyInfo" (lazy="false" cascade="all")
+ * |
+ * |-- 1 : N -- lazyDataPoints" (lazy="true" inverse="false" cascade="all")
+ * |-- 1 : N -- nonLazySelectDataPoints" (lazy="false" inverse="false" cascade="all" fetch="select")
+ * |-- 1 : N -- nonLazyJoinDataPoints" (lazy="false" inverse="false" cascade="all" fetch="join")
+ *
+ * Note: the following many-to-one properties use a property-ref so they are
+ * initialized, regardless of how the lazy attribute is mapped:
+ * noProxyOwner, proxyOwner, nonLazyOwner
+ *
+ * @author Gail Badner
+ */
+public class ReadOnlySessionLazyNonLazyTest extends AbstractReadOnlyTest {
+
+	public ReadOnlySessionLazyNonLazyTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "readonly/DataPoint.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( ReadOnlySessionLazyNonLazyTest.class );
+	}
+
+	public void testExistingModifiableAfterSetSessionReadOnly() {
+
+		Container cOrig = createContainer();
+		Set expectedInitializedObjects =
+				new HashSet(
+					Arrays.asList( new Object[ ] {
+						cOrig, cOrig.getNoProxyInfo(), cOrig.getProxyInfo(), cOrig.getNonLazyInfo(),
+						cOrig.getNoProxyOwner(), cOrig.getProxyOwner(), cOrig.getNonLazyOwner(),
+						cOrig.getLazyDataPoints().iterator().next(),
+						cOrig.getNonLazyJoinDataPoints().iterator().next(),
+						cOrig.getNonLazySelectDataPoints().iterator().next()
+					}
+				)
+		);
+		Set expectedReadOnlyObjects = new HashSet();
+
+		Session s = openSession();
+		assertFalse( s.isDefaultReadOnly() );
+		Transaction t = s.beginTransaction();
+		s.save( cOrig );
+		checkContainer( cOrig, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		s.setDefaultReadOnly( true );
+		assertTrue( s.isDefaultReadOnly() );
+		checkContainer( cOrig, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		t.commit();
+
+		t = s.beginTransaction();
+		assertTrue( s.isDefaultReadOnly() );
+		checkContainer( cOrig, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		Container c = ( Container ) s.load( Container.class, cOrig.getId() );
+		assertSame( cOrig, c );
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		c = ( Container ) s.get( Container.class, cOrig.getId() );
+		assertSame( cOrig, c );
+		checkContainer( cOrig, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		s.refresh( cOrig );
+		assertSame( cOrig, c );
+		checkContainer( cOrig, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		s.evict( cOrig );
+		c = ( Container ) s.get( Container.class, cOrig.getId()  );
+		assertNotSame( cOrig, c );
+		expectedInitializedObjects =
+				new HashSet(
+					Arrays.asList( new Object[ ] {
+						c, c.getNonLazyInfo(),
+						c.getNoProxyOwner(), c.getProxyOwner(), c.getNonLazyOwner(),
+						c.getNonLazyJoinDataPoints().iterator().next(),
+						c.getNonLazySelectDataPoints().iterator().next()
+					}
+				)
+		);
+		expectedReadOnlyObjects =
+				new HashSet(
+						Arrays.asList( new Object[ ] {
+								c, c.getNoProxyInfo(), c.getProxyInfo(), c.getNonLazyInfo(),
+								c.getNoProxyOwner(), c.getProxyOwner(), c.getNonLazyOwner(),
+								//c.getLazyDataPoints(),
+								c.getNonLazyJoinDataPoints().iterator().next(),
+								c.getNonLazySelectDataPoints().iterator().next()
+						}
+				)
+		);
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		assertFalse( Hibernate.isInitialized( c.getNoProxyInfo() ) );
+		Hibernate.initialize( c.getNoProxyInfo() );
+		expectedInitializedObjects.add( c.getNoProxyInfo() );
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		assertFalse( Hibernate.isInitialized( c.getProxyInfo() ) );
+		Hibernate.initialize( c.getProxyInfo() );
+		expectedInitializedObjects.add( c.getProxyInfo() );
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		assertFalse( Hibernate.isInitialized( c.getLazyDataPoints() ) );
+		Hibernate.initialize( c.getLazyDataPoints() );
+		expectedInitializedObjects.add( c.getLazyDataPoints().iterator().next() );
+		expectedReadOnlyObjects.add(c.getLazyDataPoints().iterator().next() );
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		t.commit();
+		s.close();
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery("delete from DataPoint").executeUpdate();
+		s.createQuery("delete from Container").executeUpdate();
+		s.createQuery("delete from Info").executeUpdate();
+		s.createQuery("delete from Owner").executeUpdate();
+		t.commit();
+		s.close();
+
+	}
+
+	public void testExistingReadOnlyAfterSetSessionModifiable() {
+
+		Container cOrig = createContainer();
+		Set expectedInitializedObjects =
+				new HashSet(
+					Arrays.asList( new Object[ ] {
+						cOrig, cOrig.getNoProxyInfo(), cOrig.getProxyInfo(), cOrig.getNonLazyInfo(),
+						cOrig.getNoProxyOwner(), cOrig.getProxyOwner(), cOrig.getNonLazyOwner(),
+						cOrig.getLazyDataPoints().iterator().next(),
+						cOrig.getNonLazyJoinDataPoints().iterator().next(),
+						cOrig.getNonLazySelectDataPoints().iterator().next()
+					}
+				)
+		);
+		Set expectedReadOnlyObjects = new HashSet();
+		Session s = openSession();
+		assertFalse( s.isDefaultReadOnly() );
+		Transaction t = s.beginTransaction();
+		s.save( cOrig );
+		checkContainer( cOrig, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		s.setDefaultReadOnly( true );
+		assertTrue( s.isDefaultReadOnly() );
+		checkContainer( cOrig, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.setDefaultReadOnly( true );
+		Container c = ( Container ) s.get( Container.class, cOrig.getId()  );
+		assertNotSame( cOrig, c );
+		expectedInitializedObjects =
+				new HashSet(
+					Arrays.asList( new Object[ ] {
+						c, c.getNonLazyInfo(),
+						c.getNoProxyOwner(), c.getProxyOwner(), c.getNonLazyOwner(),
+						c.getNonLazyJoinDataPoints().iterator().next(),
+						c.getNonLazySelectDataPoints().iterator().next()
+					}
+				)
+		);
+		expectedReadOnlyObjects =
+				new HashSet(
+						Arrays.asList( new Object[ ] {
+								c, c.getNoProxyInfo(), c.getProxyInfo(), c.getNonLazyInfo(),
+								c.getNoProxyOwner(), c.getProxyOwner(), c.getNonLazyOwner(),
+								//c.getLazyDataPoints(),
+								c.getNonLazyJoinDataPoints().iterator().next(),
+								c.getNonLazySelectDataPoints().iterator().next()
+						}
+				)
+		);
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		s.setDefaultReadOnly( false );
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		assertFalse( Hibernate.isInitialized( c.getNoProxyInfo() ) );
+		Hibernate.initialize( c.getNoProxyInfo() );
+		expectedInitializedObjects.add( c.getNoProxyInfo() );
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		assertFalse( Hibernate.isInitialized( c.getProxyInfo() ) );
+		Hibernate.initialize( c.getProxyInfo() );
+		expectedInitializedObjects.add( c.getProxyInfo() );
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		assertFalse( Hibernate.isInitialized( c.getLazyDataPoints() ) );
+		Hibernate.initialize( c.getLazyDataPoints() );
+		expectedInitializedObjects.add( c.getLazyDataPoints().iterator().next() );
+		//expectedReadOnlyObjects.add(c.getLazyDataPoints().iterator().next() );
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		t.commit();
+		s.close();
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery("delete from DataPoint").executeUpdate();
+		s.createQuery("delete from Container").executeUpdate();
+		s.createQuery("delete from Info").executeUpdate();
+		s.createQuery("delete from Owner").executeUpdate();
+		t.commit();
+		s.close();
+
+	}
+
+	public void testExistingReadOnlyAfterSetSessionModifiableExisting() {
+
+		Container cOrig = createContainer();
+		Set expectedInitializedObjects =
+				new HashSet(
+					Arrays.asList( new Object[ ] {
+						cOrig, cOrig.getNoProxyInfo(), cOrig.getProxyInfo(), cOrig.getNonLazyInfo(),
+						cOrig.getNoProxyOwner(), cOrig.getProxyOwner(), cOrig.getNonLazyOwner(),
+						cOrig.getLazyDataPoints().iterator().next(),
+						cOrig.getNonLazyJoinDataPoints().iterator().next(),
+						cOrig.getNonLazySelectDataPoints().iterator().next()
+					}
+				)
+		);
+		Set expectedReadOnlyObjects = new HashSet();
+		DataPoint lazyDataPointOrig = ( DataPoint ) cOrig.getLazyDataPoints().iterator().next();
+		Session s = openSession();
+		assertFalse( s.isDefaultReadOnly() );
+		Transaction t = s.beginTransaction();
+		s.save( cOrig );
+		checkContainer( cOrig, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		s.setDefaultReadOnly( true );
+		assertTrue( s.isDefaultReadOnly() );
+		checkContainer( cOrig, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.setDefaultReadOnly( true );
+		Container c = ( Container ) s.get( Container.class, cOrig.getId()  );
+		assertNotSame( cOrig, c );
+		expectedInitializedObjects =
+				new HashSet(
+					Arrays.asList( new Object[ ] {
+						c, c.getNonLazyInfo(),
+						c.getNoProxyOwner(), c.getProxyOwner(), c.getNonLazyOwner(),
+						c.getNonLazyJoinDataPoints().iterator().next(),
+						c.getNonLazySelectDataPoints().iterator().next()
+					}
+				)
+		);
+		expectedReadOnlyObjects =
+				new HashSet(
+						Arrays.asList( new Object[ ] {
+								c, c.getNoProxyInfo(), c.getProxyInfo(), c.getNonLazyInfo(),
+								c.getNoProxyOwner(), c.getProxyOwner(), c.getNonLazyOwner(),
+								//c.getLazyDataPoints(),
+								c.getNonLazyJoinDataPoints().iterator().next(),
+								c.getNonLazySelectDataPoints().iterator().next()
+						}
+				)
+		);
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		s.setDefaultReadOnly( false );
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		assertFalse( Hibernate.isInitialized( c.getNoProxyInfo() ) );
+		Hibernate.initialize( c.getNoProxyInfo() );
+		expectedInitializedObjects.add( c.getNoProxyInfo() );
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		assertFalse( Hibernate.isInitialized( c.getProxyInfo() ) );
+		Hibernate.initialize( c.getProxyInfo() );
+		expectedInitializedObjects.add( c.getProxyInfo() );
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		DataPoint lazyDataPoint = ( DataPoint ) s.get( DataPoint.class, lazyDataPointOrig.getId() );
+		assertFalse( Hibernate.isInitialized( c.getLazyDataPoints() ) );
+		Hibernate.initialize( c.getLazyDataPoints() );
+		assertSame( lazyDataPoint, c.getLazyDataPoints().iterator().next() );
+		expectedInitializedObjects.add( c.getLazyDataPoints().iterator().next() );
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		t.commit();
+		s.close();
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery("delete from DataPoint").executeUpdate();
+		s.createQuery("delete from Container").executeUpdate();
+		s.createQuery("delete from Info").executeUpdate();
+		s.createQuery("delete from Owner").executeUpdate();
+		t.commit();
+		s.close();
+
+	}
+
+	public void testExistingReadOnlyAfterSetSessionModifiableExistingEntityReadOnly() {
+
+		Container cOrig = createContainer();
+		Set expectedInitializedObjects =
+				new HashSet(
+					Arrays.asList( new Object[ ] {
+						cOrig, cOrig.getNoProxyInfo(), cOrig.getProxyInfo(), cOrig.getNonLazyInfo(),
+						cOrig.getNoProxyOwner(), cOrig.getProxyOwner(), cOrig.getNonLazyOwner(),
+						cOrig.getLazyDataPoints().iterator().next(),
+						cOrig.getNonLazyJoinDataPoints().iterator().next(),
+						cOrig.getNonLazySelectDataPoints().iterator().next()
+					}
+				)
+		);
+		Set expectedReadOnlyObjects = new HashSet();
+		DataPoint lazyDataPointOrig = ( DataPoint ) cOrig.getLazyDataPoints().iterator().next();
+		Session s = openSession();
+		assertFalse( s.isDefaultReadOnly() );
+		Transaction t = s.beginTransaction();
+		s.save( cOrig );
+		checkContainer( cOrig, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		s.setDefaultReadOnly( true );
+		assertTrue( s.isDefaultReadOnly() );
+		checkContainer( cOrig, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.setDefaultReadOnly( true );
+		Container c = ( Container ) s.get( Container.class, cOrig.getId()  );
+		assertNotSame( cOrig, c );
+		expectedInitializedObjects =
+				new HashSet(
+					Arrays.asList( new Object[ ] {
+						c, c.getNonLazyInfo(),
+						c.getNoProxyOwner(), c.getProxyOwner(), c.getNonLazyOwner(),
+						c.getNonLazyJoinDataPoints().iterator().next(),
+						c.getNonLazySelectDataPoints().iterator().next()
+					}
+				)
+		);
+		expectedReadOnlyObjects =
+				new HashSet(
+						Arrays.asList( new Object[ ] {
+								c, c.getNoProxyInfo(), c.getProxyInfo(), c.getNonLazyInfo(),
+								c.getNoProxyOwner(), c.getProxyOwner(), c.getNonLazyOwner(),
+								//c.getLazyDataPoints(),
+								c.getNonLazyJoinDataPoints().iterator().next(),
+								c.getNonLazySelectDataPoints().iterator().next()
+						}
+				)
+		);
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		s.setDefaultReadOnly( false );
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		assertFalse( Hibernate.isInitialized( c.getNoProxyInfo() ) );
+		Hibernate.initialize( c.getNoProxyInfo() );
+		expectedInitializedObjects.add( c.getNoProxyInfo() );
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		assertFalse( Hibernate.isInitialized( c.getProxyInfo() ) );
+		Hibernate.initialize( c.getProxyInfo() );
+		expectedInitializedObjects.add( c.getProxyInfo() );
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		s.setDefaultReadOnly( true );
+		DataPoint lazyDataPoint = ( DataPoint ) s.get( DataPoint.class, lazyDataPointOrig.getId() );
+		s.setDefaultReadOnly( false );
+		assertFalse( Hibernate.isInitialized( c.getLazyDataPoints() ) );
+		Hibernate.initialize( c.getLazyDataPoints() );
+		assertSame( lazyDataPoint, c.getLazyDataPoints().iterator().next() );
+		expectedInitializedObjects.add( c.getLazyDataPoints().iterator().next() );
+		expectedReadOnlyObjects.add( lazyDataPoint );
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		t.commit();
+		s.close();
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery("delete from DataPoint").executeUpdate();
+		s.createQuery("delete from Container").executeUpdate();
+		s.createQuery("delete from Info").executeUpdate();
+		s.createQuery("delete from Owner").executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+
+	public void testExistingReadOnlyAfterSetSessionModifiableProxyExisting() {
+
+		Container cOrig = createContainer();
+		Set expectedInitializedObjects =
+				new HashSet(
+					Arrays.asList( new Object[ ] {
+						cOrig, cOrig.getNoProxyInfo(), cOrig.getProxyInfo(), cOrig.getNonLazyInfo(),
+						cOrig.getNoProxyOwner(), cOrig.getProxyOwner(), cOrig.getNonLazyOwner(),
+						cOrig.getLazyDataPoints().iterator().next(),
+						cOrig.getNonLazyJoinDataPoints().iterator().next(),
+						cOrig.getNonLazySelectDataPoints().iterator().next()
+					}
+				)
+		);
+		Set expectedReadOnlyObjects = new HashSet();
+		DataPoint lazyDataPointOrig = ( DataPoint ) cOrig.getLazyDataPoints().iterator().next();
+		Session s = openSession();
+		assertFalse( s.isDefaultReadOnly() );
+		Transaction t = s.beginTransaction();
+		s.save( cOrig );
+		checkContainer( cOrig, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		s.setDefaultReadOnly( true );
+		assertTrue( s.isDefaultReadOnly() );
+		checkContainer( cOrig, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.setDefaultReadOnly( true );
+		Container c = ( Container ) s.get( Container.class, cOrig.getId()  );
+		assertNotSame( cOrig, c );
+		expectedInitializedObjects =
+				new HashSet(
+					Arrays.asList( new Object[ ] {
+						c, c.getNonLazyInfo(),
+						c.getNoProxyOwner(), c.getProxyOwner(), c.getNonLazyOwner(),
+						c.getNonLazyJoinDataPoints().iterator().next(),
+						c.getNonLazySelectDataPoints().iterator().next()
+					}
+				)
+		);
+		expectedReadOnlyObjects =
+				new HashSet(
+						Arrays.asList( new Object[ ] {
+								c, c.getNoProxyInfo(), c.getProxyInfo(), c.getNonLazyInfo(),
+								c.getNoProxyOwner(), c.getProxyOwner(), c.getNonLazyOwner(),
+								//c.getLazyDataPoints(),
+								c.getNonLazyJoinDataPoints().iterator().next(),
+								c.getNonLazySelectDataPoints().iterator().next()
+						}
+				)
+		);
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		s.setDefaultReadOnly( false );
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		assertFalse( Hibernate.isInitialized( c.getNoProxyInfo() ) );
+		Hibernate.initialize( c.getNoProxyInfo() );
+		expectedInitializedObjects.add( c.getNoProxyInfo() );
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		assertFalse( Hibernate.isInitialized( c.getProxyInfo() ) );
+		Hibernate.initialize( c.getProxyInfo() );
+		expectedInitializedObjects.add( c.getProxyInfo() );
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		DataPoint lazyDataPoint = ( DataPoint ) s.load( DataPoint.class, lazyDataPointOrig.getId() );
+		assertFalse( Hibernate.isInitialized( c.getLazyDataPoints() ) );
+		Hibernate.initialize( c.getLazyDataPoints() );
+		assertSame( lazyDataPoint, c.getLazyDataPoints().iterator().next() );
+		expectedInitializedObjects.add( c.getLazyDataPoints().iterator().next() );
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		t.commit();
+		s.close();
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery("delete from DataPoint").executeUpdate();
+		s.createQuery("delete from Container").executeUpdate();
+		s.createQuery("delete from Info").executeUpdate();
+		s.createQuery("delete from Owner").executeUpdate();
+		t.commit();
+		s.close();
+
+	}
+
+	public void testExistingReadOnlyAfterSetSessionModifiableExistingProxyReadOnly() {
+
+		Container cOrig = createContainer();
+		Set expectedInitializedObjects =
+				new HashSet(
+					Arrays.asList( new Object[ ] {
+						cOrig, cOrig.getNoProxyInfo(), cOrig.getProxyInfo(), cOrig.getNonLazyInfo(),
+						cOrig.getNoProxyOwner(), cOrig.getProxyOwner(), cOrig.getNonLazyOwner(),
+						cOrig.getLazyDataPoints().iterator().next(),
+						cOrig.getNonLazyJoinDataPoints().iterator().next(),
+						cOrig.getNonLazySelectDataPoints().iterator().next()
+					}
+				)
+		);
+		Set expectedReadOnlyObjects = new HashSet();
+		DataPoint lazyDataPointOrig = ( DataPoint ) cOrig.getLazyDataPoints().iterator().next();
+		Session s = openSession();
+		assertFalse( s.isDefaultReadOnly() );
+		Transaction t = s.beginTransaction();
+		s.save( cOrig );
+		checkContainer( cOrig, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		s.setDefaultReadOnly( true );
+		assertTrue( s.isDefaultReadOnly() );
+		checkContainer( cOrig, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.setDefaultReadOnly( true );
+		Container c = ( Container ) s.get( Container.class, cOrig.getId()  );
+		assertNotSame( cOrig, c );
+		expectedInitializedObjects =
+				new HashSet(
+					Arrays.asList( new Object[ ] {
+						c, c.getNonLazyInfo(),
+						c.getNoProxyOwner(), c.getProxyOwner(), c.getNonLazyOwner(),
+						c.getNonLazyJoinDataPoints().iterator().next(),
+						c.getNonLazySelectDataPoints().iterator().next()
+					}
+				)
+		);
+		expectedReadOnlyObjects =
+				new HashSet(
+						Arrays.asList( new Object[ ] {
+								c, c.getNoProxyInfo(), c.getProxyInfo(), c.getNonLazyInfo(),
+								c.getNoProxyOwner(), c.getProxyOwner(), c.getNonLazyOwner(),
+								//c.getLazyDataPoints(),
+								c.getNonLazyJoinDataPoints().iterator().next(),
+								c.getNonLazySelectDataPoints().iterator().next()
+						}
+				)
+		);
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		s.setDefaultReadOnly( false );
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		assertFalse( Hibernate.isInitialized( c.getNoProxyInfo() ) );
+		Hibernate.initialize( c.getNoProxyInfo() );
+		expectedInitializedObjects.add( c.getNoProxyInfo() );
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		assertFalse( Hibernate.isInitialized( c.getProxyInfo() ) );
+		Hibernate.initialize( c.getProxyInfo() );
+		expectedInitializedObjects.add( c.getProxyInfo() );
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		s.setDefaultReadOnly( true );
+		DataPoint lazyDataPoint = ( DataPoint ) s.load( DataPoint.class, lazyDataPointOrig.getId() );
+		s.setDefaultReadOnly( false );
+		assertFalse( Hibernate.isInitialized( c.getLazyDataPoints() ) );
+		Hibernate.initialize( c.getLazyDataPoints() );
+		assertSame( lazyDataPoint, c.getLazyDataPoints().iterator().next() );
+		expectedInitializedObjects.add( c.getLazyDataPoints().iterator().next() );
+		expectedReadOnlyObjects.add( lazyDataPoint );
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		t.commit();
+		s.close();
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery("delete from DataPoint").executeUpdate();
+		s.createQuery("delete from Container").executeUpdate();
+		s.createQuery("delete from Info").executeUpdate();
+		s.createQuery("delete from Owner").executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	public void testDefaultModifiableWithReadOnlyQueryForEntity() {
+		Container cOrig = createContainer();
+		Set expectedInitializedObjects =
+				new HashSet(
+					Arrays.asList( new Object[ ] {
+						cOrig, cOrig.getNoProxyInfo(), cOrig.getProxyInfo(), cOrig.getNonLazyInfo(),
+						cOrig.getNoProxyOwner(), cOrig.getProxyOwner(), cOrig.getNonLazyOwner(),
+						cOrig.getLazyDataPoints().iterator().next(),
+						cOrig.getNonLazyJoinDataPoints().iterator().next(),
+						cOrig.getNonLazySelectDataPoints().iterator().next()
+					}
+				)
+		);
+		Set expectedReadOnlyObjects = new HashSet();
+
+		Session s = openSession();
+		assertFalse( s.isDefaultReadOnly() );
+		Transaction t = s.beginTransaction();
+		s.save( cOrig );
+		checkContainer( cOrig, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		s.setDefaultReadOnly( true );
+		assertTrue( s.isDefaultReadOnly() );
+		checkContainer( cOrig, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		assertFalse( s.isDefaultReadOnly() );
+		Container c = ( Container ) s.createQuery( "from Container where id=" + cOrig.getId() )
+				.setReadOnly( true ).uniqueResult();
+		expectedInitializedObjects =
+				new HashSet(
+					Arrays.asList( new Object[ ] {
+						c, c.getNonLazyInfo(),
+						c.getNoProxyOwner(), c.getProxyOwner(), c.getNonLazyOwner(),
+						c.getNonLazyJoinDataPoints().iterator().next(),
+						c.getNonLazySelectDataPoints().iterator().next()
+					}
+				)
+		);
+		expectedReadOnlyObjects =
+				new HashSet(
+						Arrays.asList( new Object[ ] {
+								c, c.getNoProxyInfo(), c.getProxyInfo(), c.getNonLazyInfo(),
+								c.getNoProxyOwner(), c.getProxyOwner(), c.getNonLazyOwner(),
+								//c.getLazyDataPoints(),
+								c.getNonLazyJoinDataPoints().iterator().next(),
+								c.getNonLazySelectDataPoints().iterator().next()
+						}
+				)
+		);
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		assertFalse( Hibernate.isInitialized( c.getNoProxyInfo() ) );
+		Hibernate.initialize( c.getNoProxyInfo() );
+		expectedInitializedObjects.add( c.getNoProxyInfo() );
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		assertFalse( Hibernate.isInitialized( c.getProxyInfo() ) );
+		Hibernate.initialize( c.getProxyInfo() );
+		expectedInitializedObjects.add( c.getProxyInfo() );
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		assertFalse( Hibernate.isInitialized( c.getLazyDataPoints() ) );
+		Hibernate.initialize( c.getLazyDataPoints() );
+		expectedInitializedObjects.add( c.getLazyDataPoints().iterator().next() );
+		//expectedReadOnlyObjects.add(c.getLazyDataPoints().iterator().next() );
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		t.commit();
+		s.close();
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery("delete from DataPoint").executeUpdate();
+		s.createQuery("delete from Container").executeUpdate();
+		s.createQuery("delete from Info").executeUpdate();
+		s.createQuery("delete from Owner").executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	public void testDefaultReadOnlyWithModifiableQueryForEntity() {
+		Container cOrig = createContainer();
+		Set expectedInitializedObjects =
+				new HashSet(
+					Arrays.asList( new Object[ ] {
+						cOrig, cOrig.getNoProxyInfo(), cOrig.getProxyInfo(), cOrig.getNonLazyInfo(),
+						cOrig.getNoProxyOwner(), cOrig.getProxyOwner(), cOrig.getNonLazyOwner(),
+						cOrig.getLazyDataPoints().iterator().next(),
+						cOrig.getNonLazyJoinDataPoints().iterator().next(),
+						cOrig.getNonLazySelectDataPoints().iterator().next()
+					}
+				)
+		);
+		Set expectedReadOnlyObjects = new HashSet();
+
+		Session s = openSession();
+		assertFalse( s.isDefaultReadOnly() );
+		Transaction t = s.beginTransaction();
+		s.save( cOrig );
+		checkContainer( cOrig, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		s.setDefaultReadOnly( true );
+		assertTrue( s.isDefaultReadOnly() );
+		checkContainer( cOrig, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.setDefaultReadOnly( true );
+		assertTrue( s.isDefaultReadOnly() );
+		Container c = ( Container ) s.createQuery( "from Container where id=" + cOrig.getId() )
+				.setReadOnly( false ).uniqueResult();
+		expectedInitializedObjects =
+				new HashSet(
+					Arrays.asList( new Object[ ] {
+						c, c.getNonLazyInfo(),
+						c.getNoProxyOwner(), c.getProxyOwner(), c.getNonLazyOwner(),
+						c.getNonLazyJoinDataPoints().iterator().next(),
+						c.getNonLazySelectDataPoints().iterator().next()
+					}
+				)
+		);
+		expectedReadOnlyObjects = new HashSet();
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		assertFalse( Hibernate.isInitialized( c.getNoProxyInfo() ) );
+		Hibernate.initialize( c.getNoProxyInfo() );
+		expectedInitializedObjects.add( c.getNoProxyInfo() );
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		assertFalse( Hibernate.isInitialized( c.getProxyInfo() ) );
+		Hibernate.initialize( c.getProxyInfo() );
+		expectedInitializedObjects.add( c.getProxyInfo() );
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		assertFalse( Hibernate.isInitialized( c.getLazyDataPoints() ) );
+		Hibernate.initialize( c.getLazyDataPoints() );
+		expectedInitializedObjects.add( c.getLazyDataPoints().iterator().next() );
+		expectedReadOnlyObjects.add(c.getLazyDataPoints().iterator().next() );
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		t.commit();
+		s.close();
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery("delete from DataPoint").executeUpdate();
+		s.createQuery("delete from Container").executeUpdate();
+		s.createQuery("delete from Info").executeUpdate();
+		s.createQuery("delete from Owner").executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	public void testDefaultReadOnlyWithQueryForEntity() {
+		Container cOrig = createContainer();
+		Set expectedInitializedObjects =
+				new HashSet(
+					Arrays.asList( new Object[ ] {
+						cOrig, cOrig.getNoProxyInfo(), cOrig.getProxyInfo(), cOrig.getNonLazyInfo(),
+						cOrig.getNoProxyOwner(), cOrig.getProxyOwner(), cOrig.getNonLazyOwner(),
+						cOrig.getLazyDataPoints().iterator().next(),
+						cOrig.getNonLazyJoinDataPoints().iterator().next(),
+						cOrig.getNonLazySelectDataPoints().iterator().next()
+					}
+				)
+		);
+		Set expectedReadOnlyObjects = new HashSet();
+
+		Session s = openSession();
+		assertFalse( s.isDefaultReadOnly() );
+		Transaction t = s.beginTransaction();
+		s.save( cOrig );
+		checkContainer( cOrig, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		s.setDefaultReadOnly( true );
+		assertTrue( s.isDefaultReadOnly() );
+		checkContainer( cOrig, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.setDefaultReadOnly( true );
+		assertTrue( s.isDefaultReadOnly() );
+		Container c = ( Container ) s.createQuery( "from Container where id=" + cOrig.getId() )
+				.uniqueResult();
+		expectedInitializedObjects =
+				new HashSet(
+					Arrays.asList( new Object[ ] {
+						c, c.getNonLazyInfo(),
+						c.getNoProxyOwner(), c.getProxyOwner(), c.getNonLazyOwner(),
+						c.getNonLazyJoinDataPoints().iterator().next(),
+						c.getNonLazySelectDataPoints().iterator().next()
+					}
+				)
+		);
+		expectedReadOnlyObjects =
+				new HashSet(
+						Arrays.asList( new Object[ ] {
+								c, c.getNoProxyInfo(), c.getProxyInfo(), c.getNonLazyInfo(),
+								c.getNoProxyOwner(), c.getProxyOwner(), c.getNonLazyOwner(),
+								//c.getLazyDataPoints(),
+								c.getNonLazyJoinDataPoints().iterator().next(),
+								c.getNonLazySelectDataPoints().iterator().next()
+						}
+				)
+		);
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		assertFalse( Hibernate.isInitialized( c.getNoProxyInfo() ) );
+		Hibernate.initialize( c.getNoProxyInfo() );
+		expectedInitializedObjects.add( c.getNoProxyInfo() );
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		assertFalse( Hibernate.isInitialized( c.getProxyInfo() ) );
+		Hibernate.initialize( c.getProxyInfo() );
+		expectedInitializedObjects.add( c.getProxyInfo() );
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		assertFalse( Hibernate.isInitialized( c.getLazyDataPoints() ) );
+		Hibernate.initialize( c.getLazyDataPoints() );
+		expectedInitializedObjects.add( c.getLazyDataPoints().iterator().next() );
+		expectedReadOnlyObjects.add(c.getLazyDataPoints().iterator().next() );
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		t.commit();
+		s.close();
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery("delete from DataPoint").executeUpdate();
+		s.createQuery("delete from Container").executeUpdate();
+		s.createQuery("delete from Info").executeUpdate();
+		s.createQuery("delete from Owner").executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	public void testDefaultModifiableWithQueryForEntity() {
+		Container cOrig = createContainer();
+		Set expectedInitializedObjects =
+				new HashSet(
+					Arrays.asList( new Object[ ] {
+						cOrig, cOrig.getNoProxyInfo(), cOrig.getProxyInfo(), cOrig.getNonLazyInfo(),
+						cOrig.getNoProxyOwner(), cOrig.getProxyOwner(), cOrig.getNonLazyOwner(),
+						cOrig.getLazyDataPoints().iterator().next(),
+						cOrig.getNonLazyJoinDataPoints().iterator().next(),
+						cOrig.getNonLazySelectDataPoints().iterator().next()
+					}
+				)
+		);
+		Set expectedReadOnlyObjects = new HashSet();
+
+		Session s = openSession();
+		assertFalse( s.isDefaultReadOnly() );
+		Transaction t = s.beginTransaction();
+		s.save( cOrig );
+		checkContainer( cOrig, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		s.setDefaultReadOnly( true );
+		assertTrue( s.isDefaultReadOnly() );
+		checkContainer( cOrig, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		assertFalse( s.isDefaultReadOnly() );
+		Container c = ( Container ) s.createQuery( "from Container where id=" + cOrig.getId() )
+				.uniqueResult();
+		expectedInitializedObjects =
+				new HashSet(
+					Arrays.asList( new Object[ ] {
+						c, c.getNonLazyInfo(),
+						c.getNoProxyOwner(), c.getProxyOwner(), c.getNonLazyOwner(),
+						c.getNonLazyJoinDataPoints().iterator().next(),
+						c.getNonLazySelectDataPoints().iterator().next()
+					}
+				)
+		);
+		expectedReadOnlyObjects = new HashSet();
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		assertFalse( Hibernate.isInitialized( c.getNoProxyInfo() ) );
+		Hibernate.initialize( c.getNoProxyInfo() );
+		expectedInitializedObjects.add( c.getNoProxyInfo() );
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		assertFalse( Hibernate.isInitialized( c.getProxyInfo() ) );
+		Hibernate.initialize( c.getProxyInfo() );
+		expectedInitializedObjects.add( c.getProxyInfo() );
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		assertFalse( Hibernate.isInitialized( c.getLazyDataPoints() ) );
+		Hibernate.initialize( c.getLazyDataPoints() );
+		expectedInitializedObjects.add( c.getLazyDataPoints().iterator().next() );
+		//expectedReadOnlyObjects.add(c.getLazyDataPoints().iterator().next() );
+		checkContainer( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		t.commit();
+		s.close();
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery("delete from DataPoint").executeUpdate();
+		s.createQuery("delete from Container").executeUpdate();
+		s.createQuery("delete from Info").executeUpdate();
+		s.createQuery("delete from Owner").executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	public void testDefaultModifiableWithReadOnlyQueryForCollectionEntities() {
+		Container cOrig = createContainer();
+		Set expectedInitializedObjects =
+				new HashSet(
+					Arrays.asList( new Object[ ] {
+						cOrig, cOrig.getNoProxyInfo(), cOrig.getProxyInfo(), cOrig.getNonLazyInfo(),
+						cOrig.getNoProxyOwner(), cOrig.getProxyOwner(), cOrig.getNonLazyOwner(),
+						cOrig.getLazyDataPoints().iterator().next(),
+						cOrig.getNonLazyJoinDataPoints().iterator().next(),
+						cOrig.getNonLazySelectDataPoints().iterator().next()
+					}
+				)
+		);
+		Set expectedReadOnlyObjects = new HashSet();
+
+		Session s = openSession();
+		assertFalse( s.isDefaultReadOnly() );
+		Transaction t = s.beginTransaction();
+		s.save( cOrig );
+		checkContainer( cOrig, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		s.setDefaultReadOnly( true );
+		assertTrue( s.isDefaultReadOnly() );
+		checkContainer( cOrig, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		assertFalse( s.isDefaultReadOnly() );
+		DataPoint dp = ( DataPoint ) s.createQuery( "select c.lazyDataPoints from Container c join c.lazyDataPoints where c.id=" + cOrig.getId() )
+				.setReadOnly( true ).uniqueResult();
+		assertTrue( s.isReadOnly( dp ) );
+		t.commit();
+		s.close();
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery("delete from DataPoint").executeUpdate();
+		s.createQuery("delete from Container").executeUpdate();
+		s.createQuery("delete from Info").executeUpdate();
+		s.createQuery("delete from Owner").executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	public void testDefaultReadOnlyWithModifiableFilterCollectionEntities() {
+		Container cOrig = createContainer();
+		Set expectedInitializedObjects =
+				new HashSet(
+					Arrays.asList( new Object[ ] {
+						cOrig, cOrig.getNoProxyInfo(), cOrig.getProxyInfo(), cOrig.getNonLazyInfo(),
+						cOrig.getNoProxyOwner(), cOrig.getProxyOwner(), cOrig.getNonLazyOwner(),
+						cOrig.getLazyDataPoints().iterator().next(),
+						cOrig.getNonLazyJoinDataPoints().iterator().next(),
+						cOrig.getNonLazySelectDataPoints().iterator().next()
+					}
+				)
+		);
+		Set expectedReadOnlyObjects = new HashSet();
+
+		Session s = openSession();
+		assertFalse( s.isDefaultReadOnly() );
+		Transaction t = s.beginTransaction();
+		s.save( cOrig );
+		checkContainer( cOrig, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		s.setDefaultReadOnly( true );
+		assertTrue( s.isDefaultReadOnly() );
+		checkContainer( cOrig, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.setDefaultReadOnly( true );
+		assertTrue( s.isDefaultReadOnly() );
+		Container c = ( Container ) s.get( Container.class, cOrig.getId() );
+		assertNotSame( cOrig, c );
+		expectedInitializedObjects =
+				new HashSet(
+					Arrays.asList( new Object[ ] {
+						c, c.getNonLazyInfo(),
+						c.getNoProxyOwner(), c.getProxyOwner(), c.getNonLazyOwner(),
+						c.getNonLazyJoinDataPoints().iterator().next(),
+						c.getNonLazySelectDataPoints().iterator().next()
+					}
+				)
+		);
+		expectedReadOnlyObjects =
+				new HashSet(
+						Arrays.asList( new Object[ ] {
+								c, c.getNoProxyInfo(), c.getProxyInfo(), c.getNonLazyInfo(),
+								c.getNoProxyOwner(), c.getProxyOwner(), c.getNonLazyOwner(),
+								//c.getLazyDataPoints(),
+								c.getNonLazyJoinDataPoints().iterator().next(),
+								c.getNonLazySelectDataPoints().iterator().next()
+						}
+				)
+		);
+		List list = ( List ) s.createFilter( c.getLazyDataPoints(), "" )
+				.setMaxResults(1)
+				.setReadOnly( false )
+				.list();
+		assertEquals( 1, list.size() );
+		assertFalse( s.isReadOnly( list.get( 0 ) ) );
+		list = ( List ) s.createFilter( c.getNonLazyJoinDataPoints(), "" )
+				.setMaxResults(1)
+				.setReadOnly( false )
+				.list();
+		assertEquals( 1, list.size() );
+		assertTrue( s.isReadOnly( list.get( 0 ) ) );
+		list = ( List ) s.createFilter( c.getNonLazySelectDataPoints(), "" )
+				.setMaxResults(1)
+				.setReadOnly( false )
+				.list();
+		assertEquals( 1, list.size() );
+		assertTrue( s.isReadOnly( list.get( 0 ) ) );
+		t.commit();
+		s.close();
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery("delete from DataPoint").executeUpdate();
+		s.createQuery("delete from Container").executeUpdate();
+		s.createQuery("delete from Info").executeUpdate();
+		s.createQuery("delete from Owner").executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	public void testDefaultModifiableWithReadOnlyFilterCollectionEntities() {
+		Container cOrig = createContainer();
+		Set expectedInitializedObjects =
+				new HashSet(
+					Arrays.asList( new Object[ ] {
+						cOrig, cOrig.getNoProxyInfo(), cOrig.getProxyInfo(), cOrig.getNonLazyInfo(),
+						cOrig.getNoProxyOwner(), cOrig.getProxyOwner(), cOrig.getNonLazyOwner(),
+						cOrig.getLazyDataPoints().iterator().next(),
+						cOrig.getNonLazyJoinDataPoints().iterator().next(),
+						cOrig.getNonLazySelectDataPoints().iterator().next()
+					}
+				)
+		);
+		Set expectedReadOnlyObjects = new HashSet();
+
+		Session s = openSession();
+		assertFalse( s.isDefaultReadOnly() );
+		Transaction t = s.beginTransaction();
+		s.save( cOrig );
+		checkContainer( cOrig, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		s.setDefaultReadOnly( true );
+		assertTrue( s.isDefaultReadOnly() );
+		checkContainer( cOrig, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		assertFalse( s.isDefaultReadOnly() );
+		Container c = ( Container ) s.get( Container.class, cOrig.getId() );
+		assertNotSame( cOrig, c );
+		expectedInitializedObjects =
+				new HashSet(
+					Arrays.asList( new Object[ ] {
+						c, c.getNonLazyInfo(),
+						c.getNoProxyOwner(), c.getProxyOwner(), c.getNonLazyOwner(),
+						c.getNonLazyJoinDataPoints().iterator().next(),
+						c.getNonLazySelectDataPoints().iterator().next()
+					}
+				)
+		);
+		expectedReadOnlyObjects = new HashSet();
+		List list = ( List ) s.createFilter( c.getLazyDataPoints(), "" )
+				.setMaxResults(1)
+				.setReadOnly( true )
+				.list();
+		assertEquals( 1, list.size() );
+		assertTrue( s.isReadOnly( list.get( 0 ) ) );
+		list = ( List ) s.createFilter( c.getNonLazyJoinDataPoints(), "" )
+				.setMaxResults(1)
+				.setReadOnly( true )
+				.list();
+		assertEquals( 1, list.size() );
+		assertFalse( s.isReadOnly( list.get( 0 ) ) );
+		list = ( List ) s.createFilter( c.getNonLazySelectDataPoints(), "" )
+				.setMaxResults(1)
+				.setReadOnly( true )
+				.list();
+		assertEquals( 1, list.size() );
+		assertFalse( s.isReadOnly( list.get( 0 ) ) );
+		t.commit();
+		s.close();
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery("delete from DataPoint").executeUpdate();
+		s.createQuery("delete from Container").executeUpdate();
+		s.createQuery("delete from Info").executeUpdate();
+		s.createQuery("delete from Owner").executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	public void testDefaultReadOnlyWithFilterCollectionEntities() {
+		Container cOrig = createContainer();
+		Set expectedInitializedObjects =
+				new HashSet(
+					Arrays.asList( new Object[ ] {
+						cOrig, cOrig.getNoProxyInfo(), cOrig.getProxyInfo(), cOrig.getNonLazyInfo(),
+						cOrig.getNoProxyOwner(), cOrig.getProxyOwner(), cOrig.getNonLazyOwner(),
+						cOrig.getLazyDataPoints().iterator().next(),
+						cOrig.getNonLazyJoinDataPoints().iterator().next(),
+						cOrig.getNonLazySelectDataPoints().iterator().next()
+					}
+				)
+		);
+		Set expectedReadOnlyObjects = new HashSet();
+
+		Session s = openSession();
+		assertFalse( s.isDefaultReadOnly() );
+		Transaction t = s.beginTransaction();
+		s.save( cOrig );
+		checkContainer( cOrig, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		s.setDefaultReadOnly( true );
+		assertTrue( s.isDefaultReadOnly() );
+		checkContainer( cOrig, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.setDefaultReadOnly( true );
+		assertTrue( s.isDefaultReadOnly() );
+		Container c = ( Container ) s.get( Container.class, cOrig.getId() );
+		assertNotSame( cOrig, c );
+		expectedInitializedObjects =
+				new HashSet(
+					Arrays.asList( new Object[ ] {
+						c, c.getNonLazyInfo(),
+						c.getNoProxyOwner(), c.getProxyOwner(), c.getNonLazyOwner(),
+						c.getNonLazyJoinDataPoints().iterator().next(),
+						c.getNonLazySelectDataPoints().iterator().next()
+					}
+				)
+		);
+		expectedReadOnlyObjects =
+				new HashSet(
+						Arrays.asList( new Object[ ] {
+								c, c.getNoProxyInfo(), c.getProxyInfo(), c.getNonLazyInfo(),
+								c.getNoProxyOwner(), c.getProxyOwner(), c.getNonLazyOwner(),
+								//c.getLazyDataPoints(),
+								c.getNonLazyJoinDataPoints().iterator().next(),
+								c.getNonLazySelectDataPoints().iterator().next()
+						}
+				)
+		);
+		List list = ( List ) s.createFilter( c.getLazyDataPoints(), "" )
+				.setMaxResults(1)
+				.list();
+		assertEquals( 1, list.size() );
+		assertTrue( s.isReadOnly( list.get( 0 ) ) );
+		list = ( List ) s.createFilter( c.getNonLazyJoinDataPoints(), "" )
+				.setMaxResults(1)
+				.list();
+		assertEquals( 1, list.size() );
+		assertTrue( s.isReadOnly( list.get( 0 ) ) );
+		list = ( List ) s.createFilter( c.getNonLazySelectDataPoints(), "" )
+				.setMaxResults(1)
+				.list();
+		assertEquals( 1, list.size() );
+		assertTrue( s.isReadOnly( list.get( 0 ) ) );
+		t.commit();
+		s.close();
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery("delete from DataPoint").executeUpdate();
+		s.createQuery("delete from Container").executeUpdate();
+		s.createQuery("delete from Info").executeUpdate();
+		s.createQuery("delete from Owner").executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	public void testDefaultModifiableWithFilterCollectionEntities() {
+		Container cOrig = createContainer();
+		Set expectedInitializedObjects =
+				new HashSet(
+					Arrays.asList( new Object[ ] {
+						cOrig, cOrig.getNoProxyInfo(), cOrig.getProxyInfo(), cOrig.getNonLazyInfo(),
+						cOrig.getNoProxyOwner(), cOrig.getProxyOwner(), cOrig.getNonLazyOwner(),
+						cOrig.getLazyDataPoints().iterator().next(),
+						cOrig.getNonLazyJoinDataPoints().iterator().next(),
+						cOrig.getNonLazySelectDataPoints().iterator().next()
+					}
+				)
+		);
+		Set expectedReadOnlyObjects = new HashSet();
+
+		Session s = openSession();
+		assertFalse( s.isDefaultReadOnly() );
+		Transaction t = s.beginTransaction();
+		s.save( cOrig );
+		checkContainer( cOrig, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		s.setDefaultReadOnly( true );
+		assertTrue( s.isDefaultReadOnly() );
+		checkContainer( cOrig, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		assertFalse( s.isDefaultReadOnly() );
+		Container c = ( Container ) s.get( Container.class, cOrig.getId() );
+		assertNotSame( cOrig, c );
+		expectedInitializedObjects =
+				new HashSet(
+					Arrays.asList( new Object[ ] {
+						c, c.getNonLazyInfo(),
+						c.getNoProxyOwner(), c.getProxyOwner(), c.getNonLazyOwner(),
+						c.getNonLazyJoinDataPoints().iterator().next(),
+						c.getNonLazySelectDataPoints().iterator().next()
+					}
+				)
+		);
+		expectedReadOnlyObjects = new HashSet();
+		List list = ( List ) s.createFilter( c.getLazyDataPoints(), "" )
+				.setMaxResults(1)
+				.list();
+		assertEquals( 1, list.size() );
+		assertFalse( s.isReadOnly( list.get( 0 ) ) );
+		list = ( List ) s.createFilter( c.getNonLazyJoinDataPoints(), "" )
+				.setMaxResults(1)
+				.list();
+		assertEquals( 1, list.size() );
+		assertFalse( s.isReadOnly( list.get( 0 ) ) );
+		list = ( List ) s.createFilter( c.getNonLazySelectDataPoints(), "" )
+				.setMaxResults(1)
+				.list();
+		assertEquals( 1, list.size() );
+		assertFalse( s.isReadOnly( list.get( 0 ) ) );
+		t.commit();
+		s.close();
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery("delete from DataPoint").executeUpdate();
+		s.createQuery("delete from Container").executeUpdate();
+		s.createQuery("delete from Info").executeUpdate();
+		s.createQuery("delete from Owner").executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+/*
+	public void testQueryReadOnlyModeExplicitLeftOuterJoinNonLazy() {
+
+		Container cOrig = createContainer();
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.save( cOrig );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		List list = s.createQuery( "from Container c left outer join c.nonLazyInfo where c.id = :id" )
+				.setLong( "id", cOrig.getId() )
+				.setReadOnly( true )
+				.list();
+		assertEquals( 1, list.size() );
+		Container c = ( Container ) list.get( 0 );
+		check( c, true, s );
+		check( c.getNoProxyInfo(), false, s );
+		check( c.getProxyInfo(), false, s );
+		check( c.getNonLazyInfo(), true, s );
+
+		//check( c.getNoProxyOwner(), true, s );
+		//check( c.getProxyOwner(), true, s );
+		//check( c.getNonLazyOwner(), true, s );
+		check( c.getLazyDataPoints(), false, s );
+		//check( c.getNonLazyJoinDataPoints(), true, s );
+		//check( c.getNonLazySelectDataPoints(), true, s );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery("delete from DataPoint").executeUpdate();
+		s.createQuery("delete from Container").executeUpdate();
+		s.createQuery("delete from Info").executeUpdate();
+		s.createQuery("delete from Owner").executeUpdate();
+		t.commit();
+		s.close();
+
+	}
+
+	public void testQueryReadOnlyModeExplicitLeftJoinFetchNonLazy() {
+
+		Container cOrig = createContainer();
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.save( cOrig );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		List list = s.createQuery( "from Container c left join fetch c.nonLazyInfo where c.id = :id" )
+				.setLong( "id", cOrig.getId() )
+				.setReadOnly( true )
+				.list();
+		assertEquals( 1, list.size() );
+		Container c = ( Container ) list.get( 0 );
+		check( c, true, s );
+		check( c.getNoProxyInfo(), false, s );
+		check( c.getProxyInfo(), false, s );
+		check( c.getNonLazyInfo(), true, s );
+
+		// note that Container the following many-to-one properties use a property-ref
+		// so they are initialized, regardless of how the lazy attribute is mapped:
+		// noProxyOwner, proxyOwner, nonLazyOwner
+		//check( c.getNoProxyOwner(), true, s );
+		//check( c.getProxyOwner(), true, s );
+		//check( c.getNonLazyOwner(), true, s );
+		check( c.getLazyDataPoints(), false, s );
+		//check( c.getNonLazyJoinDataPoints(), true, s );
+		//check( c.getNonLazySelectDataPoints(), true, s );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery("delete from DataPoint").executeUpdate();
+		s.createQuery("delete from Container").executeUpdate();
+		s.createQuery("delete from Info").executeUpdate();
+		s.createQuery("delete from Owner").executeUpdate();
+		t.commit();
+		s.close();
+
+	}
+
+	public void testEntityReadOnlyMode() {
+
+		Container cOrig = createContainer();
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.save( cOrig );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Container c = ( Container ) s.get( Container.class, cOrig.getId() );
+		assertNotNull( c );
+		s.setReadOnly( c, true );
+		check( c, true, s );
+		check( c.getNoProxyInfo(), false, s );
+		check( c.getProxyInfo(), false, s );
+		check( c.getNonLazyInfo(), true, s );
+
+		// note that Container the following many-to-one properties use a property-ref
+		// so they are initialized, regardless of how the lazy attribute is mapped:
+		// noProxyOwner, proxyOwner, nonLazyOwner
+		check( c.getNoProxyOwner(), true, s );
+		check( c.getProxyOwner(), true, s );
+		check( c.getNonLazyOwner(), true, s );
+		check( c.getLazyDataPoints(), false, s );
+		check( c.getNonLazyJoinDataPoints(), true, s );
+		check( c.getNonLazySelectDataPoints(), true, s );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery("delete from DataPoint").executeUpdate();
+		s.createQuery("delete from Container").executeUpdate();
+		s.createQuery("delete from Info").executeUpdate();
+		s.createQuery("delete from Owner").executeUpdate();
+		t.commit();
+		s.close();
+
+	}
+*/
+
+	private Container createContainer() {
+		Container c = new Container( "container" );
+		c.setNoProxyInfo( new Info( "no-proxy info" ) );
+		c.setProxyInfo( new Info( "proxy info" ) );
+		c.setNonLazyInfo( new Info( "non-lazy info" ) );
+		c.setNoProxyOwner( new Owner( "no-proxy owner" ) );
+		c.setProxyOwner( new Owner( "proxy owner" ) );
+		c.setNonLazyOwner( new Owner( "non-lazy owner" ) );
+		c.getLazyDataPoints().add( new DataPoint( new BigDecimal( 1 ), new BigDecimal( 1 ), "lazy data point" ) );
+		c.getNonLazyJoinDataPoints().add( new DataPoint( new BigDecimal( 2 ), new BigDecimal( 2 ), "non-lazy join data point" ) );
+		c.getNonLazySelectDataPoints().add( new DataPoint( new BigDecimal( 3 ), new BigDecimal( 3 ), "non-lazy select data point" ) );
+		return c;
+	}
+
+	private void checkContainer(Container c, Set expectedInitializedObjects, Set expectedReadOnlyObjects, Session s) {
+		checkObject( c, expectedInitializedObjects, expectedReadOnlyObjects, s );
+		if ( ! expectedInitializedObjects.contains( c ) ) {
+			return;
+		}
+		checkObject( c.getNoProxyInfo(), expectedInitializedObjects, expectedReadOnlyObjects, s);
+		checkObject( c.getProxyInfo(), expectedInitializedObjects, expectedReadOnlyObjects, s);
+		checkObject( c.getNonLazyInfo(), expectedInitializedObjects, expectedReadOnlyObjects, s );
+		checkObject( c.getNoProxyOwner(), expectedInitializedObjects, expectedReadOnlyObjects, s );
+		checkObject( c.getProxyOwner(), expectedInitializedObjects, expectedReadOnlyObjects, s );
+		checkObject( c.getNonLazyOwner(), expectedInitializedObjects, expectedReadOnlyObjects, s );
+		if ( Hibernate.isInitialized( c.getLazyDataPoints() ) ) {
+			for ( Iterator it=c.getLazyDataPoints().iterator(); it.hasNext(); ) {
+				checkObject( it.next(), expectedInitializedObjects, expectedReadOnlyObjects, s );
+			}
+		}
+		for ( Iterator it=c.getNonLazyJoinDataPoints().iterator(); it.hasNext(); ) {
+			checkObject( it.next(), expectedInitializedObjects, expectedReadOnlyObjects, s );
+		}
+		for ( Iterator it=c.getNonLazySelectDataPoints().iterator(); it.hasNext(); ) {
+			checkObject( it.next(), expectedInitializedObjects, expectedReadOnlyObjects, s );
+		}
+	}
+
+	private void checkObject(Object entityOrProxy, Set expectedInitializedObjects, Set expectedReadOnlyObjects, Session s) {
+		boolean isExpectedToBeInitialized = expectedInitializedObjects.contains( entityOrProxy );
+		boolean isExpectedToBeReadOnly = expectedReadOnlyObjects.contains( entityOrProxy );
+		SessionImplementor si = ( SessionImplementor ) s;
+		assertEquals( isExpectedToBeInitialized, Hibernate.isInitialized( entityOrProxy ) );
+		assertEquals( isExpectedToBeReadOnly, s.isReadOnly( entityOrProxy ) );
+		if ( Hibernate.isInitialized( entityOrProxy ) ) {
+			Object entity = ( entityOrProxy instanceof HibernateProxy ?
+					( ( HibernateProxy ) entityOrProxy ).getHibernateLazyInitializer().getImplementation( si ) :
+					entityOrProxy
+			);
+			assertNotNull( entity );
+			assertEquals( isExpectedToBeReadOnly, s.isReadOnly( entity ));
+		}
+	}
+
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/ReadOnlySessionLazyNonLazyTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/ReadOnlySessionTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/ReadOnlySessionTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/ReadOnlySessionTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,1209 @@
+//$Id: ReadOnlyTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.readonly;
+
+import java.math.BigDecimal;
+import java.util.Iterator;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.CacheMode;
+import org.hibernate.Hibernate;
+import org.hibernate.Query;
+import org.hibernate.ScrollMode;
+import org.hibernate.ScrollableResults;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.proxy.HibernateProxy;
+
+/**
+ *
+ * @author Gail Badner
+ */
+public class ReadOnlySessionTest extends AbstractReadOnlyTest {
+
+	public ReadOnlySessionTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "readonly/DataPoint.hbm.xml", "readonly/TextHolder.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( ReadOnlySessionTest.class );
+	}
+
+	public void testReadOnlyOnProxies() {
+		Session s = openSession();
+		s.setCacheMode( CacheMode.IGNORE );
+		s.beginTransaction();
+		DataPoint dp = new DataPoint();
+		dp.setX( new BigDecimal( 0.1d ).setScale(19, BigDecimal.ROUND_DOWN) );
+		dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+		dp.setDescription( "original" );
+		s.save( dp );
+		long dpId = dp.getId();
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.beginTransaction();
+		s.setDefaultReadOnly( true );
+		assertTrue( s.isDefaultReadOnly() );
+		dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpId ) );
+		s.setDefaultReadOnly( false );
+		assertFalse( "was initialized", Hibernate.isInitialized( dp ) );
+		assertTrue( s.isReadOnly( dp ) );
+		assertFalse( "was initialized during isReadOnly", Hibernate.isInitialized( dp ) );
+		dp.setDescription( "changed" );
+		assertTrue( "was not initialized during mod", Hibernate.isInitialized( dp ) );
+		assertEquals( "desc not changed in memory", "changed", dp.getDescription() );
+		s.flush();
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		List list = s.createQuery( "from DataPoint where description = 'changed'" ).list();
+		assertEquals( "change written to database", 0, list.size() );
+		s.createQuery("delete from DataPoint").executeUpdate();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testReadOnlySessionDefaultQueryScroll() {
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		Transaction t = s.beginTransaction();
+		for ( int i=0; i<100; i++ ) {
+			DataPoint dp = new DataPoint();
+			dp.setX( new BigDecimal(i * 0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+			dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+			s.save(dp);
+		}
+		t.commit();
+		s.close();
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		t = s.beginTransaction();
+		s.setDefaultReadOnly( true );
+		int i = 0;
+		ScrollableResults sr = s.createQuery("from DataPoint dp order by dp.x asc")
+				.scroll(ScrollMode.FORWARD_ONLY);
+		s.setDefaultReadOnly( false );
+		while ( sr.next() ) {
+			DataPoint dp = (DataPoint) sr.get(0);
+			if (++i==50) {
+				s.setReadOnly(dp, false);
+			}
+			dp.setDescription("done!");
+		}
+		t.commit();
+		s.clear();
+		t = s.beginTransaction();
+		List single = s.createQuery("from DataPoint where description='done!'").list();
+		assertEquals( 1, single.size() );
+		s.createQuery("delete from DataPoint").executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	public void testReadOnlySessionModifiableQueryScroll() {
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		Transaction t = s.beginTransaction();
+		for ( int i=0; i<100; i++ ) {
+			DataPoint dp = new DataPoint();
+			dp.setX( new BigDecimal(i * 0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+			dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+			s.save(dp);
+		}
+		t.commit();
+		s.close();
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		t = s.beginTransaction();
+		s.setDefaultReadOnly( true );
+		int i = 0;
+		ScrollableResults sr = s.createQuery("from DataPoint dp order by dp.x asc")
+				.setReadOnly( false )
+				.scroll(ScrollMode.FORWARD_ONLY);
+		while ( sr.next() ) {
+			DataPoint dp = (DataPoint) sr.get(0);
+			if (++i==50) {
+				s.setReadOnly(dp, true);
+			}
+			dp.setDescription("done!");
+		}
+		t.commit();
+		s.clear();
+		t = s.beginTransaction();
+		List list = s.createQuery("from DataPoint where description='done!'").list();
+		assertEquals( 99, list.size() );
+		s.createQuery("delete from DataPoint").executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	public void testModifiableSessionReadOnlyQueryScroll() {
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		Transaction t = s.beginTransaction();
+		for ( int i=0; i<100; i++ ) {
+			DataPoint dp = new DataPoint();
+			dp.setX( new BigDecimal(i * 0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+			dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+			s.save(dp);
+		}
+		t.commit();
+		s.close();
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		t = s.beginTransaction();
+		assertFalse( s.isDefaultReadOnly() );
+		int i = 0;
+		ScrollableResults sr = s.createQuery("from DataPoint dp order by dp.x asc")
+				.setReadOnly( true )
+				.scroll(ScrollMode.FORWARD_ONLY);
+		while ( sr.next() ) {
+			DataPoint dp = (DataPoint) sr.get(0);
+			if (++i==50) {
+				s.setReadOnly(dp, false);
+			}
+			dp.setDescription("done!");
+		}
+		t.commit();
+		s.clear();
+		t = s.beginTransaction();
+		List single = s.createQuery("from DataPoint where description='done!'").list();
+		assertEquals( 1, single.size() );
+		s.createQuery("delete from DataPoint").executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	public void testModifiableSessionDefaultQueryReadOnlySessionScroll() {
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		Transaction t = s.beginTransaction();
+		for ( int i=0; i<100; i++ ) {
+			DataPoint dp = new DataPoint();
+			dp.setX( new BigDecimal(i * 0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+			dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+			s.save(dp);
+		}
+		t.commit();
+		s.close();
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		t = s.beginTransaction();
+		s.setDefaultReadOnly( false );
+		int i = 0;
+		Query query = s.createQuery("from DataPoint dp order by dp.x asc");
+		s.setDefaultReadOnly( true );
+		ScrollableResults sr = query.scroll(ScrollMode.FORWARD_ONLY);
+		s.setDefaultReadOnly( false );
+		while ( sr.next() ) {
+			DataPoint dp = (DataPoint) sr.get(0);
+			if (++i==50) {
+				s.setReadOnly(dp, false);
+			}
+			dp.setDescription("done!");
+		}
+		t.commit();
+		s.clear();
+		t = s.beginTransaction();
+		List single = s.createQuery("from DataPoint where description='done!'").list();
+		assertEquals( 1, single.size() );
+		s.createQuery("delete from DataPoint").executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	public void testQueryReadOnlyScroll() {
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		Transaction t = s.beginTransaction();
+		DataPoint dp = null;
+		for ( int i=0; i<100; i++ ) {
+			dp = new DataPoint();
+			dp.setX( new BigDecimal(i * 0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+			dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+			s.save(dp);
+		}
+		t.commit();
+		s.close();
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		t = s.beginTransaction();
+		s.setDefaultReadOnly( false );
+		int i = 0;
+		Query query = s.createQuery("from DataPoint dp order by dp.x asc");
+		assertFalse( query.isReadOnly() );
+		s.setDefaultReadOnly( true );
+		assertTrue( query.isReadOnly() );
+		s.setDefaultReadOnly( false );
+		assertFalse( query.isReadOnly() );
+		query.setReadOnly( true );
+		assertTrue( query.isReadOnly() );
+		s.setDefaultReadOnly( true );
+		assertTrue( query.isReadOnly() );
+		s.setDefaultReadOnly( false );
+		assertTrue( query.isReadOnly() );
+		query.setReadOnly( false );
+		assertFalse( query.isReadOnly() );
+		s.setDefaultReadOnly( true );
+		assertFalse( query.isReadOnly() );
+		query.setReadOnly( true );
+		assertTrue( query.isReadOnly() );
+		s.setDefaultReadOnly( false );
+		assertFalse( s.isDefaultReadOnly() );
+		ScrollableResults sr = query.scroll(ScrollMode.FORWARD_ONLY);
+		assertFalse( s.isDefaultReadOnly() );
+		assertTrue( query.isReadOnly() );
+		DataPoint dpLast = ( DataPoint ) s.get( DataPoint.class, dp.getId() );		
+		assertFalse( s.isReadOnly( dpLast ) );
+		query.setReadOnly( false );
+		assertFalse( query.isReadOnly() );
+		int nExpectedChanges = 0;
+		assertFalse( s.isDefaultReadOnly() );
+		while ( sr.next() ) {
+			assertFalse( s.isDefaultReadOnly() );
+			dp = (DataPoint) sr.get(0);
+			if ( dp.getId() == dpLast.getId() ) {
+				//dpLast existed in the session before executing the read-only query
+				assertFalse( s.isReadOnly( dp ) );
+			}
+			else {
+				assertTrue( s.isReadOnly( dp ) );
+			}
+			if (++i==50) {
+				s.setReadOnly(dp, false);
+				nExpectedChanges = ( dp == dpLast ? 1 : 2 );
+			}
+			dp.setDescription("done!");
+		}
+		assertFalse( s.isDefaultReadOnly() );
+		t.commit();
+		s.clear();
+		t = s.beginTransaction();
+		List list = s.createQuery("from DataPoint where description='done!'").list();
+		assertEquals( nExpectedChanges, list.size() );
+		s.createQuery("delete from DataPoint").executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	public void testQueryModifiableScroll() {
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		Transaction t = s.beginTransaction();
+		DataPoint dp = null;
+		for ( int i=0; i<100; i++ ) {
+			dp = new DataPoint();
+			dp.setX( new BigDecimal(i * 0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+			dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+			s.save(dp);
+		}
+		t.commit();
+		s.close();
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		t = s.beginTransaction();
+		s.setDefaultReadOnly( true );
+		int i = 0;
+		Query query = s.createQuery("from DataPoint dp order by dp.x asc");
+		assertTrue( query.isReadOnly() );
+		s.setDefaultReadOnly( false );
+		assertFalse( query.isReadOnly() );
+		s.setDefaultReadOnly( true );
+		assertTrue( query.isReadOnly() );
+		query.setReadOnly( false );
+		assertFalse( query.isReadOnly() );
+		s.setDefaultReadOnly( false );
+		assertFalse( query.isReadOnly() );
+		s.setDefaultReadOnly( true );
+		assertFalse( query.isReadOnly() );
+		query.setReadOnly( true );
+		assertTrue( query.isReadOnly() );
+		s.setDefaultReadOnly( false );
+		assertTrue( query.isReadOnly() );
+		query.setReadOnly( false );
+		assertFalse( query.isReadOnly() );
+		s.setDefaultReadOnly( true );
+		assertTrue( s.isDefaultReadOnly() );
+		ScrollableResults sr = query.scroll(ScrollMode.FORWARD_ONLY);
+		assertFalse( query.isReadOnly() );
+		DataPoint dpLast = ( DataPoint ) s.get( DataPoint.class, dp.getId() );
+		assertTrue( s.isReadOnly( dpLast ) );
+		query.setReadOnly( true );
+		assertTrue( query.isReadOnly() );
+		int nExpectedChanges = 0;
+		assertTrue( s.isDefaultReadOnly() );
+		while ( sr.next() ) {
+			assertTrue( s.isDefaultReadOnly() );
+			dp = (DataPoint) sr.get(0);
+			if ( dp.getId() == dpLast.getId() ) {
+				//dpLast existed in the session before executing the read-only query
+				assertTrue( s.isReadOnly( dp ) );
+			}
+			else {
+				assertFalse( s.isReadOnly( dp ) );
+			}
+			if (++i==50) {
+				s.setReadOnly(dp, true);
+				nExpectedChanges = ( dp == dpLast ? 99 : 98 );
+			}
+			dp.setDescription("done!");
+		}
+		assertTrue( s.isDefaultReadOnly() );
+		t.commit();
+		s.clear();
+		t = s.beginTransaction();
+		List list = s.createQuery("from DataPoint where description='done!'").list();
+		assertEquals( nExpectedChanges, list.size() );
+		s.createQuery("delete from DataPoint").executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	public void testReadOnlySessionDefaultQueryIterate() {
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		Transaction t = s.beginTransaction();
+		for ( int i=0; i<100; i++ ) {
+			DataPoint dp = new DataPoint();
+			dp.setX( new BigDecimal(i * 0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+			dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+			s.save(dp);
+		}
+		t.commit();
+		s.close();
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		t = s.beginTransaction();
+		s.setDefaultReadOnly( true );
+		int i = 0;
+		Iterator it = s.createQuery("from DataPoint dp order by dp.x asc")
+				.iterate();
+		s.setDefaultReadOnly( false );
+		while ( it.hasNext() ) {
+			DataPoint dp = (DataPoint) it.next();
+			if (++i==50) {
+				s.setReadOnly(dp, false);
+			}
+			dp.setDescription("done!");
+		}
+		t.commit();
+		s.clear();
+		t = s.beginTransaction();
+		List single = s.createQuery("from DataPoint where description='done!'").list();
+		assertEquals( 1, single.size() );
+		s.createQuery("delete from DataPoint").executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	public void testReadOnlySessionModifiableQueryIterate() {
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		Transaction t = s.beginTransaction();
+		for ( int i=0; i<100; i++ ) {
+			DataPoint dp = new DataPoint();
+			dp.setX( new BigDecimal(i * 0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+			dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+			s.save(dp);
+		}
+		t.commit();
+		s.close();
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		t = s.beginTransaction();
+		s.setDefaultReadOnly( true );
+		int i = 0;
+		Iterator it = s.createQuery("from DataPoint dp order by dp.x asc")
+				.setReadOnly( false )
+				.iterate();
+		while ( it.hasNext() ) {
+			DataPoint dp = (DataPoint) it.next();
+			if (++i==50) {
+				s.setReadOnly(dp, true);
+			}
+			dp.setDescription("done!");
+		}
+		t.commit();
+		s.clear();
+		t = s.beginTransaction();
+		List list = s.createQuery("from DataPoint where description='done!'").list();
+		assertEquals( 99, list.size() );
+		s.createQuery("delete from DataPoint").executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	public void testModifiableSessionReadOnlyQueryIterate() {
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		Transaction t = s.beginTransaction();
+		for ( int i=0; i<100; i++ ) {
+			DataPoint dp = new DataPoint();
+			dp.setX( new BigDecimal(i * 0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+			dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+			s.save(dp);
+		}
+		t.commit();
+		s.close();
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		t = s.beginTransaction();
+		assertFalse( s.isDefaultReadOnly() );
+		int i = 0;
+		Iterator it = s.createQuery("from DataPoint dp order by dp.x asc")
+				.setReadOnly( true )
+				.iterate();
+		while ( it.hasNext() ) {
+			DataPoint dp = (DataPoint) it.next();
+			if (++i==50) {
+				s.setReadOnly(dp, false);
+			}
+			dp.setDescription("done!");
+		}
+		t.commit();
+		s.clear();
+		t = s.beginTransaction();
+		List single = s.createQuery("from DataPoint where description='done!'").list();
+		assertEquals( 1, single.size() );
+		s.createQuery("delete from DataPoint").executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	public void testModifiableSessionDefaultQueryReadOnlySessionIterate() {
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		Transaction t = s.beginTransaction();
+		for ( int i=0; i<100; i++ ) {
+			DataPoint dp = new DataPoint();
+			dp.setX( new BigDecimal(i * 0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+			dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+			s.save(dp);
+		}
+		t.commit();
+		s.close();
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		t = s.beginTransaction();
+		s.setDefaultReadOnly( false );
+		int i = 0;
+		Query query = s.createQuery("from DataPoint dp order by dp.x asc");
+		s.setDefaultReadOnly( true );
+		Iterator it = query.iterate();
+		s.setDefaultReadOnly( false );
+		while ( it.hasNext() ) {
+			DataPoint dp = (DataPoint) it.next();
+			if (++i==50) {
+				s.setReadOnly(dp, false);
+			}
+			dp.setDescription("done!");
+		}
+		t.commit();
+		s.clear();
+		t = s.beginTransaction();
+		List single = s.createQuery("from DataPoint where description='done!'").list();
+		assertEquals( 1, single.size() );
+		s.createQuery("delete from DataPoint").executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	public void testQueryReadOnlyIterate() {
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		Transaction t = s.beginTransaction();
+		DataPoint dp = null;
+		for ( int i=0; i<100; i++ ) {
+			dp = new DataPoint();
+			dp.setX( new BigDecimal(i * 0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+			dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+			s.save(dp);
+		}
+		t.commit();
+		s.close();
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		t = s.beginTransaction();
+		s.setDefaultReadOnly( false );
+		int i = 0;
+		Query query = s.createQuery("from DataPoint dp order by dp.x asc");
+		assertFalse( query.isReadOnly() );
+		s.setDefaultReadOnly( true );
+		assertTrue( query.isReadOnly() );
+		s.setDefaultReadOnly( false );
+		assertFalse( query.isReadOnly() );
+		query.setReadOnly( true );
+		assertTrue( query.isReadOnly() );
+		s.setDefaultReadOnly( true );
+		assertTrue( query.isReadOnly() );
+		s.setDefaultReadOnly( false );
+		assertTrue( query.isReadOnly() );
+		query.setReadOnly( false );
+		assertFalse( query.isReadOnly() );
+		s.setDefaultReadOnly( true );
+		assertFalse( query.isReadOnly() );
+		query.setReadOnly( true );
+		assertTrue( query.isReadOnly() );
+		s.setDefaultReadOnly( false );
+		assertFalse( s.isDefaultReadOnly() );
+		Iterator it = query.iterate();
+		assertTrue( query.isReadOnly() );
+		DataPoint dpLast = ( DataPoint ) s.get( DataPoint.class, dp.getId() );
+		assertFalse( s.isReadOnly( dpLast ) );
+		query.setReadOnly( false );
+		assertFalse( query.isReadOnly() );
+		int nExpectedChanges = 0;
+		assertFalse( s.isDefaultReadOnly() );
+		while ( it.hasNext() ) {
+			assertFalse( s.isDefaultReadOnly() );		
+			dp = (DataPoint) it.next();
+			assertFalse( s.isDefaultReadOnly() );
+			if ( dp.getId() == dpLast.getId() ) {
+				//dpLast existed in the session before executing the read-only query
+				assertFalse( s.isReadOnly( dp ) );
+			}
+			else {
+				assertTrue( s.isReadOnly( dp ) );
+			}
+			if (++i==50) {
+				s.setReadOnly(dp, false);
+				nExpectedChanges = ( dp == dpLast ? 1 : 2 );
+			}
+			dp.setDescription("done!");
+		}
+		assertFalse( s.isDefaultReadOnly() );
+		t.commit();
+		s.clear();
+		t = s.beginTransaction();
+		List list = s.createQuery("from DataPoint where description='done!'").list();
+		assertEquals( nExpectedChanges, list.size() );
+		s.createQuery("delete from DataPoint").executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	public void testQueryModifiableIterate() {
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		Transaction t = s.beginTransaction();
+		DataPoint dp = null;
+		for ( int i=0; i<100; i++ ) {
+			dp = new DataPoint();
+			dp.setX( new BigDecimal(i * 0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+			dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+			s.save(dp);
+		}
+		t.commit();
+		s.close();
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		t = s.beginTransaction();
+		s.setDefaultReadOnly( true );
+		int i = 0;
+		Query query = s.createQuery("from DataPoint dp order by dp.x asc");
+		assertTrue( query.isReadOnly() );
+		s.setDefaultReadOnly( false );
+		assertFalse( query.isReadOnly() );
+		s.setDefaultReadOnly( true );
+		assertTrue( query.isReadOnly() );
+		query.setReadOnly( false );
+		assertFalse( query.isReadOnly() );
+		s.setDefaultReadOnly( false );
+		assertFalse( query.isReadOnly() );
+		s.setDefaultReadOnly( true );
+		assertFalse( query.isReadOnly() );
+		query.setReadOnly( true );
+		assertTrue( query.isReadOnly() );
+		s.setDefaultReadOnly( false );
+		assertTrue( query.isReadOnly() );
+		query.setReadOnly( false );
+		assertFalse( query.isReadOnly() );
+		s.setDefaultReadOnly( true );
+		assertTrue( s.isDefaultReadOnly() );
+		Iterator it = query.iterate();
+		assertFalse( query.isReadOnly() );
+		DataPoint dpLast = ( DataPoint ) s.get( DataPoint.class, dp.getId() );
+		assertTrue( s.isReadOnly( dpLast ) );
+		query.setReadOnly( true );
+		assertTrue( query.isReadOnly() );
+		int nExpectedChanges = 0;
+		assertTrue( s.isDefaultReadOnly() );
+		while ( it.hasNext() ) {
+			assertTrue( s.isDefaultReadOnly() );
+			dp = (DataPoint) it.next();
+			assertTrue( s.isDefaultReadOnly() );
+			if ( dp.getId() == dpLast.getId() ) {
+				//dpLast existed in the session before executing the read-only query
+				assertTrue( s.isReadOnly( dp ) );
+			}
+			else {
+				assertFalse( s.isReadOnly( dp ) );
+			}
+			if (++i==50) {
+				s.setReadOnly(dp, true);
+				nExpectedChanges = ( dp == dpLast ? 99 : 98 );
+			}
+			dp.setDescription("done!");
+		}
+		assertTrue( s.isDefaultReadOnly() );
+		t.commit();
+		s.clear();
+		t = s.beginTransaction();
+		List list = s.createQuery("from DataPoint where description='done!'").list();
+		assertEquals( nExpectedChanges, list.size() );
+		s.createQuery("delete from DataPoint").executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	public void testReadOnlyRefresh() {
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		Transaction t = s.beginTransaction();
+		DataPoint dp = new DataPoint();
+		dp.setDescription( "original" );
+		dp.setX( new BigDecimal(0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+		dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+		s.save(dp);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		s.setDefaultReadOnly( true );
+		t = s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dp.getId() );
+		assertTrue( s.isReadOnly( dp ) );
+		assertEquals( "original", dp.getDescription() );
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		s.refresh( dp );
+		assertTrue( s.isReadOnly( dp ) );
+		assertEquals( "original", dp.getDescription() );
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		s.setDefaultReadOnly( false );
+		s.refresh( dp );
+		assertTrue( s.isReadOnly( dp ) );
+		assertEquals( "original", dp.getDescription() );
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		t.commit();
+
+		s.clear();
+		t = s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dp.getId() );
+		assertEquals( "original", dp.getDescription() );
+		s.delete( dp );
+		t.commit();
+		s.close();
+	}
+
+	public void testReadOnlyRefreshDetached() {
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		Transaction t = s.beginTransaction();
+		DataPoint dp = new DataPoint();
+		dp.setDescription( "original" );
+		dp.setX( new BigDecimal(0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+		dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+		s.save(dp);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		t = s.beginTransaction();
+		s.setDefaultReadOnly( false );
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		s.refresh( dp );
+		assertEquals( "original", dp.getDescription() );
+		assertFalse( s.isReadOnly( dp ) );
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		s.evict( dp );
+		s.refresh( dp );
+		assertEquals( "original", dp.getDescription() );
+		assertFalse( s.isReadOnly( dp ) );
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		s.setDefaultReadOnly( true );
+		s.evict( dp );
+		s.refresh( dp );
+		assertEquals( "original", dp.getDescription() );
+		assertTrue( s.isReadOnly( dp ) );
+		dp.setDescription( "changed" );
+		t.commit();
+
+		s.clear();
+		t = s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dp.getId() );
+		assertEquals( "original", dp.getDescription() );
+		s.delete( dp );
+		t.commit();
+		s.close();
+	}
+
+	public void testReadOnlyProxyRefresh() {
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		Transaction t = s.beginTransaction();
+		DataPoint dp = new DataPoint();
+		dp.setDescription( "original" );
+		dp.setX( new BigDecimal(0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+		dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+		s.save(dp);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		t = s.beginTransaction();
+		s.setDefaultReadOnly( true );
+		dp = ( DataPoint ) s.load( DataPoint.class, dp.getId() );
+		assertTrue( s.isReadOnly( dp ) );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		s.refresh( dp );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		assertTrue( s.isReadOnly( dp ) );
+		s.setDefaultReadOnly( false );
+		s.refresh( dp );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		assertTrue( s.isReadOnly( dp ) );
+		assertEquals( "original", dp.getDescription() );
+		assertTrue( Hibernate.isInitialized( dp ) );
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		assertTrue( s.isReadOnly( dp ) );
+		assertTrue( s.isReadOnly( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().getImplementation() ) );
+		s.refresh( dp );
+		assertEquals( "original", dp.getDescription() );
+		assertTrue( s.isReadOnly( dp ) );
+		assertTrue( s.isReadOnly( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().getImplementation() ) );
+		s.setDefaultReadOnly( true );
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		s.refresh( dp );
+		assertTrue( s.isReadOnly( dp ) );
+		assertTrue( s.isReadOnly( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().getImplementation() ) );
+		assertEquals( "original", dp.getDescription() );
+		dp.setDescription( "changed" );
+		t.commit();
+
+		s.clear();
+		t = s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dp.getId() );
+		assertEquals( "original", dp.getDescription() );
+		s.delete( dp );
+		t.commit();
+		s.close();
+
+	}
+
+	public void testReadOnlyProxyRefreshDetached() {
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		Transaction t = s.beginTransaction();
+		DataPoint dp = new DataPoint();
+		dp.setDescription( "original" );
+		dp.setX( new BigDecimal(0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+		dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+		s.save(dp);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		t = s.beginTransaction();
+		s.setDefaultReadOnly( true );
+		dp = ( DataPoint ) s.load( DataPoint.class, dp.getId() );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		assertTrue( s.isReadOnly( dp ) );
+		s.evict( dp );
+		s.refresh( dp );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		s.setDefaultReadOnly( false );
+		assertTrue( s.isReadOnly( dp ) );
+		s.evict( dp );
+		s.refresh( dp );
+		assertFalse( Hibernate.isInitialized( dp ) );
+		assertFalse( s.isReadOnly( dp ) );
+		assertFalse( s.isReadOnly( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().getImplementation() ) );
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		assertTrue( Hibernate.isInitialized( dp ) );
+		s.evict( dp );
+		s.refresh( dp );
+		assertEquals( "original", dp.getDescription() );
+		assertFalse( s.isReadOnly( dp ) );
+		assertFalse( s.isReadOnly( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().getImplementation() ) );
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		s.setDefaultReadOnly( true );
+		s.evict( dp );
+		s.refresh( dp );
+		assertEquals( "original", dp.getDescription() );
+		assertTrue( s.isReadOnly( dp ) );
+		assertTrue( s.isReadOnly( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().getImplementation() ) );		
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		t.commit();
+
+		s.clear();
+		t = s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dp.getId() );
+		assertEquals( "original", dp.getDescription() );
+		s.delete( dp );
+		t.commit();
+		s.close();
+	}
+
+	public void testReadOnlyDelete() {
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		Transaction t = s.beginTransaction();
+		DataPoint dp = new DataPoint();
+		dp.setX( new BigDecimal(0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+		dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+		s.save(dp);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		s.setDefaultReadOnly( true );
+		s.setCacheMode(CacheMode.IGNORE);
+		t = s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dp.getId() );
+		s.setDefaultReadOnly( false );
+		assertTrue( s.isReadOnly( dp ) );
+		s.delete(  dp );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		List list = s.createQuery("from DataPoint where id=" + dp.getId() ).list();
+		assertTrue( list.isEmpty() );
+		t.commit();
+		s.close();
+
+	}
+
+	public void testReadOnlyGetModifyAndDelete() {
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		Transaction t = s.beginTransaction();
+		DataPoint dp = new DataPoint();
+		dp.setX( new BigDecimal(0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+		dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+		s.save(dp);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		s.setDefaultReadOnly( true );
+		s.setCacheMode(CacheMode.IGNORE);
+		t = s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dp.getId() );
+		s.setDefaultReadOnly( true );
+		dp.setDescription( "a DataPoint" );
+		s.delete(  dp );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		List list = s.createQuery("from DataPoint where id=" + dp.getId() ).list();
+		assertTrue( list.isEmpty() );
+		t.commit();
+		s.close();
+
+	}
+
+	public void testReadOnlyModeWithExistingModifiableEntity() {
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		Transaction t = s.beginTransaction();
+		DataPoint dp = null;
+		for ( int i=0; i<100; i++ ) {
+			dp = new DataPoint();
+			dp.setX( new BigDecimal(i * 0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+			dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+			s.save(dp);
+		}
+		t.commit();
+		s.close();
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		t = s.beginTransaction();
+		DataPoint dpLast = ( DataPoint ) s.get( DataPoint.class,  dp.getId() );
+		assertFalse( s.isReadOnly( dpLast ) );
+		s.setDefaultReadOnly( true );
+		int i = 0;
+		ScrollableResults sr = s.createQuery("from DataPoint dp order by dp.x asc")
+				.scroll(ScrollMode.FORWARD_ONLY);
+		s.setDefaultReadOnly( false );
+		int nExpectedChanges = 0;
+		while ( sr.next() ) {
+			dp = (DataPoint) sr.get(0);
+			if ( dp.getId() == dpLast.getId() ) {
+				//dpLast existed in the session before executing the read-only query
+				assertFalse( s.isReadOnly( dp ) );
+			}
+			else {
+				assertTrue( s.isReadOnly( dp ) );
+			}
+			if (++i==50) {
+				s.setReadOnly(dp, false);
+				nExpectedChanges = ( dp == dpLast ? 1 : 2 );
+			}
+			dp.setDescription("done!");
+		}
+		t.commit();
+		s.clear();
+		t = s.beginTransaction();
+		List list = s.createQuery("from DataPoint where description='done!'").list();
+		assertEquals( nExpectedChanges, list.size() );
+		s.createQuery("delete from DataPoint").executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	public void testModifiableModeWithExistingReadOnlyEntity() {
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		Transaction t = s.beginTransaction();
+		DataPoint dp = null;
+		for ( int i=0; i<100; i++ ) {
+			dp = new DataPoint();
+			dp.setX( new BigDecimal(i * 0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+			dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+			s.save(dp);
+		}
+		t.commit();
+		s.close();
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		t = s.beginTransaction();
+		s.setDefaultReadOnly( true );
+		DataPoint dpLast = ( DataPoint ) s.get( DataPoint.class,  dp.getId() );
+		assertTrue( s.isReadOnly( dpLast ) );
+		int i = 0;
+		ScrollableResults sr = s.createQuery("from DataPoint dp order by dp.x asc")
+				.setReadOnly(false)
+				.scroll(ScrollMode.FORWARD_ONLY);
+		int nExpectedChanges = 0;
+		while ( sr.next() ) {
+			dp = (DataPoint) sr.get(0);
+			if ( dp.getId() == dpLast.getId() ) {
+				//dpLast existed in the session before executing the read-only query
+				assertTrue( s.isReadOnly( dp ) );
+			}
+			else {
+				assertFalse( s.isReadOnly( dp ) );
+			}
+			if (++i==50) {
+				s.setReadOnly(dp, true);
+				nExpectedChanges = ( dp == dpLast ? 99 : 98 );
+			}
+			dp.setDescription("done!");
+		}
+		t.commit();
+		s.clear();
+		t = s.beginTransaction();
+		List list = s.createQuery("from DataPoint where description='done!'").list();
+		assertEquals( nExpectedChanges, list.size() );
+		s.createQuery("delete from DataPoint").executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	public void testReadOnlyOnTextType() {
+		final String origText = "some huge text string";
+		final String newText = "some even bigger text string";
+
+		Session s = openSession();
+		s.beginTransaction();
+		s.setCacheMode( CacheMode.IGNORE );
+		TextHolder holder = new TextHolder( origText );
+		s.save( holder );
+		Long id = holder.getId();
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.setDefaultReadOnly( true );
+		s.setCacheMode( CacheMode.IGNORE );
+		holder = ( TextHolder ) s.get( TextHolder.class, id );
+		s.setDefaultReadOnly( false );
+		holder.setTheText( newText );
+		s.flush();
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		holder = ( TextHolder ) s.get( TextHolder.class, id );
+		assertEquals( "change written to database", origText, holder.getTheText() );
+		s.delete( holder );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testMergeWithReadOnlyEntity() {
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		Transaction t = s.beginTransaction();
+		DataPoint dp = new DataPoint();
+		dp.setX( new BigDecimal(0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+		dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+		s.save(dp);
+		t.commit();
+		s.close();
+
+		dp.setDescription( "description" );
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		t = s.beginTransaction();
+		s.setDefaultReadOnly( true );
+		DataPoint dpManaged = ( DataPoint ) s.get( DataPoint.class, new Long( dp.getId() ) );
+		DataPoint dpMerged = ( DataPoint ) s.merge( dp );
+		assertSame( dpManaged, dpMerged );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		dpManaged = ( DataPoint ) s.get( DataPoint.class, new Long( dp.getId() ) );
+		assertNull( dpManaged.getDescription() );
+		s.delete( dpManaged );
+		t.commit();
+		s.close();
+
+	}
+
+	public void testMergeWithReadOnlyProxy() {
+
+		Session s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		Transaction t = s.beginTransaction();
+		DataPoint dp = new DataPoint();
+		dp.setX( new BigDecimal(0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+		dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+		s.save(dp);
+		t.commit();
+		s.close();
+
+		dp.setDescription( "description" );
+
+		s = openSession();
+		s.setCacheMode(CacheMode.IGNORE);
+		t = s.beginTransaction();
+		s.setDefaultReadOnly( true );
+		DataPoint dpProxy = ( DataPoint ) s.load( DataPoint.class, new Long( dp.getId() ) );
+		assertTrue( s.isReadOnly( dpProxy ) );
+		assertFalse( Hibernate.isInitialized( dpProxy ) );
+		s.evict( dpProxy );
+		dpProxy = ( DataPoint ) s.merge( dpProxy );
+		assertTrue( s.isReadOnly( dpProxy ) );
+		assertFalse( Hibernate.isInitialized( dpProxy ) );
+		dpProxy = ( DataPoint ) s.merge( dp );
+		assertTrue( s.isReadOnly( dpProxy ) );
+		assertTrue( Hibernate.isInitialized( dpProxy ) );
+		assertEquals( "description", dpProxy.getDescription() );
+		s.evict( dpProxy );
+		dpProxy = ( DataPoint ) s.merge( dpProxy );
+		assertTrue( s.isReadOnly( dpProxy ) );
+		assertTrue( Hibernate.isInitialized( dpProxy ) );
+		assertEquals( "description", dpProxy.getDescription() );
+		dpProxy.setDescription( null );
+		dpProxy = ( DataPoint ) s.merge( dp );
+		assertTrue( s.isReadOnly( dpProxy ) );
+		assertTrue( Hibernate.isInitialized( dpProxy ) );
+		assertEquals( "description", dpProxy.getDescription() );		
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, new Long( dp.getId() ) );
+		assertNull( dp.getDescription() );
+		s.delete( dp );
+		t.commit();
+		s.close();
+
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/ReadOnlySessionTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/ReadOnlyTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/ReadOnlyTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/ReadOnlyTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,616 @@
+//$Id: ReadOnlyTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.readonly;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.ScrollMode;
+import org.hibernate.ScrollableResults;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * 
+ * @author Gavin King
+ * @author Gail Badner
+ */
+public class ReadOnlyTest extends AbstractReadOnlyTest {
+	
+	public ReadOnlyTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "readonly/DataPoint.hbm.xml", "readonly/TextHolder.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( ReadOnlyTest.class );
+	}
+
+	public void testReadOnlyOnProxies() {
+		clearCounts();
+
+		Session s = openSession();
+		s.beginTransaction();
+		DataPoint dp = new DataPoint();
+		dp.setX( new BigDecimal( 0.1d ).setScale(19, BigDecimal.ROUND_DOWN) );
+		dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+		dp.setDescription( "original" );
+		s.save( dp );
+		long dpId = dp.getId();
+		s.getTransaction().commit();
+		s.close();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		s.beginTransaction();
+		dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpId ) );
+		assertFalse( "was initialized", Hibernate.isInitialized( dp ) );
+		s.setReadOnly( dp, true );
+		assertFalse( "was initialized during setReadOnly", Hibernate.isInitialized( dp ) );
+		dp.setDescription( "changed" );
+		assertTrue( "was not initialized during mod", Hibernate.isInitialized( dp ) );
+		assertEquals( "desc not changed in memory", "changed", dp.getDescription() );
+		s.flush();
+		s.getTransaction().commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+
+		s = openSession();
+		s.beginTransaction();
+		List list = s.createQuery( "from DataPoint where description = 'changed'" ).list();
+		assertEquals( "change written to database", 0, list.size() );
+		assertEquals( 1, s.createQuery("delete from DataPoint").executeUpdate() );
+		s.getTransaction().commit();
+		s.close();
+		
+		assertUpdateCount( 0 );
+		//deletes from Query.executeUpdate() are not tracked
+		//assertDeleteCount( 1 );
+	}
+
+	public void testReadOnlyMode() {
+
+		clearCounts();
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		for ( int i=0; i<100; i++ ) {
+			DataPoint dp = new DataPoint();
+			dp.setX( new BigDecimal(i * 0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+			dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+			s.save(dp);
+		}
+		t.commit();
+		s.close();
+
+		assertInsertCount( 100 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		int i = 0;
+		ScrollableResults sr = s.createQuery("from DataPoint dp order by dp.x asc")
+				.setReadOnly(true)
+				.scroll(ScrollMode.FORWARD_ONLY);
+		while ( sr.next() ) {
+			DataPoint dp = (DataPoint) sr.get(0);
+			if (++i==50) {
+				s.setReadOnly(dp, false);
+			}
+			dp.setDescription("done!");
+		}
+		t.commit();
+
+		assertUpdateCount( 1 );
+		clearCounts();
+
+		s.clear();
+		t = s.beginTransaction();
+		List single = s.createQuery("from DataPoint where description='done!'").list();
+		assertEquals( single.size(), 1 );
+		assertEquals( 100, s.createQuery("delete from DataPoint").executeUpdate() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		//deletes from Query.executeUpdate() are not tracked
+		//assertDeleteCount( 100 );
+	}
+
+	public void testReadOnlyModeAutoFlushOnQuery() {
+		clearCounts();
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		DataPoint dpFirst = null;
+		for ( int i=0; i<100; i++ ) {
+			DataPoint dp = new DataPoint();
+			dp.setX( new BigDecimal(i * 0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+			dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+			s.save(dp);
+		}
+
+		assertInsertCount( 0 );
+		assertUpdateCount( 0 );
+
+		ScrollableResults sr = s.createQuery("from DataPoint dp order by dp.x asc")
+				.setReadOnly(true)
+				.scroll(ScrollMode.FORWARD_ONLY);
+
+		assertInsertCount( 100 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		while ( sr.next() ) {
+			DataPoint dp = (DataPoint) sr.get(0);
+			assertFalse( s.isReadOnly( dp ) );
+			s.delete( dp );
+		}
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 100 );
+	}
+
+	public void testSaveReadOnlyModifyInSaveTransaction() {
+		clearCounts();
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		DataPoint dp = new DataPoint();
+		dp.setDescription( "original" );
+		dp.setX( new BigDecimal(0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+		dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+		s.save(dp);
+		s.setReadOnly( dp, true );
+		dp.setDescription( "different" );
+		t.commit();
+		s.close();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dp.getId() );
+		s.setReadOnly( dp, true );
+		assertEquals( "original", dp.getDescription() );
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		s.refresh( dp );
+		assertEquals( "original", dp.getDescription() );
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		t.commit();
+
+		assertInsertCount( 0 );
+		assertUpdateCount( 0 );
+
+		s.clear();
+		t = s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dp.getId() );
+		assertEquals( "original", dp.getDescription() );
+		s.delete( dp );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 1 );
+		clearCounts();
+	}
+
+	public void testReadOnlyRefresh() {
+		clearCounts();
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		DataPoint dp = new DataPoint();
+		dp.setDescription( "original" );
+		dp.setX( new BigDecimal(0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+		dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+		s.save(dp);
+		t.commit();
+		s.close();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dp.getId() );
+		s.setReadOnly( dp, true );
+		assertEquals( "original", dp.getDescription() );
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		s.refresh( dp );
+		assertEquals( "original", dp.getDescription() );
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		t.commit();
+
+		assertInsertCount( 0 );
+		assertUpdateCount( 0 );
+
+		s.clear();
+		t = s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dp.getId() );
+		assertEquals( "original", dp.getDescription() );
+		s.delete( dp );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 1 );
+		clearCounts();
+	}
+
+	public void testReadOnlyRefreshDetached() {
+		clearCounts();
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		DataPoint dp = new DataPoint();
+		dp.setDescription( "original" );
+		dp.setX( new BigDecimal(0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+		dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+		s.save(dp);
+		t.commit();
+		s.close();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		s.refresh( dp );
+		assertEquals( "original", dp.getDescription() );
+		assertFalse( s.isReadOnly( dp ) );
+		s.setReadOnly( dp, true );
+		dp.setDescription( "changed" );
+		assertEquals( "changed", dp.getDescription() );
+		s.evict( dp );
+		s.refresh( dp );
+		assertEquals( "original", dp.getDescription() );
+		assertFalse( s.isReadOnly( dp ) );
+		t.commit();
+
+		assertInsertCount( 0 );
+		assertUpdateCount( 0 );
+
+		s.clear();
+		t = s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dp.getId() );
+		assertEquals( "original", dp.getDescription() );
+		s.delete( dp );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 1 );
+	}
+
+	public void testReadOnlyDelete() {
+
+		clearCounts();
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		DataPoint dp = new DataPoint();
+		dp.setX( new BigDecimal(0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+		dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+		s.save(dp);
+		t.commit();
+		s.close();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dp.getId() );
+		s.setReadOnly( dp, true );
+		s.delete(  dp );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 1 );
+
+		s = openSession();
+		t = s.beginTransaction();
+		List list = s.createQuery("from DataPoint where description='done!'").list();
+		assertTrue( list.isEmpty() );
+		t.commit();
+		s.close();
+
+	}
+
+	public void testReadOnlyGetModifyAndDelete() {
+		clearCounts();
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		DataPoint dp = new DataPoint();
+		dp.setX( new BigDecimal(0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+		dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+		s.save(dp);
+		t.commit();
+		s.close();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		dp = ( DataPoint ) s.get( DataPoint.class, dp.getId() );
+		s.setReadOnly( dp, true );
+		dp.setDescription( "a DataPoint" );
+		s.delete(  dp );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 1 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		List list = s.createQuery("from DataPoint where description='done!'").list();
+		assertTrue( list.isEmpty() );
+		t.commit();
+		s.close();
+
+	}
+
+	public void testReadOnlyModeWithExistingModifiableEntity() {
+		clearCounts();
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		DataPoint dp = null;
+		for ( int i=0; i<100; i++ ) {
+			dp = new DataPoint();
+			dp.setX( new BigDecimal(i * 0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+			dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+			s.save(dp);
+		}
+		t.commit();
+		s.close();
+
+		assertInsertCount( 100 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		DataPoint dpLast = ( DataPoint ) s.get( DataPoint.class,  dp.getId() );
+		assertFalse( s.isReadOnly( dpLast ) );
+		int i = 0;
+		ScrollableResults sr = s.createQuery("from DataPoint dp order by dp.x asc")
+				.setReadOnly(true)
+				.scroll(ScrollMode.FORWARD_ONLY);
+		int nExpectedChanges = 0;
+		while ( sr.next() ) {
+			dp = (DataPoint) sr.get(0);
+			if ( dp.getId() == dpLast.getId() ) {
+				//dpLast existed in the session before executing the read-only query
+				assertFalse( s.isReadOnly( dp ) );
+			}
+			else {
+				assertTrue( s.isReadOnly( dp ) );
+			}
+			if (++i==50) {
+				s.setReadOnly(dp, false);
+				nExpectedChanges = ( dp == dpLast ? 1 : 2 );
+			}
+			dp.setDescription("done!");
+		}
+		t.commit();
+		s.clear();
+
+		assertInsertCount( 0 );
+		assertUpdateCount( nExpectedChanges );
+		clearCounts();
+
+		t = s.beginTransaction();
+		List list = s.createQuery("from DataPoint where description='done!'").list();
+		assertEquals( list.size(), nExpectedChanges );
+		assertEquals( 100, s.createQuery("delete from DataPoint").executeUpdate() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );				
+	}
+
+	public void testModifiableModeWithExistingReadOnlyEntity() {
+		clearCounts();
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		DataPoint dp = null;
+		for ( int i=0; i<100; i++ ) {
+			dp = new DataPoint();
+			dp.setX( new BigDecimal(i * 0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+			dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+			s.save(dp);
+		}
+		t.commit();
+		s.close();
+
+		assertInsertCount( 100 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		t = s.beginTransaction();
+		DataPoint dpLast = ( DataPoint ) s.get( DataPoint.class,  dp.getId() );
+		assertFalse( s.isReadOnly( dpLast ) );
+		s.setReadOnly( dpLast, true );
+		assertTrue( s.isReadOnly( dpLast ) );
+		dpLast.setDescription( "oy" );
+		int i = 0;
+
+		assertUpdateCount( 0 );
+
+		ScrollableResults sr = s.createQuery("from DataPoint dp order by dp.x asc")
+				.setReadOnly(false)
+				.scroll(ScrollMode.FORWARD_ONLY);
+		int nExpectedChanges = 0;
+		while ( sr.next() ) {
+			dp = (DataPoint) sr.get(0);
+			if ( dp.getId() == dpLast.getId() ) {
+				//dpLast existed in the session before executing the read-only query
+				assertTrue( s.isReadOnly( dp ) );
+			}
+			else {
+				assertFalse( s.isReadOnly( dp ) );
+			}
+			if (++i==50) {
+				s.setReadOnly(dp, true);
+				nExpectedChanges = ( dp == dpLast ? 99 : 98 );
+			}
+			dp.setDescription("done!");
+		}
+		t.commit();
+		s.clear();
+
+		assertUpdateCount( nExpectedChanges );
+		clearCounts();
+
+		t = s.beginTransaction();
+		List list = s.createQuery("from DataPoint where description='done!'").list();
+		assertEquals( list.size(), nExpectedChanges );
+		assertEquals( 100, s.createQuery("delete from DataPoint").executeUpdate() );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );		
+	}
+
+	public void testReadOnlyOnTextType() {
+		final String origText = "some huge text string";
+		final String newText = "some even bigger text string";
+
+		clearCounts();
+
+		Session s = openSession();
+		s.beginTransaction();
+		TextHolder holder = new TextHolder( origText );
+		s.save( holder );
+		Long id = holder.getId();
+		s.getTransaction().commit();
+		s.close();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		s.beginTransaction();
+		holder = ( TextHolder ) s.get( TextHolder.class, id );
+		s.setReadOnly( holder, true );
+		holder.setTheText( newText );
+		s.flush();
+		s.getTransaction().commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+
+		s = openSession();
+		s.beginTransaction();
+		holder = ( TextHolder ) s.get( TextHolder.class, id );
+		assertEquals( "change written to database", origText, holder.getTheText() );
+		s.delete( holder );
+		s.getTransaction().commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 1 );
+	}
+
+	public void testMergeWithReadOnlyEntity() {
+		clearCounts();
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		DataPoint dp = new DataPoint();
+		dp.setX( new BigDecimal(0.1d).setScale(19, BigDecimal.ROUND_DOWN) );
+		dp.setY( new BigDecimal( Math.cos( dp.getX().doubleValue() ) ).setScale(19, BigDecimal.ROUND_DOWN) );
+		s.save(dp);
+		t.commit();
+		s.close();
+
+		assertInsertCount( 1 );
+		assertUpdateCount( 0 );
+		clearCounts();
+
+		dp.setDescription( "description" );
+
+		s = openSession();
+		t = s.beginTransaction();
+		DataPoint dpManaged = ( DataPoint ) s.get( DataPoint.class, new Long( dp.getId() ) );
+		s.setReadOnly( dpManaged, true );
+		DataPoint dpMerged = ( DataPoint ) s.merge( dp );
+		assertSame( dpManaged, dpMerged );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+
+		s = openSession();
+		t = s.beginTransaction();
+		dpManaged = ( DataPoint ) s.get( DataPoint.class, new Long( dp.getId() ) );
+		assertNull( dpManaged.getDescription() );
+		s.delete( dpManaged );
+		t.commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 1 );
+
+	}
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/ReadOnlyTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/ReadOnlyVersionedNodesTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/ReadOnlyVersionedNodesTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/ReadOnlyVersionedNodesTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,695 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.readonly;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gail Badner
+ */
+public class ReadOnlyVersionedNodesTest extends AbstractReadOnlyTest {
+
+	public ReadOnlyVersionedNodesTest(String str) {
+		super( str );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "readonly/VersionedNode.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( ReadOnlyVersionedNodesTest.class );
+	}
+
+	public void testSetReadOnlyTrueAndFalse() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		VersionedNode node = new VersionedNode( "node", "node" );
+		s.persist( node );
+		s.getTransaction().commit();
+		s.close();
+
+		clearCounts();
+
+		s = openSession();
+
+		s.beginTransaction();
+		node = ( VersionedNode ) s.get( VersionedNode.class, node.getId() );
+		s.setReadOnly( node, true );
+		node.setName( "node-name" );
+		s.getTransaction().commit();
+
+		assertUpdateCount( 0 );
+		assertInsertCount( 0 );
+
+		// the changed name is still in node
+		assertEquals( "node-name", node.getName() );
+
+		s.beginTransaction();
+		node = ( VersionedNode ) s.get( VersionedNode.class, node.getId() );
+		// the changed name is still in the session
+		assertEquals( "node-name", node.getName() );
+		s.refresh( node );
+		// after refresh, the name reverts to the original value
+		assertEquals( "node", node.getName() );
+		node = ( VersionedNode ) s.get( VersionedNode.class, node.getId() );
+		assertEquals( "node", node.getName() );
+		s.getTransaction().commit();
+
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertInsertCount( 0 );
+
+		s = openSession();
+		s.beginTransaction();
+		node = ( VersionedNode ) s.get( VersionedNode.class, node.getId() );
+		assertEquals( "node", node.getName() );
+		s.setReadOnly( node, true );
+		node.setName( "diff-node-name" );
+		s.flush();
+		assertEquals( "diff-node-name", node.getName() );
+		s.refresh( node );
+		assertEquals( "node", node.getName() );
+		s.setReadOnly( node, false );
+		node.setName( "diff-node-name" );
+		s.getTransaction().commit();
+		s.close();
+
+		assertUpdateCount( 1 );
+		assertInsertCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		s.beginTransaction();
+		node = ( VersionedNode ) s.get( VersionedNode.class, node.getId() );
+		assertEquals( "diff-node-name", node.getName() );
+		assertEquals( 1, node.getVersion() );
+		s.setReadOnly( node, true );
+		s.delete( node );
+		s.getTransaction().commit();
+		s.close();
+		
+		assertUpdateCount( 0 );
+		assertDeleteCount( 1 );
+	}
+
+	public void testUpdateSetReadOnlyTwice() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		VersionedNode node = new VersionedNode( "node", "node" );
+		s.persist( node );
+		s.getTransaction().commit();
+		s.close();
+ 
+		clearCounts();
+
+		s = openSession();
+
+		s.beginTransaction();
+		node = ( VersionedNode ) s.get( VersionedNode.class, node.getId() );
+		node.setName( "node-name" );
+		s.setReadOnly( node, true );
+		s.setReadOnly( node, true );
+		s.getTransaction().commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertInsertCount( 0 );
+
+		s = openSession();
+		s.beginTransaction();
+		node = ( VersionedNode ) s.get( VersionedNode.class, node.getId() );
+		assertEquals( "node", node.getName() );
+		assertEquals( 0, node.getVersion() );
+		s.setReadOnly( node, true );
+		s.delete( node );
+		s.getTransaction().commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 1 );
+	}
+
+	public void testUpdateSetModifiable() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		VersionedNode node = new VersionedNode( "node", "node" );
+		s.persist( node );
+		s.getTransaction().commit();
+		s.close();
+ 
+		clearCounts();
+
+		s = openSession();
+
+		s.beginTransaction();
+		node = ( VersionedNode ) s.get( VersionedNode.class, node.getId() );
+		node.setName( "node-name" );
+		s.setReadOnly( node, false );
+		s.getTransaction().commit();
+		s.close();
+
+		assertUpdateCount( 1 );
+		assertInsertCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		s.beginTransaction();
+		node = ( VersionedNode ) s.get( VersionedNode.class, node.getId() );
+		assertEquals( "node-name", node.getName() );
+		assertEquals( 1, node.getVersion() );
+		s.setReadOnly( node, true );
+		s.delete( node );
+		s.getTransaction().commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 1 );
+	}
+
+	public void testUpdateSetReadOnlySetModifiableFailureExpected() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		VersionedNode node = new VersionedNode( "node", "node" );
+		s.persist( node );
+		s.getTransaction().commit();
+		s.close();
+
+		clearCounts();
+
+		s = openSession();
+
+		s.beginTransaction();
+		node = ( VersionedNode ) s.get( VersionedNode.class, node.getId() );
+		node.setName( "node-name" );
+		s.setReadOnly( node, true );
+		s.setReadOnly( node, false );
+		s.getTransaction().commit();
+		s.close();
+
+		assertUpdateCount( 1 );
+		assertInsertCount( 0 );
+
+		s = openSession();
+		s.beginTransaction();
+		node = ( VersionedNode ) s.get( VersionedNode.class, node.getId() );
+		assertEquals( "node-name", node.getName() );
+		assertEquals( 1, node.getVersion() );
+		s.delete( node );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testSetReadOnlyUpdateSetModifiableFailureExpected() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		VersionedNode node = new VersionedNode( "node", "node" );
+		s.persist( node );
+		s.getTransaction().commit();
+		s.close();
+
+		clearCounts();
+
+		s = openSession();
+
+		s.beginTransaction();
+		node = ( VersionedNode ) s.get( VersionedNode.class, node.getId() );
+		s.setReadOnly( node, true );
+		node.setName( "node-name" );
+		s.setReadOnly( node, false );
+		s.getTransaction().commit();
+		s.close();
+
+		assertUpdateCount( 1 );
+		assertInsertCount( 0 );
+
+		s = openSession();
+		s.beginTransaction();
+		node = ( VersionedNode ) s.get( VersionedNode.class, node.getId() );
+		assertEquals( "node-name", node.getName() );
+		assertEquals( 1, node.getVersion() );
+		s.delete( node );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testAddNewChildToReadOnlyParent() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		VersionedNode parent = new VersionedNode( "parent", "parent" );
+		s.persist( parent );
+		s.getTransaction().commit();
+		s.close();
+
+		clearCounts();
+
+		s = openSession();
+		s.beginTransaction();
+		VersionedNode parentManaged = ( VersionedNode ) s.get( VersionedNode.class, parent.getId() );
+		s.setReadOnly( parentManaged, true );
+		parentManaged.setName( "new parent name" );
+		VersionedNode child = new VersionedNode( "child", "child");
+		parentManaged.addChild( child );
+		s.getTransaction().commit();
+		s.close();
+
+		assertUpdateCount( 1 );
+		assertInsertCount( 1 );
+
+		s = openSession();
+		s.beginTransaction();
+		parent = ( VersionedNode ) s.get( VersionedNode.class, parent.getId() );
+		assertEquals( "parent", parent.getName() );
+		assertEquals( 1, parent.getChildren().size() );
+		assertEquals( 1, parent.getVersion() );
+		child = ( VersionedNode ) s.get( VersionedNode.class, child.getId() );
+		assertNotNull( child );
+		s.delete( parent );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testUpdateParentWithNewChildCommitWithReadOnlyParent() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		VersionedNode parent = new VersionedNode( "parent", "parent" );
+		s.persist( parent );
+		s.getTransaction().commit();
+		s.close();
+
+		clearCounts();
+
+		parent.setName( "new parent name" );
+		VersionedNode child = new VersionedNode( "child", "child");
+		parent.addChild( child );
+
+		s = openSession();
+		s.beginTransaction();
+		s.update( parent );
+		s.setReadOnly( parent, true );
+		s.getTransaction().commit();
+		s.close();
+
+		assertUpdateCount( 1 );
+		assertInsertCount( 1 );
+		clearCounts();
+
+		s = openSession();
+		s.beginTransaction();
+		parent = ( VersionedNode ) s.get( VersionedNode.class, parent.getId() );
+		child = ( VersionedNode ) s.get( VersionedNode.class, child.getId() );
+		assertEquals( parent.getName(), "parent" );
+		assertEquals( 1, parent.getChildren().size() );
+		assertEquals( 1, parent.getVersion() );
+		assertSame( parent, child.getParent() );
+		assertSame( child, parent.getChildren().iterator().next() );
+		assertEquals( 0, child.getVersion() );
+		s.setReadOnly( parent, true );
+		s.setReadOnly( child, true );
+		s.delete( parent );
+		s.delete( child );
+		s.getTransaction().commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 2 );
+	}
+
+	public void testMergeDetachedParentWithNewChildCommitWithReadOnlyParent() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		VersionedNode parent = new VersionedNode( "parent", "parent" );
+		s.persist( parent );
+		s.getTransaction().commit();
+		s.close();
+
+		clearCounts();
+
+		parent.setName( "new parent name" );
+		VersionedNode child = new VersionedNode( "child", "child");
+		parent.addChild( child );
+
+		s = openSession();
+		s.beginTransaction();
+		parent = ( VersionedNode ) s.merge( parent );
+		s.setReadOnly( parent, true );
+		s.getTransaction().commit();
+		s.close();
+
+		assertUpdateCount( 1 );
+		assertInsertCount( 1 );
+		clearCounts();
+
+		s = openSession();
+		s.beginTransaction();
+		parent = ( VersionedNode ) s.get( VersionedNode.class, parent.getId() );
+		child = ( VersionedNode ) s.get( VersionedNode.class, child.getId() );
+		assertEquals( parent.getName(), "parent" );
+		assertEquals( 1, parent.getChildren().size() );
+		assertEquals( 1, parent.getVersion() );
+		assertSame( parent, child.getParent() );
+		assertSame( child, parent.getChildren().iterator().next() );
+		assertEquals( 0, child.getVersion() );
+		s.setReadOnly( parent, true );
+		s.setReadOnly( child, true );
+		s.delete( parent );
+		s.delete( child );
+		s.getTransaction().commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 2 );
+	}
+
+	public void testGetParentMakeReadOnlyThenMergeDetachedParentWithNewChildC() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		VersionedNode parent = new VersionedNode( "parent", "parent" );
+		s.persist( parent );
+		s.getTransaction().commit();
+		s.close();
+
+		clearCounts();
+
+		parent.setName( "new parent name" );
+		VersionedNode child = new VersionedNode( "child", "child");
+		parent.addChild( child );
+
+		s = openSession();
+		s.beginTransaction();
+		VersionedNode parentManaged = ( VersionedNode ) s.get( VersionedNode.class, parent.getId() );
+		s.setReadOnly( parentManaged, true );
+		VersionedNode parentMerged = ( VersionedNode ) s.merge( parent );
+		assertSame( parentManaged, parentMerged );
+		s.getTransaction().commit();
+		s.close();
+
+		assertUpdateCount( 1 );
+		assertInsertCount( 1 );
+		clearCounts();
+
+		s = openSession();
+		s.beginTransaction();
+		parent = ( VersionedNode ) s.get( VersionedNode.class, parent.getId() );
+		child = ( VersionedNode ) s.get( VersionedNode.class, child.getId() );
+		assertEquals( parent.getName(), "parent" );
+		assertEquals( 1, parent.getChildren().size() );
+		assertEquals( 1, parent.getVersion() );
+		assertSame( parent, child.getParent() );
+		assertSame( child, parent.getChildren().iterator().next() );
+		assertEquals( 0, child.getVersion() );
+		s.delete( parent );
+		s.delete( child );
+		s.getTransaction().commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 2 );
+	}
+
+	public void testMergeUnchangedDetachedParentChildren() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		VersionedNode parent = new VersionedNode( "parent", "parent" );
+		VersionedNode child = new VersionedNode( "child", "child");
+		parent.addChild( child );
+		s.persist( parent );
+		s.getTransaction().commit();
+		s.close();
+
+		clearCounts();
+
+		s = openSession();
+		s.beginTransaction();
+		parent = ( VersionedNode ) s.merge( parent );
+		s.getTransaction().commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertInsertCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		s.beginTransaction();
+		VersionedNode parentGet = ( VersionedNode ) s.get( parent.getClass(), parent.getId() );
+		s.merge( parent );
+		s.getTransaction().commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertInsertCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		s.beginTransaction();
+		VersionedNode parentLoad = ( VersionedNode ) s.load( parent.getClass(), parent.getId() );
+		s.merge( parent );
+		s.getTransaction().commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertInsertCount( 0 );
+		clearCounts();
+
+		s = openSession();
+		s.beginTransaction();
+		parent = ( VersionedNode ) s.get( VersionedNode.class, parent.getId() );
+		child = ( VersionedNode ) s.get( VersionedNode.class, child.getId() );
+		assertEquals( parent.getName(), "parent" );
+		assertEquals( 1, parent.getChildren().size() );
+		assertEquals( 0, parent.getVersion() );
+		assertSame( parent, child.getParent() );
+		assertSame( child, parent.getChildren().iterator().next() );
+		assertEquals( 0, child.getVersion() );
+		s.delete( parent );
+		s.delete( child );
+		s.getTransaction().commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 2 );
+	}
+
+	public void testAddNewParentToReadOnlyChild() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		VersionedNode child = new VersionedNode( "child", "child" );
+		s.persist( child );
+		s.getTransaction().commit();
+		s.close();
+
+		clearCounts();
+
+		s = openSession();
+		s.beginTransaction();
+		VersionedNode childManaged = ( VersionedNode ) s.get( VersionedNode.class, child.getId() );
+		s.setReadOnly( childManaged, true );
+		childManaged.setName( "new child name" );
+		VersionedNode parent = new VersionedNode( "parent", "parent");
+		parent.addChild( childManaged );
+		s.getTransaction().commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertInsertCount( 1 );
+
+		s = openSession();
+		s.beginTransaction();
+		child = ( VersionedNode ) s.get( VersionedNode.class, child.getId() );
+		assertEquals( "child", child.getName() );
+		assertNull( child.getParent() );
+		assertEquals( 0, child.getVersion() );
+		parent = ( VersionedNode ) s.get( VersionedNode.class, parent.getId() );
+		assertNotNull( parent );
+		s.setReadOnly( child, true );
+		s.delete( child );
+		s.getTransaction().commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 1 );
+	}
+
+	public void testUpdateChildWithNewParentCommitWithReadOnlyChild() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		VersionedNode child = new VersionedNode( "child", "child" );
+		s.persist( child );
+		s.getTransaction().commit();
+		s.close();
+
+		clearCounts();
+
+		child.setName( "new child name" );
+		VersionedNode parent = new VersionedNode( "parent", "parent");
+		parent.addChild( child );
+
+		s = openSession();
+		s.beginTransaction();
+		s.update( child );
+		s.setReadOnly( child, true );
+		s.getTransaction().commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertInsertCount( 1 );
+		clearCounts();
+
+		s = openSession();
+		s.beginTransaction();
+		parent = ( VersionedNode ) s.get( VersionedNode.class, parent.getId() );
+		child = ( VersionedNode ) s.get( VersionedNode.class, child.getId() );
+		assertEquals( child.getName(), "child" );
+		assertNull( child.getParent() );
+		assertEquals( 0, child.getVersion() );
+		assertNotNull( parent );
+		assertEquals( 0, parent.getChildren().size() );
+		assertEquals( 0, parent.getVersion() );
+		s.setReadOnly( parent, true );
+		s.setReadOnly( child, true );
+		s.delete( parent );
+		s.delete( child );
+		s.getTransaction().commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 2 );
+	}
+
+	public void testMergeDetachedChildWithNewParentCommitWithReadOnlyChild() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		VersionedNode child = new VersionedNode( "child", "child" );
+		s.persist( child );
+		s.getTransaction().commit();
+		s.close();
+
+		clearCounts();
+
+		child.setName( "new child name" );
+		VersionedNode parent = new VersionedNode( "parent", "parent");
+		parent.addChild( child );
+
+		s = openSession();
+		s.beginTransaction();
+		child = ( VersionedNode ) s.merge( child );
+		s.setReadOnly( child, true );
+		s.getTransaction().commit();
+		s.close();
+
+		assertUpdateCount( 1 );
+		assertInsertCount( 1 );
+		clearCounts();
+
+		s = openSession();
+		s.beginTransaction();
+		parent = ( VersionedNode ) s.get( VersionedNode.class, parent.getId() );
+		child = ( VersionedNode ) s.get( VersionedNode.class, child.getId() );
+		assertEquals( child.getName(), "child" );
+		assertNull( child.getParent() );
+		assertEquals( 0, child.getVersion() );
+		assertNotNull( parent );
+		assertEquals( 0, parent.getChildren().size() );
+		assertEquals( 1, parent.getVersion() );	// hmmm, why is was version updated?
+		s.setReadOnly( parent, true );
+		s.setReadOnly( child, true );
+		s.delete( parent );
+		s.delete( child );
+		s.getTransaction().commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 2 );
+	}
+
+	public void testGetChildMakeReadOnlyThenMergeDetachedChildWithNewParent() throws Exception {
+		Session s = openSession();
+		s.beginTransaction();
+		VersionedNode child = new VersionedNode( "child", "child" );
+		s.persist( child );
+		s.getTransaction().commit();
+		s.close();
+
+		clearCounts();
+
+		child.setName( "new child name" );
+		VersionedNode parent = new VersionedNode( "parent", "parent");
+		parent.addChild( child );
+
+		s = openSession();
+		s.beginTransaction();
+		VersionedNode childManaged = ( VersionedNode ) s.get( VersionedNode.class, child.getId() );
+		s.setReadOnly( childManaged, true );
+		VersionedNode childMerged = ( VersionedNode ) s.merge( child );
+		assertSame( childManaged, childMerged );
+		s.getTransaction().commit();
+		s.close();
+
+		assertUpdateCount( 1 );
+		assertInsertCount( 1 );
+		clearCounts();
+
+		s = openSession();
+		s.beginTransaction();
+		parent = ( VersionedNode ) s.get( VersionedNode.class, parent.getId() );
+		child = ( VersionedNode ) s.get( VersionedNode.class, child.getId() );
+		assertEquals( child.getName(), "child" );
+		assertNull( child.getParent() );
+		assertEquals( 0, child.getVersion() );
+		assertNotNull( parent );
+		assertEquals( 0, parent.getChildren().size() );
+		assertEquals( 1, parent.getVersion() ); // / hmmm, why is was version updated?
+		s.setReadOnly( parent, true );
+		s.setReadOnly( child, true );
+		s.delete( parent );
+		s.delete( child );
+		s.getTransaction().commit();
+		s.close();
+
+		assertUpdateCount( 0 );
+		assertDeleteCount( 2 );
+	}
+
+	protected void cleanupTest() throws Exception {
+		cleanup();
+		super.cleanupTest();
+	}
+
+	private void cleanup() {
+		Session s = sfi().openSession();
+		s.beginTransaction();
+
+		s.createQuery( "delete from VersionedNode where parent is not null" ).executeUpdate();
+		s.createQuery( "delete from VersionedNode" ).executeUpdate();
+
+		s.getTransaction().commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/ReadOnlyVersionedNodesTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/Student.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/Student.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/Student.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,47 @@
+//$Id: Student.java 9116 2006-01-23 21:21:01Z steveebersole $
+package org.hibernate.test.readonly;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author Gavin King
+ */
+public class Student {
+	private long studentNumber;
+	private String name;
+	private Course preferredCourse;
+	private Set enrolments = new HashSet();
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public long getStudentNumber() {
+		return studentNumber;
+	}
+
+	public void setStudentNumber(long studentNumber) {
+		this.studentNumber = studentNumber;
+	}
+
+	public Course getPreferredCourse() {
+		return preferredCourse;
+	}
+
+	public void setPreferredCourse(Course preferredCourse) {
+		this.preferredCourse = preferredCourse;
+	}
+
+	public Set getEnrolments() {
+		return enrolments;
+	}
+
+	public void setEnrolments(Set employments) {
+		this.enrolments = employments;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/Student.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/StudentDTO.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/StudentDTO.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/StudentDTO.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,26 @@
+/*
+ * Created on 28-Jan-2005
+ *
+ */
+package org.hibernate.test.readonly;
+
+/**
+ * @author max
+ *
+ */
+public class StudentDTO {
+
+	private String studentName;
+	private String courseDescription;
+
+	public StudentDTO() { }
+	
+	public String getName() {
+		return studentName;
+	}
+	
+	public String getDescription() {
+		return courseDescription;
+	}
+	
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/StudentDTO.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/TextHolder.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/TextHolder.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/TextHolder.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+  ~ Copyright (c) 2007, Red Hat Middleware, LLC. All rights reserved.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, v. 2.1. This program is distributed in the
+  ~ hope that it will be useful, but WITHOUT A WARRANTY; without even the implied
+  ~ warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  ~ Lesser General Public License for more details. You should have received a
+  ~ copy of the GNU Lesser General Public License, v.2.1 along with this
+  ~ distribution; if not, write to the Free Software Foundation, Inc.,
+  ~ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+  ~
+  ~ Red Hat Author(s): Steve Ebersole
+  -->
+<hibernate-mapping package="org.hibernate.test.readonly">
+
+	<class name="TextHolder" >
+		<id name="id">
+			<generator class="increment"/>
+		</id>
+		<property name="theText" column="TXT" type="text"/>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/TextHolder.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/TextHolder.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/TextHolder.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/TextHolder.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2007, Red Hat Middleware, LLC. All rights reserved.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, v. 2.1. This program is distributed in the
+ * hope that it will be useful, but WITHOUT A WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details. You should have received a
+ * copy of the GNU Lesser General Public License, v.2.1 along with this
+ * distribution; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Red Hat Author(s): Steve Ebersole
+ */
+package org.hibernate.test.readonly;
+
+/**
+ * TextHolder implementation
+ *
+ * @author Steve Ebersole
+ */
+public class TextHolder {
+	private Long id;
+	private String theText;
+
+	public TextHolder() {
+	}
+
+	public TextHolder(String theText) {
+		this.theText = theText;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getTheText() {
+		return theText;
+	}
+
+	public void setTheText(String theText) {
+		this.theText = theText;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/TextHolder.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/VersionedNode.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/VersionedNode.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/VersionedNode.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.readonly">
+
+	<class name="VersionedNode" table="V_NODE">
+		<id name="id" column="ID" type="string">
+			<generator class="assigned"/>
+		</id>
+        <version name="version" column="VERS" type="long" />
+        <property name="name" column="NAME" type="string" />
+        <many-to-one name="parent" class="VersionedNode" cascade="persist,merge,save-update,evict,delete"/>
+        <set name="children"
+			inverse="true"
+			cascade="persist,merge,save-update,evict,delete">
+			<key column="parent"/>
+			<one-to-many class="VersionedNode"/>
+		</set>
+    </class>
+
+</hibernate-mapping>
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/VersionedNode.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/VersionedNode.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/VersionedNode.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/readonly/VersionedNode.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,96 @@
+//$Id: $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.readonly;
+
+import java.util.Set;
+import java.util.HashSet;
+
+/**
+ * VersionedNode
+ *
+ * @author Gail Badner
+ */
+public class VersionedNode {
+	private String id;
+	private String name;
+	private long version;
+
+	private VersionedNode parent;
+	private Set children = new HashSet();
+
+	public VersionedNode() {
+	}
+
+	public VersionedNode(String id, String name) {
+		this.id = id;
+		this.name = name;
+	}
+
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public long getVersion() {
+		return version;
+	}
+
+	public void setVersion(long version) {
+		this.version = version;
+	}
+
+	public VersionedNode getParent() {
+		return parent;
+	}
+
+	public void setParent(VersionedNode parent) {
+		this.parent = parent;
+	}
+
+	public Set getChildren() {
+		return children;
+	}
+
+	public void setChildren(Set children) {
+		this.children = children;
+	}
+
+	public void addChild(VersionedNode child) {
+		child.setParent( this );
+		children.add( child );
+	}
+}

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/reattachment/Child.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/reattachment/Child.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/reattachment/Child.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,34 @@
+package org.hibernate.test.reattachment;
+
+/**
+ * Child entity
+ *
+ * @author Steve Ebersole
+ */
+public class Child {
+	private String name;
+	private Parent parent;
+
+	public Child() {
+	}
+
+	public Child(String name) {
+		this.name = name;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Parent getParent() {
+		return parent;
+	}
+
+	public void setParent(Parent parent) {
+		this.parent = parent;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/reattachment/Child.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/reattachment/CollectionReattachmentTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/reattachment/CollectionReattachmentTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/reattachment/CollectionReattachmentTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,78 @@
+package org.hibernate.test.reattachment;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.Session;
+
+/**
+ * Test of collection reattachment semantics
+ *
+ * @author Steve Ebersole
+ */
+public class CollectionReattachmentTest extends FunctionalTestCase {
+	public CollectionReattachmentTest(String string) {
+		super( string );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( CollectionReattachmentTest.class );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "reattachment/Mappings.hbm.xml" };
+	}
+
+	public void testUpdateOwnerAfterClear() {
+		Session s = openSession();
+		s.beginTransaction();
+		Parent p = new Parent( "p" );
+		p.getChildren().add( new Child( "c" ) );
+		s.save( p );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		p = ( Parent ) s.get( Parent.class, "p" );
+		// clear...
+		s.clear();
+		// now try to reattach...
+		s.update( p );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.delete( p );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testUpdateOwnerAfterEvict() {
+		Session s = openSession();
+		s.beginTransaction();
+		Parent p = new Parent( "p" );
+		p.getChildren().add( new Child( "c" ) );
+		s.save( p );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		p = ( Parent ) s.get( Parent.class, "p" );
+		// evict...
+		s.evict( p );
+		// now try to reattach...
+		s.update( p );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.delete( p );
+		s.getTransaction().commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/reattachment/CollectionReattachmentTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/reattachment/Mappings.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/reattachment/Mappings.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/reattachment/Mappings.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+
+<hibernate-mapping package="org.hibernate.test.reattachment">
+
+    <class name="Parent">
+		<id name="name" column="NAME" type="string" />
+        <set name="children" inverse="true" cascade="all">
+            <key column="PARENT" />
+            <one-to-many class="Child" />
+        </set>
+	</class>
+
+    <class name="Child">
+        <id name="name" column="NAME" type="string"/>
+        <many-to-one name="parent" class="Parent" cascade="none" />
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/reattachment/Mappings.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/reattachment/Parent.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/reattachment/Parent.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/reattachment/Parent.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,37 @@
+package org.hibernate.test.reattachment;
+
+import java.util.Set;
+import java.util.HashSet;
+
+/**
+ * Parent entity
+ *
+ * @author Steve Ebersole
+ */
+public class Parent {
+	private String name;
+	private Set children = new HashSet();
+
+	public Parent() {
+	}
+
+	public Parent(String name) {
+		this.name = name;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Set getChildren() {
+		return children;
+	}
+
+	public void setChildren(Set children) {
+		this.children = children;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/reattachment/Parent.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/reattachment/ProxyReattachmentTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/reattachment/ProxyReattachmentTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/reattachment/ProxyReattachmentTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,227 @@
+package org.hibernate.test.reattachment;
+
+import java.util.Set;
+import java.util.Iterator;
+import java.util.HashSet;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.Session;
+
+/**
+ * Test of proxy reattachment semantics
+ *
+ * @author Steve Ebersole
+ */
+public class ProxyReattachmentTest extends FunctionalTestCase {
+	public ProxyReattachmentTest(String string) {
+		super( string );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( ProxyReattachmentTest.class );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "reattachment/Mappings.hbm.xml" };
+	}
+
+	public void testUpdateAfterEvict() {
+		Session s = openSession();
+		s.beginTransaction();
+		Parent p = new Parent( "p" );
+		s.save( p );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		p = ( Parent ) s.load( Parent.class, "p" );
+		// evict...
+		s.evict( p );
+		// now try to reattach...
+		s.update( p );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.delete( p );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testUpdateAfterClear() {
+		Session s = openSession();
+		s.beginTransaction();
+		Parent p = new Parent( "p" );
+		s.save( p );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		p = ( Parent ) s.load( Parent.class, "p" );
+		// clear...
+		s.clear();
+		// now try to reattach...
+		s.update( p );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.delete( p );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testIterateWithClearTopOfLoop() {
+		Session s = openSession();
+		s.beginTransaction();
+		Set parents = new HashSet();
+		for (int i=0; i<5; i++) {
+			Parent p = new Parent( String.valueOf( i ) );
+			Child child = new Child( "child" + i );
+			child.setParent( p );
+			p.getChildren().add( child );
+			s.save( p );
+			parents.add(p);
+		}
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		int i = 0;
+		for ( Iterator it = s.createQuery( "from Parent" ).iterate(); it.hasNext(); ) {
+			i++;
+			if (i % 2 == 0) {
+				s.flush();
+				s.clear();
+			}
+			Parent p = (Parent) it.next();
+			assertEquals( 1, p.getChildren().size() );
+		}
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		for (Iterator it=parents.iterator(); it.hasNext(); ) {
+			s.delete(it.next());
+		}
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testIterateWithClearBottomOfLoop() {
+		Session s = openSession();
+		s.beginTransaction();
+		Set parents = new HashSet();
+		for (int i=0; i<5; i++) {
+			Parent p = new Parent( String.valueOf( i ) );
+			Child child = new Child( "child" + i );
+			child.setParent( p );
+			p.getChildren().add( child );
+			s.save( p );
+			parents.add(p);
+		}
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		int i = 0;
+		for (Iterator it = s.createQuery( "from Parent" ).iterate(); it.hasNext(); ) {
+			Parent p = (Parent) it.next();
+			assertEquals( 1, p.getChildren().size() );
+			i++;
+			if (i % 2 == 0) {
+				s.flush();
+				s.clear();
+			}
+		}
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		for (Iterator it=parents.iterator(); it.hasNext(); ) {
+			s.delete(it.next());
+		}
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testIterateWithEvictTopOfLoop() {
+		Session s = openSession();
+		s.beginTransaction();
+		Set parents = new HashSet();
+		for (int i=0; i<5; i++) {
+			Parent p = new Parent( String.valueOf( i + 100 ) );
+			Child child = new Child( "child" + i );
+			child.setParent( p );
+			p.getChildren().add( child );
+			s.save( p );
+			parents.add(p);
+		}
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		Parent p = null;
+		for (Iterator it = s.createQuery( "from Parent" ).iterate(); it.hasNext(); ) {
+			if ( p != null) { s.evict(p); }
+			p = (Parent) it.next();
+			assertEquals( 1, p.getChildren().size() );
+		}
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		for (Iterator it=parents.iterator(); it.hasNext(); ) {
+			s.delete(it.next());
+		}
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testIterateWithEvictBottomOfLoop() {
+		Session s = openSession();
+		s.beginTransaction();
+		Set parents = new HashSet();
+		for (int i=0; i<5; i++) {
+			Parent p = new Parent( String.valueOf( i + 100 ) );
+			Child child = new Child( "child" + i );
+			child.setParent( p );
+			p.getChildren().add( child );
+			s.save( p );
+			parents.add(p);
+		}
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		for (Iterator it = s.createQuery( "from Parent" ).iterate(); it.hasNext(); ) {
+			Parent p = (Parent) it.next();
+			assertEquals( 1, p.getChildren().size() );
+			s.evict(p);
+		}
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		for (Iterator it=parents.iterator(); it.hasNext(); ) {
+			s.delete(it.next());
+		}
+		s.getTransaction().commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/reattachment/ProxyReattachmentTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/resulttransformer/Contract.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/resulttransformer/Contract.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/resulttransformer/Contract.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,39 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping>
+  <class name="org.hibernate.test.resulttransformer.Contract">
+    <id name="id" type="long">
+      <column name="id" />
+      <generator class="native" />
+    </id>
+    <property name="name" />
+    <many-to-one name="a"/>
+    <many-to-one name="b"/>
+    <sql-query name="testQuery">
+      <return alias="d" class="org.hibernate.test.resulttransformer.Contract"/>
+      <return-join alias="a" property="d.a"/>
+      <return-join alias="b" property="d.b"/>
+      <![CDATA[
+      select 
+        {d.*}, {a.*}, {b.*}
+      from 
+        Contract d, PartnerA a, PartnerB b
+      where d.a = a.id and d.b = b.id  
+      ]]>
+    </sql-query>
+  </class>
+  <class name="org.hibernate.test.resulttransformer.PartnerA">
+    <id name="id" type="long">
+      <column name="id" />
+      <generator class="native" />
+    </id>
+    <property name="name" />
+  </class>
+  <class name="org.hibernate.test.resulttransformer.PartnerB">
+    <id name="id" type="long">
+      <column name="id" />
+      <generator class="native" />
+    </id>
+    <property name="name" />
+  </class>
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/resulttransformer/Contract.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/resulttransformer/Contract.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/resulttransformer/Contract.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/resulttransformer/Contract.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,91 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2009, Red Hat, Inc. and/or its affiliates or third-
+ * party contributors as indicated by the @author tags or express 
+ * copyright attribution statements applied by the authors.  
+ * All third-party contributions are distributed under license by 
+ * Red Hat, Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to 
+ * use, modify, copy, or redistribute it subject to the terms and 
+ * conditions of the GNU Lesser General Public License, as published 
+ * by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of 
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public 
+ * License along with this distribution; if not, write to:
+ * 
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+
+package org.hibernate.test.resulttransformer;
+
+/**
+ * @author Sharath Reddy
+ *
+ */
+public class Contract {
+
+	private Long id;
+	private String name;
+	private PartnerA a;
+	private PartnerB b;
+	private Long custom1;
+
+	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 PartnerA getA()
+	{
+		return a;
+	}
+
+	public void setA(PartnerA a)
+	{
+		this.a = a;
+	}
+
+	public PartnerB getB()
+	{
+		return b;
+	}
+
+	public void setB(PartnerB b)
+	{
+		this.b = b;
+	}
+
+	public Long getCustom1()
+	{
+		return custom1;
+	}
+
+	public void setCustom1(Long custom1)
+	{
+		this.custom1 = custom1;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/resulttransformer/Contract.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/resulttransformer/PartnerA.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/resulttransformer/PartnerA.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/resulttransformer/PartnerA.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,55 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2009, Red Hat, Inc. and/or its affiliates or third-
+ * party contributors as indicated by the @author tags or express 
+ * copyright attribution statements applied by the authors.  
+ * All third-party contributions are distributed under license by 
+ * Red Hat, Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to 
+ * use, modify, copy, or redistribute it subject to the terms and 
+ * conditions of the GNU Lesser General Public License, as published 
+ * by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of 
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public 
+ * License along with this distribution; if not, write to:
+ * 
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+
+package org.hibernate.test.resulttransformer;
+
+/**
+ * @author Sharath Reddy
+ *
+ */
+public class PartnerA {
+
+	private Long id;
+	private String name;
+
+	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;
+	}
+
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/resulttransformer/PartnerA.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/resulttransformer/PartnerB.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/resulttransformer/PartnerB.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/resulttransformer/PartnerB.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,55 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2009, Red Hat, Inc. and/or its affiliates or third-
+ * party contributors as indicated by the @author tags or express 
+ * copyright attribution statements applied by the authors.  
+ * All third-party contributions are distributed under license by 
+ * Red Hat, Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to 
+ * use, modify, copy, or redistribute it subject to the terms and 
+ * conditions of the GNU Lesser General Public License, as published 
+ * by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of 
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public 
+ * License along with this distribution; if not, write to:
+ * 
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+
+package org.hibernate.test.resulttransformer;
+
+/**
+ * @author Sharath Reddy
+ *
+ */
+public class PartnerB {
+
+	private Long id;
+	private String name;
+
+	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;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/resulttransformer/PartnerB.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/resulttransformer/ResultTransformerTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/resulttransformer/ResultTransformerTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/resulttransformer/ResultTransformerTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,108 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2009, Red Hat, Inc. and/or its affiliates or third-
+ * party contributors as indicated by the @author tags or express 
+ * copyright attribution statements applied by the authors.  
+ * All third-party contributions are distributed under license by 
+ * Red Hat, Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to 
+ * use, modify, copy, or redistribute it subject to the terms and 
+ * conditions of the GNU Lesser General Public License, as published 
+ * by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of 
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public 
+ * License along with this distribution; if not, write to:
+ * 
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+
+package org.hibernate.test.resulttransformer;
+
+import java.util.List;
+
+import org.hibernate.Query;
+import org.hibernate.ScrollableResults;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.transform.ResultTransformer;
+
+/**
+ * @author Sharath Reddy
+ *
+ */
+public class ResultTransformerTest extends FunctionalTestCase {
+
+	public ResultTransformerTest(String string) {
+		super(string);
+	}
+	
+	/**
+	 * HHH-3694 ResultTransformer not used when scroll() is used on a named SQLQuery
+	 */
+	public void testResultTransformerIsAppliedToScrollableResults() throws Exception
+	{
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+
+		PartnerA a = new PartnerA();
+		a.setName("Partner A");
+		PartnerB b = new PartnerB();
+		b.setName("Partner B");
+		Contract obj1 = new Contract();
+		obj1.setName("Contract");
+		obj1.setA(a);
+		obj1.setB(b);
+		s.save(a);
+		s.save(b);
+		s.save(obj1);
+
+		tx.commit();
+		s.close();
+
+		s = openSession();
+
+		Query q = s.getNamedQuery(Contract.class.getName() + ".testQuery");
+		q.setFetchSize(100);
+		q.setResultTransformer(new ResultTransformer() {
+
+			private static final long serialVersionUID = -5815434828170704822L;
+
+			public Object transformTuple(Object[] arg0, String[] arg1)
+			{
+				// return only the PartnerA object from the query
+				return arg0[1];
+			}
+
+			@SuppressWarnings("unchecked")
+			public List transformList(List arg0)
+			{
+				return arg0;
+			}
+		});
+		ScrollableResults sr = q.scroll();
+		sr.first();
+		Object[] row = sr.get();
+		assertEquals(1, row.length);
+		Object obj = row[0];
+		assertTrue(obj instanceof PartnerA);
+		PartnerA obj2 = (PartnerA) obj;
+		assertEquals("Partner A", obj2.getName());
+		s.close();
+	}
+
+	public String[] getMappings() {
+		return new String[] { "resulttransformer/Contract.hbm.xml" };
+	}
+}
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/resulttransformer/ResultTransformerTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/rowid/Point.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/rowid/Point.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/rowid/Point.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,55 @@
+//$Id: Point.java 6477 2005-04-21 07:39:21Z oneovthafew $
+package org.hibernate.test.rowid;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @author Gavin King
+ */
+public class Point implements Serializable {
+	private BigDecimal x;
+	private BigDecimal y;
+	private String description;
+	private Object row;
+
+	Point() {}
+	
+	public Point(BigDecimal x, BigDecimal y) {
+		this.x = x;
+		this.y = y;
+	}
+
+	public BigDecimal getX() {
+		return x;
+	}
+
+	void setX(BigDecimal x) {
+		this.x = x;
+	}
+
+	public BigDecimal getY() {
+		return y;
+	}
+
+	void setY(BigDecimal y) {
+		this.y = y;
+	}
+
+	public String getDescription() {
+		return description;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
+	public Object getRow() {
+		return row;
+	}
+
+	public void setRow(Object row) {
+		this.row = row;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/rowid/Point.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/rowid/RowIdTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/rowid/RowIdTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/rowid/RowIdTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,105 @@
+//$Id: RowIdTest.java 11353 2007-03-28 16:03:40Z steve.ebersole at jboss.com $
+package org.hibernate.test.rowid;
+
+import java.math.BigDecimal;
+import java.sql.Statement;
+import java.sql.SQLException;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.engine.SessionFactoryImplementor;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.dialect.Oracle9iDialect;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.testing.junit.functional.DatabaseSpecificFunctionalTestCase;
+
+/**
+ * @author Gavin King
+ */
+public class RowIdTest extends DatabaseSpecificFunctionalTestCase {
+	
+	public RowIdTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "rowid/Point.hbm.xml" };
+	}
+
+	public String getCacheConcurrencyStrategy() {
+		return null;
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( RowIdTest.class );
+	}
+
+	public boolean appliesTo(Dialect dialect) {
+		return dialect instanceof Oracle9iDialect;
+	}
+
+	public boolean createSchema() {
+		return false;
+	}
+
+	public void afterSessionFactoryBuilt(SessionFactoryImplementor sfi) {
+		super.afterSessionFactoryBuilt( sfi );
+		Session session = null;
+		try {
+			session = sfi.openSession();
+			Statement st = session.connection().createStatement();
+			try {
+				st.execute( "drop table Point");
+			}
+			catch( Throwable ignore ) {
+				// ignore
+			}
+			st.execute("create table Point (\"x\" number(19,2) not null, \"y\" number(19,2) not null, description varchar2(255) )");
+		}
+		catch ( SQLException e ) {
+			throw new RuntimeException( "Unable to build actual schema : " + e.getMessage() );
+		}
+		finally {
+			if ( session != null ) {
+				try {
+					session.close();
+				}
+				catch( Throwable ignore ) {
+					// ignore
+				}
+			}
+		}
+	}
+
+	public void testRowId() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Point p = new Point( new BigDecimal(1.0), new BigDecimal(1.0) );
+		s.persist(p);
+		t.commit();
+		s.clear();
+		
+		t = s.beginTransaction();
+		p = (Point) s.createCriteria(Point.class).uniqueResult();
+		p.setDescription("new desc");
+		t.commit();
+		s.clear();
+		
+		t = s.beginTransaction();
+		p = (Point) s.createQuery("from Point").uniqueResult();
+		p.setDescription("new new desc");
+		t.commit();
+		s.clear();
+		
+		t = s.beginTransaction();
+		p = (Point) s.get(Point.class, p);
+		p.setDescription("new new new desc");
+		t.commit();
+		s.close();
+		
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/rowid/RowIdTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/rowid/RowIdType.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/rowid/RowIdType.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/rowid/RowIdType.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,64 @@
+//$Id: RowIdType.java 6477 2005-04-21 07:39:21Z oneovthafew $
+package org.hibernate.test.rowid;
+
+import java.io.Serializable;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+
+import org.hibernate.HibernateException;
+import org.hibernate.usertype.UserType;
+
+/**
+ * @author Gavin King
+ */
+public class RowIdType implements UserType {
+
+	public int[] sqlTypes() {
+		return new int[] { Types.JAVA_OBJECT };
+	}
+
+	public Class returnedClass() {
+		return Object.class;
+	}
+
+	public boolean equals(Object x, Object y) throws HibernateException {
+		return x.equals(y);
+	}
+
+	public int hashCode(Object x) throws HibernateException {
+		return x.hashCode();
+	}
+
+	public Object nullSafeGet(ResultSet rs, String[] names, Object owner)
+			throws HibernateException, SQLException {
+		return rs.getObject( names[0] );
+	}
+
+	public void nullSafeSet(PreparedStatement st, Object value, int index)
+			throws HibernateException, SQLException {
+		throw new UnsupportedOperationException();
+	}
+
+	public Object deepCopy(Object value) throws HibernateException {
+		return value;
+	}
+
+	public boolean isMutable() {
+		return false;
+	}
+
+	public Serializable disassemble(Object value) throws HibernateException {
+		return null;
+	}
+
+	public Object assemble(Serializable cached, Object owner) throws HibernateException {
+		return null;
+	}
+
+	public Object replace(Object original, Object target, Object owner) throws HibernateException {
+		return null;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/rowid/RowIdType.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/schemaupdate/1_Version.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/schemaupdate/1_Version.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/schemaupdate/1_Version.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.schemaupdate">
+
+	<class name="Version">
+		<id name="id">
+			<generator class="org.hibernate.id.TableHiLoGenerator">
+                <param name="table">uid_table</param>
+                <param name="column">next_hi_value_column</param>
+        	</generator>
+		</id>
+		<property name="description"/>	
+	</class>
+
+</hibernate-mapping>
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/schemaupdate/1_Version.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/schemaupdate/2_Version.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/schemaupdate/2_Version.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/schemaupdate/2_Version.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.schemaupdate">
+
+	<class name="Version">
+		<id name="id">
+			<generator class="org.hibernate.id.TableHiLoGenerator">
+                <param name="table">uid_table</param>
+                <param name="column">next_hi_value_column</param>
+        	</generator>
+		</id>
+		<property name="description"/>	
+		<property name="name"/>			
+	</class>
+	
+</hibernate-mapping>
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/schemaupdate/2_Version.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/schemaupdate/MigrationTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/schemaupdate/MigrationTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/schemaupdate/MigrationTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,47 @@
+package org.hibernate.test.schemaupdate;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.hibernate.cfg.Configuration;
+import org.hibernate.testing.junit.UnitTestCase;
+import org.hibernate.tool.hbm2ddl.SchemaExport;
+import org.hibernate.tool.hbm2ddl.SchemaUpdate;
+
+/**
+ * @author Max Rydahl Andersen
+ */
+public class MigrationTest extends UnitTestCase {
+
+	public MigrationTest(String str) {
+		super( str );
+	}
+
+	public static Test suite() {
+		return new TestSuite( MigrationTest.class );
+	}
+
+	public void testSimpleColumnAddition() {
+		String resource1 = "org/hibernate/test/schemaupdate/1_Version.hbm.xml";
+		String resource2 = "org/hibernate/test/schemaupdate/2_Version.hbm.xml";
+
+		Configuration v1cfg = new Configuration();
+		v1cfg.addResource( resource1 );
+		new SchemaExport( v1cfg ).execute( false, true, true, false );
+
+		SchemaUpdate v1schemaUpdate = new SchemaUpdate( v1cfg );
+		v1schemaUpdate.execute( true, true );
+
+		assertEquals( 0, v1schemaUpdate.getExceptions().size() );
+
+		Configuration v2cfg = new Configuration();
+		v2cfg.addResource( resource2 );
+
+		SchemaUpdate v2schemaUpdate = new SchemaUpdate( v2cfg );
+		v2schemaUpdate.execute( true, true );
+		assertEquals( 0, v2schemaUpdate.getExceptions().size() );
+
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/schemaupdate/MigrationTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/schemaupdate/Version.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/schemaupdate/Version.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/schemaupdate/Version.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,30 @@
+package org.hibernate.test.schemaupdate;
+
+public class Version {
+
+	long id;
+	String name;
+	String description;
+	
+	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 String getDescription() {
+		return description;
+	}
+	
+	public void setDescription(String description) {
+		this.description = description;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/schemaupdate/Version.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sorted/Search.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sorted/Search.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sorted/Search.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+  
+-->
+
+<hibernate-mapping package="org.hibernate.test.sorted">
+	
+	<class name="Search">
+		<id name="searchString"/>
+		<set name="searchResults" sort="natural">
+			<key column="searchString"/>
+			<element column="text" type="string"/>
+		</set>
+	</class>
+	
+</hibernate-mapping>
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sorted/Search.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sorted/Search.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sorted/Search.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sorted/Search.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,29 @@
+//$Id: Search.java 7772 2005-08-05 23:03:46Z oneovthafew $
+package org.hibernate.test.sorted;
+
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+public class Search {
+	private String searchString;
+	private SortedSet searchResults = new TreeSet();
+	
+	Search() {}
+	
+	public Search(String string) {
+		searchString = string;
+	}
+	
+	public SortedSet getSearchResults() {
+		return searchResults;
+	}
+	public void setSearchResults(SortedSet searchResults) {
+		this.searchResults = searchResults;
+	}
+	public String getSearchString() {
+		return searchString;
+	}
+	public void setSearchString(String searchString) {
+		this.searchString = searchString;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sorted/Search.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sorted/SortTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sorted/SortTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sorted/SortTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,79 @@
+//$Id: SortTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.sorted;
+
+import java.util.Iterator;
+
+import junit.framework.Test;
+
+import org.hibernate.FetchMode;
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class SortTest extends FunctionalTestCase {
+	
+	public SortTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "sorted/Search.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( SortTest.class );
+	}
+	
+	public void testOrderBy() {
+		Search s = new Search("Hibernate");
+		s.getSearchResults().add("jboss.com");
+		s.getSearchResults().add("hibernate.org");
+		s.getSearchResults().add("HiA");
+		
+		Session sess = openSession();
+		Transaction tx = sess.beginTransaction();
+		sess.persist(s);
+		sess.flush();
+		
+		sess.clear();
+		s = (Search) sess.createCriteria(Search.class).uniqueResult();
+		assertFalse( Hibernate.isInitialized( s.getSearchResults() ) );
+		Iterator iter = s.getSearchResults().iterator();
+		assertEquals( iter.next(), "HiA" );
+		assertEquals( iter.next(), "hibernate.org" );
+		assertEquals( iter.next(), "jboss.com" );
+		assertFalse( iter.hasNext() );
+		
+		sess.clear();
+		s = (Search) sess.createCriteria(Search.class)
+				.setFetchMode("searchResults", FetchMode.JOIN)
+				.uniqueResult();
+		assertTrue( Hibernate.isInitialized( s.getSearchResults() ) );
+		iter = s.getSearchResults().iterator();
+		assertEquals( iter.next(), "HiA" );
+		assertEquals( iter.next(), "hibernate.org" );
+		assertEquals( iter.next(), "jboss.com" );
+		assertFalse( iter.hasNext() );
+		
+		sess.clear();
+		s = (Search) sess.createQuery("from Search s left join fetch s.searchResults")
+				.uniqueResult();
+		assertTrue( Hibernate.isInitialized( s.getSearchResults() ) );
+		iter = s.getSearchResults().iterator();
+		assertEquals( iter.next(), "HiA" );
+		assertEquals( iter.next(), "hibernate.org" );
+		assertEquals( iter.next(), "jboss.com" );
+		assertFalse( iter.hasNext() );
+		
+		sess.delete(s);
+		tx.commit();
+		sess.close();
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sorted/SortTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/check/ExceptionCheckingEntity.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/check/ExceptionCheckingEntity.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/check/ExceptionCheckingEntity.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,30 @@
+package org.hibernate.test.sql.check;
+
+/**
+ * An entity which is expected to be mapped to each database using stored
+ * procedures which throw exceptions on their own; in other words, using
+ * {@link org.hibernate.engine.ExecuteUpdateResultCheckStyle#NONE}.
+ *
+ * @author Steve Ebersole
+ */
+public class ExceptionCheckingEntity {
+	private Long id;
+	private String name;
+
+	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;
+	}
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/check/ExceptionCheckingEntity.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/check/OracleCheckStyleTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/check/OracleCheckStyleTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/check/OracleCheckStyleTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,31 @@
+package org.hibernate.test.sql.check;
+
+import junit.framework.Test;
+
+import org.hibernate.dialect.Dialect;
+import org.hibernate.dialect.Oracle9iDialect;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * todo: describe OracleCheckStyleTest
+ *
+ * @author Steve Ebersole
+ */
+public class OracleCheckStyleTest extends ResultCheckStyleTest {
+	public OracleCheckStyleTest(String name) {
+		super( name );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "sql/check/oracle-mappings.hbm.xml" };
+	}
+
+	public boolean appliesTo(Dialect dialect) {
+		return dialect instanceof Oracle9iDialect;
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( OracleCheckStyleTest.class );
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/check/OracleCheckStyleTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/check/ParamCheckingEntity.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/check/ParamCheckingEntity.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/check/ParamCheckingEntity.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,29 @@
+package org.hibernate.test.sql.check;
+
+/**
+ * An entity which is expected to be mapped to each database using stored
+ * procedures which return "affected row counts"; in other words, using
+ * {@link org.hibernate.engine.ExecuteUpdateResultCheckStyle#PARAM}.
+ *
+ * @author Steve Ebersole
+ */
+public class ParamCheckingEntity {
+	private Long id;
+	private String name;
+
+	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;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/check/ParamCheckingEntity.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/check/ResultCheckStyleTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/check/ResultCheckStyleTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/check/ResultCheckStyleTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,134 @@
+package org.hibernate.test.sql.check;
+
+import org.hibernate.HibernateException;
+import org.hibernate.JDBCException;
+import org.hibernate.Session;
+import org.hibernate.testing.junit.functional.DatabaseSpecificFunctionalTestCase;
+
+/**
+ * todo: describe ResultCheckStyleTest
+ *
+ * @author Steve Ebersole
+ */
+public abstract class ResultCheckStyleTest extends DatabaseSpecificFunctionalTestCase {
+
+	public ResultCheckStyleTest(String name) {
+		super( name );
+	}
+
+	public String getCacheConcurrencyStrategy() {
+		return null;
+	}
+
+	public void testInsertionFailureWithExceptionChecking() {
+		Session s = openSession();
+		s.beginTransaction();
+		ExceptionCheckingEntity e = new ExceptionCheckingEntity();
+		e.setName( "dummy" );
+		s.save( e );
+		try {
+			s.flush();
+			fail( "expection flush failure!" );
+		}
+		catch( JDBCException ex ) {
+			// these should specifically be JDBCExceptions...
+		}
+		s.clear();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testInsertionFailureWithParamChecking() {
+		Session s = openSession();
+		s.beginTransaction();
+		ParamCheckingEntity e = new ParamCheckingEntity();
+		e.setName( "dummy" );
+		s.save( e );
+		try {
+			s.flush();
+			fail( "expection flush failure!" );
+		}
+		catch( HibernateException ex ) {
+			// these should specifically be HibernateExceptions...
+		}
+		s.clear();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testUpdateFailureWithExceptionChecking() {
+		Session s = openSession();
+		s.beginTransaction();
+		ExceptionCheckingEntity e = new ExceptionCheckingEntity();
+		e.setId( new Long( 1 ) );
+		e.setName( "dummy" );
+		s.update( e );
+		try {
+			s.flush();
+			fail( "expection flush failure!" );
+		}
+		catch( JDBCException ex ) {
+			// these should specifically be JDBCExceptions...
+		}
+		s.clear();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testUpdateFailureWithParamChecking() {
+		Session s = openSession();
+		s.beginTransaction();
+		ParamCheckingEntity e = new ParamCheckingEntity();
+		e.setId( new Long( 1 ) );
+		e.setName( "dummy" );
+		s.update( e );
+		try {
+			s.flush();
+			fail( "expection flush failure!" );
+		}
+		catch( HibernateException ex ) {
+			// these should specifically be HibernateExceptions...
+		}
+		s.clear();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testDeleteWithExceptionChecking() {
+		Session s = openSession();
+		s.beginTransaction();
+		ExceptionCheckingEntity e = new ExceptionCheckingEntity();
+		e.setId( new Long( 1 ) );
+		e.setName( "dummy" );
+		s.delete( e );
+		try {
+			s.flush();
+			fail( "expection flush failure!" );
+		}
+		catch( JDBCException ex ) {
+			// these should specifically be JDBCExceptions...
+		}
+		s.clear();
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testDeleteWithParamChecking() {
+		Session s = openSession();
+		s.beginTransaction();
+		ParamCheckingEntity e = new ParamCheckingEntity();
+		e.setId( new Long( 1 ) );
+		e.setName( "dummy" );
+		s.delete( e );
+		try {
+			s.flush();
+			fail( "expection flush failure!" );
+		}
+		catch( HibernateException ex ) {
+			// these should specifically be HibernateExceptions...
+		}
+		s.clear();
+		s.getTransaction().commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/check/ResultCheckStyleTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/check/oracle-mappings.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/check/oracle-mappings.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/check/oracle-mappings.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,103 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.sql.check">
+
+    <class name="ExceptionCheckingEntity" table="ENTITY_E">
+        <id name="id" unsaved-value="0" column="ID">
+            <generator class="increment"/>
+        </id>
+        <property name="name" not-null="true"/>
+        <sql-insert callable="true" check="none">{call createEntityE(?,?)}</sql-insert>
+        <sql-update callable="true" check="none">{call updateEntityE(?,?)}</sql-update>
+        <sql-delete callable="true" check="none">{call deleteEntityE(?)}</sql-delete>
+    </class>
+
+    <class name="ParamCheckingEntity" table="ENTITY_P">
+        <id name="id" unsaved-value="0" column="ID">
+            <generator class="increment"/>
+        </id>
+        <property name="name" not-null="true"/>
+        <sql-insert callable="true" check="param">{call createEntityP(?,?,?)}</sql-insert>
+        <sql-update callable="true" check="param">{? = call updateEntityP(?,?)}</sql-update>
+        <sql-delete callable="true" check="param">{? = call deleteEntityP(?)}</sql-delete>
+    </class>
+
+
+    <database-object>
+        <create>
+            CREATE OR REPLACE PROCEDURE createEntityE(p_name ENTITY_E.NAME%TYPE, p_id ENTITY_E.ID%TYPE)
+            AS BEGIN
+                RAISE_APPLICATION_ERROR( -20001, 'Insert failure checking' );
+            END;
+        </create>
+        <drop>
+            DROP PROCEDURE createEntityE;
+        </drop>
+    </database-object>
+
+    <database-object>
+        <create>
+            CREATE OR REPLACE PROCEDURE updateEntityE(p_name ENTITY_E.NAME%TYPE, p_id ENTITY_E.ID%TYPE)
+            AS BEGIN
+                RAISE_APPLICATION_ERROR( -20001, 'Update failure checking' );
+            END;
+        </create>
+        <drop>
+            DROP PROCEDURE updateEntityE;
+        </drop>
+    </database-object>
+
+    <database-object>
+        <create>
+            CREATE OR REPLACE PROCEDURE deleteEntityE(p_id ENTITY_E.ID%TYPE)
+            AS BEGIN
+                RAISE_APPLICATION_ERROR( -20001, 'Update failure checking' );
+            END;
+        </create>
+        <drop>
+            DROP PROCEDURE deleteEntityE;
+        </drop>
+    </database-object>
+
+
+    <database-object>
+        <!-- Demonstrate using an Oracle procedure and a registered OUT paramater as part of hand supplied sql -->
+        <create>
+            CREATE OR REPLACE PROCEDURE createEntityP(result OUT INTEGER, p_name ENTITY_E.NAME%TYPE, p_id ENTITY_E.ID%TYPE)
+            AS BEGIN
+                /* force a failure by returning a non-1 result */
+                result := 2;
+            END;
+        </create>
+        <drop>
+            DROP PROCEDURE createEntityP;
+        </drop>
+    </database-object>
+
+    <database-object>
+        <!-- Demonstrate using an Oracle function and it's return value as part of hand supplied sql -->
+        <create>
+            CREATE OR REPLACE FUNCTION updateEntityP(p_name ENTITY_E.NAME%TYPE, p_id ENTITY_E.ID%TYPE)
+            RETURN INTEGER IS BEGIN
+                RETURN 2;
+            END;
+        </create>
+        <drop>
+            DROP PROCEDURE updateEntityP;
+        </drop>
+    </database-object>
+
+    <database-object>
+        <create>
+            CREATE OR REPLACE FUNCTION deleteEntityP(p_id ENTITY_E.ID%TYPE)
+            RETURN INTEGER IS BEGIN
+                RETURN 2;
+            END;
+        </create>
+        <drop>
+            DROP PROCEDURE deleteEntityE;
+        </drop>
+    </database-object>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/check/oracle-mappings.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Dimension.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Dimension.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Dimension.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,31 @@
+package org.hibernate.test.sql.hand;
+
+/**
+ * Used to mimic some tests from the JPA testsuite...
+ *
+ * @author Steve Ebersole
+ */
+public class Dimension {
+	private Long id;
+	private int length;
+	private int width;
+
+	public Dimension() {}
+
+	public Dimension(int length, int width) {
+		this.length = length;
+		this.width = width;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public int getLength() {
+		return length;
+	}
+
+	public int getWidth() {
+		return width;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Dimension.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Employment.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Employment.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Employment.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,107 @@
+//$Id: Employment.java 11486 2007-05-08 21:57:24Z steve.ebersole at jboss.com $
+package org.hibernate.test.sql.hand;
+
+import java.util.Date;
+
+/**
+ * @author Gavin King
+ */
+public class Employment {
+	private long employmentId;
+	private Person employee;
+	private Organization employer;
+	private Date startDate;
+	private Date endDate;
+	private String regionCode;
+	private MonetaryAmount salary;
+	
+	public Employment() {}
+
+	public Employment(Person employee, Organization employer, String regionCode) {
+		this.employee = employee;
+		this.employer = employer;
+		this.startDate = new Date();
+		this.regionCode = regionCode;
+		employer.getEmployments().add(this);
+	}
+	/**
+	 * @return Returns the employee.
+	 */
+	public Person getEmployee() {
+		return employee;
+	}
+	/**
+	 * @param employee The employee to set.
+	 */
+	public void setEmployee(Person employee) {
+		this.employee = employee;
+	}
+	/**
+	 * @return Returns the employer.
+	 */
+	public Organization getEmployer() {
+		return employer;
+	}
+	/**
+	 * @param employer The employer to set.
+	 */
+	public void setEmployer(Organization employer) {
+		this.employer = employer;
+	}
+	/**
+	 * @return Returns the endDate.
+	 */
+	public Date getEndDate() {
+		return endDate;
+	}
+	/**
+	 * @param endDate The endDate to set.
+	 */
+	public void setEndDate(Date endDate) {
+		this.endDate = endDate;
+	}
+	/**
+	 * @return Returns the id.
+	 */
+	public long getEmploymentId() {
+		return employmentId;
+	}
+	/**
+	 * @param id The id to set.
+	 */
+	public void setEmploymentId(long id) {
+		this.employmentId = id;
+	}
+	/**
+	 * @return Returns the startDate.
+	 */
+	public Date getStartDate() {
+		return startDate;
+	}
+	/**
+	 * @param startDate The startDate to set.
+	 */
+	public void setStartDate(Date startDate) {
+		this.startDate = startDate;
+	}
+	/**
+	 * @return Returns the regionCode.
+	 */
+	public String getRegionCode() {
+		return regionCode;
+	}
+	/**
+	 * @param regionCode The regionCode to set.
+	 */
+	public void setRegionCode(String regionCode) {
+		this.regionCode = regionCode;
+	}
+	
+	public MonetaryAmount getSalary() {
+		return salary;
+	}
+	
+	public void setSalary(MonetaryAmount salary) {
+		this.salary = salary;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Employment.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Group.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Group.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Group.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.sql.hand;
+
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class Group {
+	private Long id;
+	private List persons = new ArrayList();
+	private String name;
+
+	public Group() {
+	}
+
+	public Group(String name) {
+		this.name = name;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public List getPersons() {
+		return persons;
+	}
+
+	public void setPersons(List persons) {
+		this.persons = persons;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Group.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/ImageHolder.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/ImageHolder.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/ImageHolder.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.sql.hand;
+
+/**
+ * @author Gail Badner
+ */
+public class ImageHolder {
+	private Long id;
+	private byte[] photo;
+
+	public ImageHolder(byte[] photo) {
+		this.photo = photo;
+	}
+
+	public ImageHolder() {
+	}
+
+	/**
+	 * @return Returns the id.
+	 */
+	public Long getId() {
+		return id;
+	}
+
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	/**
+	 * @return Returns the photo.
+	 */
+	public byte[] getPhoto() {
+		return photo;
+	}
+
+	/**
+	 * @param photo The photo to set.
+	 */
+	public void setPhoto(byte[] photo) {
+		this.photo = photo;
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/ImageHolder.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/MonetaryAmount.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/MonetaryAmount.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/MonetaryAmount.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,78 @@
+package org.hibernate.test.sql.hand;
+
+import java.math.BigDecimal;
+import java.util.Currency;
+import java.io.Serializable;
+
+/**
+ * Represents a monetary amount as value and currency.
+ *
+ * @author Gavin King <gavin at hibernate.org>
+ * @author Christian Bauer <christian at hibernate.org>
+ */
+public class MonetaryAmount implements Serializable {
+
+	private final BigDecimal value;
+	private final Currency currency;
+
+	public MonetaryAmount(BigDecimal value, Currency currency) {
+		this.value = value;
+		this.currency = currency;
+	}
+
+	public Currency getCurrency() {
+		return currency;
+	}
+
+	public BigDecimal getValue() {
+		return value;
+	}
+
+	// ********************** Common Methods ********************** //
+
+	public boolean equals(Object o) {
+		if (this == o) return true;
+		if (!(o instanceof MonetaryAmount)) return false;
+
+		final MonetaryAmount monetaryAmount = (MonetaryAmount) o;
+
+		if (!currency.equals(monetaryAmount.currency)) return false;
+		if (!value.equals(monetaryAmount.value)) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		int result;
+		result = value.hashCode();
+		result = 29 * result + currency.hashCode();
+		return result;
+	}
+
+	public String toString() {
+		return "Value: '" + getValue() + "', " +
+		        "Currency: '" + getCurrency() + "'";
+	}
+
+	public int compareTo(Object o) {
+		if (o instanceof MonetaryAmount) {
+			// TODO: This would actually require some currency conversion magic
+			return this.getValue().compareTo(((MonetaryAmount) o).getValue());
+		}
+		return 0;
+	}
+
+	// ********************** Business Methods ********************** //
+
+	public static MonetaryAmount fromString(String amount, String currencyCode) {
+		return new MonetaryAmount(new BigDecimal(amount),
+								  Currency.getInstance(currencyCode));
+	}
+
+	public static MonetaryAmount convert(MonetaryAmount amount,
+										 Currency toConcurrency) {
+		// TODO: This requires some conversion magic and is therefore broken
+		return new MonetaryAmount(amount.getValue(), toConcurrency);
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/MonetaryAmount.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/MonetaryAmountUserType.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/MonetaryAmountUserType.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/MonetaryAmountUserType.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,85 @@
+package org.hibernate.test.sql.hand;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.Currency;
+
+import org.hibernate.HibernateException;
+import org.hibernate.usertype.UserType;
+
+/**
+ * This is a simple Hibernate custom mapping type for MonetaryAmount value types.
+ * <p>
+ * 
+ * @author Max & Christian 
+ */
+public class MonetaryAmountUserType
+		implements UserType {
+
+	private static final int[] SQL_TYPES = {Types.NUMERIC, Types.VARCHAR };
+
+	public int[] sqlTypes() { return SQL_TYPES; }
+
+	public Class returnedClass() { return MonetaryAmount.class; }
+
+	public boolean isMutable() { return false; }
+
+	public Object deepCopy(Object value) {
+		return value; // MonetaryAmount is immutable
+	}
+
+	public boolean equals(Object x, Object y) {
+		if (x == y) return true;
+		if (x == null || y == null) return false;
+		return x.equals(y);
+	}
+
+	public Object nullSafeGet(ResultSet resultSet,
+							  String[] names,
+							  Object owner)
+			throws HibernateException, SQLException {
+
+		BigDecimal value = resultSet.getBigDecimal(names[0]);
+		if (resultSet.wasNull()) return null;
+		String cur = resultSet.getString(names[1]);
+		Currency userCurrency = Currency.getInstance(cur);
+						
+		return new MonetaryAmount(value, userCurrency);
+	}
+
+	public void nullSafeSet(PreparedStatement statement,
+							Object value,
+							int index)
+			throws HibernateException, SQLException {
+
+		if (value == null) {
+			statement.setNull(index, Types.NUMERIC);			
+			statement.setNull(index+1, Types.VARCHAR);
+		} else {
+			MonetaryAmount currency = (MonetaryAmount)value;
+			statement.setBigDecimal(index, currency.getValue());
+			statement.setString(index+1, currency.getCurrency().getCurrencyCode());
+		}
+	}
+
+	public Serializable disassemble(Object value) throws HibernateException {
+		return (Serializable) value;
+	}
+
+	public Object assemble(Serializable cached, Object owner) throws HibernateException {
+		return cached;
+	}
+
+	public Object replace(Object original, Object target, Object owner)
+	throws HibernateException {
+		return original;
+	}
+
+	public int hashCode(Object x) throws HibernateException {
+		return x.hashCode();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/MonetaryAmountUserType.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Order.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Order.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Order.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,55 @@
+package org.hibernate.test.sql.hand;
+
+import java.io.Serializable;
+
+public class Order {
+	
+	static public class OrderId implements Serializable {
+		String orgid;
+		String ordernumber;
+		public String getOrdernumber() {
+			return ordernumber;
+		}
+		public void setOrdernumber(String ordernumber) {
+			this.ordernumber = ordernumber;
+		}
+		public String getOrgid() {
+			return orgid;
+		}
+		public void setOrgid(String orgid) {
+			this.orgid = orgid;
+		}
+		
+		
+	}
+	
+	OrderId orderId;
+	
+	Product product;
+
+	Person person;
+	
+	public Person getPerson() {
+		return person;
+	}
+	
+	public void setPerson(Person person) {
+		this.person = person;
+	}
+	public OrderId getOrderId() {
+		return orderId;
+	}
+
+	public void setOrderId(OrderId orderId) {
+		this.orderId = orderId;
+	}
+
+	public Product getProduct() {
+		return product;
+	}
+
+	public void setProduct(Product product) {
+		this.product = product;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Order.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Organization.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Organization.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Organization.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,59 @@
+//$Id: Organization.java 11486 2007-05-08 21:57:24Z steve.ebersole at jboss.com $
+package org.hibernate.test.sql.hand;
+
+import java.util.Collection;
+import java.util.HashSet;
+
+/**
+ * @author Gavin King
+ */
+public class Organization {
+	private long id;
+	private String name;
+	private Collection employments;
+
+	public Organization(String name) {
+		this.name = name;
+		employments = new HashSet();
+	}
+
+	public Organization() {}
+
+	/**
+	 * @return Returns the employments.
+	 */
+	public Collection getEmployments() {
+		return employments;
+	}
+	/**
+	 * @param employments The employments to set.
+	 */
+	public void setEmployments(Collection employments) {
+		this.employments = employments;
+	}
+	/**
+	 * @return Returns the id.
+	 */
+	public long getId() {
+		return id;
+	}
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(long id) {
+		this.id = id;
+	}
+	/**
+	 * @return Returns the name.
+	 */
+	public String getName() {
+		return name;
+	}
+	/**
+	 * @param name The name to set.
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Organization.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.sql.hand;
+
+/**
+ * @author Gavin King
+ */
+public class Person {
+	private Long id;
+	private String name;
+
+	public Person(String name) {
+		this.name = name;
+	}
+
+	public Person() {
+	}
+
+	/**
+	 * @return Returns the id.
+	 */
+	public Long getId() {
+		return id;
+	}
+
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	/**
+	 * @return Returns the name.
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * @param name The name to set.
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Person.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Product.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Product.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Product.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,66 @@
+package org.hibernate.test.sql.hand;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+
+public class Product {
+	
+	static public class ProductId implements Serializable {
+		String orgid;
+		String productnumber;
+		public String getProductnumber() {
+			return productnumber;
+		}
+		public void setProductnumber(String ordernumber) {
+			this.productnumber = ordernumber;
+		}
+		public String getOrgid() {
+			return orgid;
+		}
+		public void setOrgid(String orgid) {
+			this.orgid = orgid;
+		}
+		
+		
+	}
+	
+	ProductId productId;
+	
+	String name;
+
+	Person person;
+	
+	Set orders = new HashSet();
+	
+	public Set getOrders() {
+		return orders;
+	}
+	
+	public void setOrders(Set orders) {
+		this.orders = orders;
+	}
+	public Person getPerson() {
+		return person;
+	}
+	
+	public void setPerson(Person person) {
+		this.person = person;
+	}
+	public ProductId getProductId() {
+		return productId;
+	}
+
+	public void setProductId(ProductId orderId) {
+		this.productId = orderId;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String product) {
+		this.name = product;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Product.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/SpaceShip.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/SpaceShip.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/SpaceShip.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,53 @@
+//$Id: $
+package org.hibernate.test.sql.hand;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class SpaceShip {
+	private Integer id;
+	private String name;
+	private String model;
+	private double speed;
+	private Dimension dimensions;
+
+	public Dimension getDimensions() {
+		return dimensions;
+	}
+
+	public void setDimensions(Dimension dimensions) {
+		this.dimensions = dimensions;
+	}
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getModel() {
+		return model;
+	}
+
+	public void setModel(String model) {
+		this.model = model;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public double getSpeed() {
+		return speed;
+	}
+
+	public void setSpeed(double speed) {
+		this.speed = speed;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/SpaceShip.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Speech.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Speech.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Speech.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,35 @@
+//$Id: $
+package org.hibernate.test.sql.hand;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Speech {
+	private Integer id;
+	private String name;
+	private Double length;
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public Double getLength() {
+		return length;
+	}
+
+	public void setLength(Double length) {
+		this.length = length;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/Speech.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/TextHolder.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/TextHolder.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/TextHolder.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.sql.hand;
+
+/**
+ * @author Gail Badner
+ */
+public class TextHolder {
+	private Long id;
+	private String description;
+
+	public TextHolder(String description) {
+		this.description = description;
+	}
+
+	public TextHolder() {
+	}
+
+	/**
+	 * @return Returns the id.
+	 */
+	public Long getId() {
+		return id;
+	}
+
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	/**
+	 * @return Returns the description.
+	 */
+	public String getDescription() {
+		return description;
+	}
+
+	/**
+	 * @param description The description to set.
+	 */
+	public void setDescription(String description) {
+		this.description = description;
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/TextHolder.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/CustomSQLTestSupport.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/CustomSQLTestSupport.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/CustomSQLTestSupport.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,174 @@
+package org.hibernate.test.sql.hand.custom;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.Iterator;
+
+import org.hibernate.LockMode;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.DatabaseSpecificFunctionalTestCase;
+import org.hibernate.util.ArrayHelper;
+import org.hibernate.test.sql.hand.Employment;
+import org.hibernate.test.sql.hand.Organization;
+import org.hibernate.test.sql.hand.Person;
+import org.hibernate.test.sql.hand.TextHolder;
+import org.hibernate.test.sql.hand.ImageHolder;
+
+/**
+ * Abstract test case defining tests for the support for user-supplied (aka
+ * custom) insert, update, delete SQL.
+ *
+ * @author Steve Ebersole
+ */
+public abstract class CustomSQLTestSupport extends DatabaseSpecificFunctionalTestCase {
+
+	public CustomSQLTestSupport(String name) {
+		super( name );
+	}
+
+	public String getCacheConcurrencyStrategy() {
+		return null;
+	}
+
+	public void testHandSQL() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Organization ifa = new Organization( "IFA" );
+		Organization jboss = new Organization( "JBoss" );
+		Person gavin = new Person( "Gavin" );
+		Employment emp = new Employment( gavin, jboss, "AU" );
+		Serializable orgId = s.save( jboss );
+		s.save( ifa );
+		s.save( gavin );
+		s.save( emp );
+		t.commit();
+
+		t = s.beginTransaction();
+		Person christian = new Person( "Christian" );
+		s.save( christian );
+		Employment emp2 = new Employment( christian, jboss, "EU" );
+		s.save( emp2 );
+		t.commit();
+		s.close();
+
+		getSessions().evict( Organization.class );
+		getSessions().evict( Person.class );
+		getSessions().evict( Employment.class );
+
+		s = openSession();
+		t = s.beginTransaction();
+		jboss = ( Organization ) s.get( Organization.class, orgId );
+		assertEquals( jboss.getEmployments().size(), 2 );
+		assertEquals( jboss.getName(), "JBOSS" );
+		emp = ( Employment ) jboss.getEmployments().iterator().next();
+		gavin = emp.getEmployee();
+		assertEquals( gavin.getName(), "GAVIN" );
+		assertEquals( s.getCurrentLockMode( gavin ), LockMode.UPGRADE );
+		emp.setEndDate( new Date() );
+		Employment emp3 = new Employment( gavin, jboss, "US" );
+		s.save( emp3 );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Iterator iter = s.getNamedQuery( "allOrganizationsWithEmployees" ).list().iterator();
+		assertTrue( iter.hasNext() );
+		Organization o = ( Organization ) iter.next();
+		assertEquals( o.getEmployments().size(), 3 );
+		Iterator iter2 = o.getEmployments().iterator();
+		while ( iter2.hasNext() ) {
+			Employment e = ( Employment ) iter2.next();
+			s.delete( e );
+		}
+		iter2 = o.getEmployments().iterator();
+		while ( iter2.hasNext() ) {
+			Employment e = ( Employment ) iter2.next();
+			s.delete( e.getEmployee() );
+		}
+		s.delete( o );
+		assertFalse( iter.hasNext() );
+		s.delete( ifa );
+		t.commit();
+		s.close();
+	}
+
+	public void testTextProperty() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		String description = buildLongString( 15000, 'a' );
+		TextHolder holder = new TextHolder( description );
+		s.save( holder );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		holder = ( TextHolder ) s.get(  TextHolder.class, holder.getId() );
+		assertEquals( description, holder.getDescription() );
+		description = buildLongString( 15000, 'b' );
+		holder.setDescription( description );
+		s.save( holder );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		holder = ( TextHolder ) s.get(  TextHolder.class, holder.getId() );
+		assertEquals( description, holder.getDescription() );
+		s.delete( holder );
+		t.commit();
+		s.close();
+	}
+
+	public void testImageProperty() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		byte[] photo = buildLongByteArray( 15000, true );
+		ImageHolder holder = new ImageHolder( photo );
+		s.save( holder );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		holder = ( ImageHolder ) s.get(  ImageHolder.class, holder.getId() );
+		assertTrue( ArrayHelper.isEquals( photo, holder.getPhoto() ) );
+		photo = buildLongByteArray( 15000, false );
+		holder.setPhoto( photo );
+		s.save( holder );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		holder = ( ImageHolder ) s.get(  ImageHolder.class, holder.getId() );
+		assertTrue( ArrayHelper.isEquals( photo, holder.getPhoto() ) );
+		s.delete( holder );
+		t.commit();
+		s.close();
+	}
+
+	private String buildLongString(int size, char baseChar) {
+		StringBuffer buff = new StringBuffer();
+		for( int i = 0; i < size; i++ ) {
+			buff.append( baseChar );
+		}
+		return buff.toString();
+	}
+
+	private byte[] buildLongByteArray(int size, boolean on) {
+		byte[] data = new byte[size];
+		data[0] = mask( on );
+		for ( int i = 0; i < size; i++ ) {
+			data[i] = mask( on );
+			on = !on;
+		}
+		return data;
+	}
+
+	private byte mask(boolean on) {
+		return on ? ( byte ) 1 : ( byte ) 0;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/CustomSQLTestSupport.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/CustomStoredProcTestSupport.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/CustomStoredProcTestSupport.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/CustomStoredProcTestSupport.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,83 @@
+package org.hibernate.test.sql.hand.custom;
+
+import java.sql.SQLException;
+import java.util.List;
+
+import org.hibernate.HibernateException;
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.sql.hand.Employment;
+import org.hibernate.test.sql.hand.Organization;
+import org.hibernate.test.sql.hand.Person;
+
+/**
+ * Abstract test case defining tests of stored procedure support.
+ *
+ * @author Gail Badner
+ */
+public abstract class CustomStoredProcTestSupport extends CustomSQLTestSupport {
+
+	public CustomStoredProcTestSupport(String name) {
+		super( name );
+	}
+
+	public void testScalarStoredProcedure() throws HibernateException, SQLException {
+		Session s = openSession();
+		Query namedQuery = s.getNamedQuery( "simpleScalar" );
+		namedQuery.setLong( "number", 43 );
+		List list = namedQuery.list();
+		Object o[] = ( Object[] ) list.get( 0 );
+		assertEquals( o[0], "getAll" );
+		assertEquals( o[1], new Long( 43 ) );
+		s.close();
+	}
+
+	public void testParameterHandling() throws HibernateException, SQLException {
+		Session s = openSession();
+
+		Query namedQuery = s.getNamedQuery( "paramhandling" );
+		namedQuery.setLong( 0, 10 );
+		namedQuery.setLong( 1, 20 );
+		List list = namedQuery.list();
+		Object[] o = ( Object[] ) list.get( 0 );
+		assertEquals( o[0], new Long( 10 ) );
+		assertEquals( o[1], new Long( 20 ) );
+
+		namedQuery = s.getNamedQuery( "paramhandling_mixed" );
+		namedQuery.setLong( 0, 10 );
+		namedQuery.setLong( "second", 20 );
+		list = namedQuery.list();
+		o = ( Object[] ) list.get( 0 );
+		assertEquals( o[0], new Long( 10 ) );
+		assertEquals( o[1], new Long( 20 ) );
+		s.close();
+	}
+
+	public void testEntityStoredProcedure() throws HibernateException, SQLException {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Organization ifa = new Organization( "IFA" );
+		Organization jboss = new Organization( "JBoss" );
+		Person gavin = new Person( "Gavin" );
+		Employment emp = new Employment( gavin, jboss, "AU" );
+		s.persist( ifa );
+		s.persist( jboss );
+		s.persist( gavin );
+		s.persist( emp );
+
+		Query namedQuery = s.getNamedQuery( "selectAllEmployments" );
+		List list = namedQuery.list();
+		assertTrue( list.get( 0 ) instanceof Employment );
+		s.delete( emp );
+		s.delete( ifa );
+		s.delete( jboss );
+		s.delete( gavin );
+
+		t.commit();
+		s.close();
+	}
+
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/CustomStoredProcTestSupport.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/datadirect/oracle/DataDirectOracleCustomSQLTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/datadirect/oracle/DataDirectOracleCustomSQLTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/datadirect/oracle/DataDirectOracleCustomSQLTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,35 @@
+//$Id$
+package org.hibernate.test.sql.hand.custom.datadirect.oracle;
+
+import junit.framework.Test;
+
+import org.hibernate.dialect.DataDirectOracle9Dialect;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.sql.hand.custom.CustomStoredProcTestSupport;
+
+/**
+ * Custom SQL tests for Oracle via the DataDirect drivers.
+ * 
+ * @author Max Rydahl Andersen
+ */
+public class DataDirectOracleCustomSQLTest extends CustomStoredProcTestSupport {
+	
+	public DataDirectOracleCustomSQLTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "sql/hand/custom/oracle/Mappings.hbm.xml", "sql/hand/custom/datadirect/oracle/StoredProcedures.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( DataDirectOracleCustomSQLTest.class );
+	}
+
+	public boolean appliesTo(Dialect dialect) {
+		return ( dialect instanceof DataDirectOracle9Dialect );
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/datadirect/oracle/DataDirectOracleCustomSQLTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/datadirect/oracle/StoredProcedures.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/datadirect/oracle/StoredProcedures.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/datadirect/oracle/StoredProcedures.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,44 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+    This version is for DataDirect drivers jdbc standard handling of stored procedures/functions.
+-->
+<hibernate-mapping package="org.hibernate.test.sql.hand" default-access="field">
+
+	<sql-query name="simpleScalar" callable="true">
+	 <return-scalar column="name" type="string"/>
+	 <return-scalar column="value" type="long"/>
+	 { call simpleScalar(:number) }
+	</sql-query>
+	<sql-query name="paramhandling" callable="true">
+		<return-scalar column="value" type="long" />
+		<return-scalar column="value2" type="long" />
+		{ call testParamHandling(?,?) }
+	</sql-query>
+
+	<sql-query name="paramhandling_mixed" callable="true">
+		<return-scalar column="value" type="long" />
+		<return-scalar column="value2" type="long" />
+		{ call testParamHandling(?,:second) }
+	</sql-query>
+
+	<sql-query name="selectAllEmployments" callable="true">
+		<return alias="emp" class="Employment">
+			<return-property name="employee" column="EMPLOYEE"/>
+			<return-property name="employer" column="EMPLOYER"/>			
+			<return-property name="startDate" column="STARTDATE"/>
+			<return-property name="endDate" column="ENDDATE"/>			
+			<return-property name="regionCode" column="REGIONCODE"/>			
+			<return-property name="employmentId" column="EMPID"/>						
+			<return-property name="salary">
+  			  <return-column name="VALUE"/>
+			  <return-column name="CURRENCY"/>			
+			</return-property>
+		</return>
+	 { call allEmployments() }
+	</sql-query>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/datadirect/oracle/StoredProcedures.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/db2/DB2CustomSQLTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/db2/DB2CustomSQLTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/db2/DB2CustomSQLTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,35 @@
+//$Id$
+package org.hibernate.test.sql.hand.custom.db2;
+
+import junit.framework.Test;
+
+import org.hibernate.dialect.DB2Dialect;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.sql.hand.custom.CustomStoredProcTestSupport;
+
+/**
+ * Custom SQL tests for DB2
+ * 
+ * @author Max Rydahl Andersen
+ */
+public class DB2CustomSQLTest extends CustomStoredProcTestSupport {
+	
+	public DB2CustomSQLTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "sql/hand/custom/db2/Mappings.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( DB2CustomSQLTest.class );
+	}
+
+	public boolean appliesTo(Dialect dialect) {
+		return ( dialect instanceof DB2Dialect);
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/db2/DB2CustomSQLTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/db2/Mappings.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/db2/Mappings.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/db2/Mappings.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,271 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+    This mapping demonstrates the use of Hibernate with all-handwritten SQL!
+
+    NOTE : this version is for DB2 & variants
+-->
+<hibernate-mapping package="org.hibernate.test.sql.hand" default-access="field">
+
+	<class name="Organization" table="ORGANIZATION">
+		<id name="id" unsaved-value="0" column="ORGID">
+			<generator class="increment"/>
+		</id>
+		<property name="name" not-null="true" column="NAME"/>
+		<set name="employments" 
+			inverse="true"
+			order-by="DUMMY">
+			<key column="EMPLOYER"/> <!-- only needed for DDL generation -->
+			<one-to-many class="Employment"/>
+			<loader query-ref="organizationEmployments"/>
+		</set>
+		<!-- query-list name="currentEmployments" 
+			query-ref="organizationCurrentEmployments"-->
+		<loader query-ref="organization"/>
+		<sql-insert>INSERT INTO ORGANIZATION (NAME, ORGID) VALUES ( UPPER(? || ''), ? )</sql-insert>
+		<sql-update>UPDATE ORGANIZATION SET NAME=UPPER(? || '') WHERE ORGID=?</sql-update>
+		<sql-delete>DELETE FROM ORGANIZATION WHERE ORGID=?</sql-delete>
+	</class>
+	
+	<class name="Person" table="PERSON">
+		<id name="id" unsaved-value="0" column="PERID">
+			<generator class="increment"/>
+		</id>
+		<property name="name" not-null="true" column="NAME"/>
+		<loader query-ref="person"/>
+		<sql-insert>INSERT INTO PERSON (NAME, PERID) VALUES ( UPPER(? || ''), ? )</sql-insert>
+		<sql-update>UPDATE PERSON SET NAME=UPPER(? || '') WHERE PERID=?</sql-update>
+		<sql-delete>DELETE FROM PERSON WHERE PERID=?</sql-delete>
+	</class>
+	
+	<class name="Employment" table="EMPLOYMENT">
+		<id name="employmentId" unsaved-value="0" column="EMPID">
+			<generator class="increment"/>
+		</id>
+		<many-to-one name="employee" column="EMPLOYEE" not-null="true" update="false"/>
+		<many-to-one name="employer" column="EMPLOYER" not-null="true" update="false"/>
+		<property name="startDate" column="STARTDATE" not-null="true" update="false" insert="false"/>
+		<property name="endDate" column="ENDDATE" insert="false"/>
+		<property name="regionCode" column="REGIONCODE" update="false"/>
+        <property name="salary" type="org.hibernate.test.sql.hand.MonetaryAmountUserType">
+			<column name="VALUE" sql-type="float"/>
+			<column name="CURRENCY"/>			
+		</property>
+		<loader query-ref="employment"/>
+   		<sql-insert>
+			INSERT INTO EMPLOYMENT 
+				(EMPLOYEE, EMPLOYER, STARTDATE, REGIONCODE, VALUE, CURRENCY, EMPID) 
+				 <!-- inserting raw specific timestamp since using current date or current timestamp for some reason does not work with a timestamp column! -->
+				VALUES (?, ?, TIMESTAMP ('2006-02-28 11:39:00'), UPPER(? || ''), ?, ?, ?)
+		</sql-insert>
+		<sql-update>UPDATE EMPLOYMENT SET ENDDATE=?, VALUE=?, CURRENCY=? WHERE EMPID=?</sql-update> 
+		<sql-delete>DELETE FROM EMPLOYMENT WHERE EMPID=?</sql-delete> 
+	</class>
+
+    <class name="TextHolder">
+        <id name="id" column="id">
+            <generator class="increment"/>
+        </id>
+        <property name="description" type="text" length="15000"/>
+        <loader query-ref="textholder"/>
+        <sql-insert>
+            INSERT INTO TEXTHOLDER
+            (DESCRIPTION, ID)
+            VALUES (?, ?)
+        </sql-insert>
+        <sql-update>UPDATE TEXTHOLDER SET DESCRIPTION=? WHERE ID=?</sql-update>
+        <sql-delete>DELETE FROM TEXTHOLDER WHERE ID=?</sql-delete>
+    </class>
+
+    <class name="ImageHolder">
+        <id name="id" column="id">
+            <generator class="increment"/>
+        </id>
+        <property name="photo" type="image" length="15000"/>
+        <loader query-ref="imageholder"/>
+        <sql-insert>
+            INSERT INTO IMAGEHOLDER
+            (PHOTO, ID)
+            VALUES (?, ?)
+        </sql-insert>
+        <sql-update>UPDATE IMAGEHOLDER SET PHOTO=? WHERE ID=?</sql-update>
+        <sql-delete>DELETE FROM IMAGEHOLDER WHERE ID=?</sql-delete>
+    </class>
+    
+    <resultset name="org-emp-regionCode">
+        <return-scalar column="regionCode" type="string"/>
+        <return alias="org" class="Organization"/>
+        <return-join alias="emp" property="org.employments"/>
+    </resultset>
+
+    <resultset name="org-emp-person">
+        <return alias="org" class="Organization"/>
+        <return-join alias="emp" property="org.employments"/>
+        <return-join alias="pers" property="emp.employee"/>
+    </resultset>
+	
+	<sql-query name="person">
+		<return alias="p" class="Person" lock-mode="upgrade"/>
+		SELECT NAME AS {p.name}, PERID AS {p.id} FROM PERSON WHERE PERID=? /*FOR UPDATE*/
+	</sql-query>
+
+	<sql-query name="organization">
+		<return alias="org" class="Organization"/>
+		<return-join alias="emp" property="org.employments"/>
+		SELECT {org.*}, {emp.*}
+		FROM ORGANIZATION org
+			LEFT OUTER JOIN EMPLOYMENT emp ON org.ORGID = emp.EMPLOYER
+		WHERE org.ORGID=?
+	</sql-query>
+
+
+	<!--sql-query name="organization">
+		<return alias="org" class="Organization"/>
+		SELECT NAME AS {org.name}, ORGID AS {org.id} FROM ORGANIZATION
+		WHERE ORGID=?
+	</sql-query-->
+	
+	<sql-query name="allOrganizationsWithEmployees" flush-mode="never">
+		<return alias="org" class="Organization"/>
+		SELECT DISTINCT org.NAME AS {org.name}, org.ORGID AS {org.id} 
+		FROM ORGANIZATION org
+		INNER JOIN EMPLOYMENT e ON e.EMPLOYER = org.ORGID
+	</sql-query>
+	
+	
+	
+
+	
+	<sql-query name="employment">
+		<return alias="emp" class="Employment"/>
+		SELECT EMPLOYEE AS {emp.employee}, EMPLOYER AS {emp.employer}, 
+			STARTDATE AS {emp.startDate}, ENDDATE AS {emp.endDate},
+			REGIONCODE as {emp.regionCode}, EMPID AS {emp.id}
+		FROM EMPLOYMENT
+		WHERE EMPID = ?
+	</sql-query>
+
+	<sql-query name="organizationEmployments">
+		<load-collection alias="empcol" role="Organization.employments"/>
+		SELECT {empcol.*}
+		FROM EMPLOYMENT empcol
+		WHERE EMPLOYER = :id
+		ORDER BY STARTDATE ASC, EMPLOYEE ASC
+	</sql-query>
+
+
+	<sql-query name="organizationCurrentEmployments">
+		<return alias="emp" class="Employment">		    
+			<return-property name="salary"> 
+		      <!-- as multi column properties are not supported via the
+		      {}-syntax, we need to provide an explicit column list for salary via <return-property> -->
+  			  <return-column name="VALUE"/>
+			  <return-column name="CURRENCY"/>			
+			</return-property>
+			<!-- Here we are remapping endDate. Notice that we can still use {emp.endDate} in the SQL. -->
+			<return-property name="endDate" column="myEndDate"/>
+		</return>
+		<synchronize table="EMPLOYMENT"/>
+		SELECT EMPLOYEE AS {emp.employee}, EMPLOYER AS {emp.employer}, 
+			STARTDATE AS {emp.startDate}, ENDDATE AS {emp.endDate},
+			REGIONCODE as {emp.regionCode}, EMPID AS {emp.id}, VALUE, CURRENCY
+		FROM EMPLOYMENT
+		WHERE EMPLOYER = :id AND ENDDATE IS NULL
+		ORDER BY STARTDATE ASC
+	</sql-query>
+
+	<sql-query name="simpleScalar" callable="true">
+		<return-scalar column="name" type="string"/>
+		<return-scalar column="value" type="long"/>
+		{ call simpleScalar(:number) }
+	</sql-query>
+
+	<sql-query name="paramhandling" callable="true">
+		<return-scalar column="value" type="long"/>
+		<return-scalar column="value2" type="long"/>
+		{ call paramHandling(?,?) }
+	</sql-query>
+
+	<sql-query name="paramhandling_mixed" callable="true">
+		<return-scalar column="value" type="long" />
+		<return-scalar column="value2" type="long" />
+		{ call paramHandling(?,:second) }
+	</sql-query>
+	
+	<sql-query name="selectAllEmployments" callable="true">
+		<return alias="" class="Employment">
+			<return-property name="employee" column="EMPLOYEE"/>
+			<return-property name="employer" column="EMPLOYER"/>			
+			<return-property name="startDate" column="STARTDATE"/>
+			<return-property name="endDate" column="ENDDATE"/>			
+			<return-property name="regionCode" column="REGIONCODE"/>			
+			<return-property name="id" column="EMPID"/>						
+			<return-property name="salary"> 
+				<!-- as multi column properties are not supported via the
+				{}-syntax, we need to provide an explicit column list for salary via <return-property> -->
+				<return-column name="VALUE"/>
+				<return-column name="CURRENCY"/>			
+			</return-property>
+		</return>
+		{ call selectAllEmployments() }
+	</sql-query>
+
+    <sql-query name="textholder">
+        <return alias="h" class="TextHolder" lock-mode="upgrade"/>
+        SELECT ID AS {h.id}, DESCRIPTION AS {h.description} FROM TEXTHOLDER WHERE ID=? /*FOR UPDATE*/
+    </sql-query>
+
+    <sql-query name="imageholder">
+        <return alias="h" class="ImageHolder" lock-mode="upgrade"/>
+        SELECT ID AS {h.id}, PHOTO AS {h.photo} FROM IMAGEHOLDER WHERE ID=? /*FOR UPDATE*/
+    </sql-query>
+
+	
+	<database-object>
+		<create>
+		CREATE PROCEDURE selectAllEmployments () RESULT SETS 1
+        P1: BEGIN
+         DECLARE C1 CURSOR WITH RETURN FOR
+			SELECT EMPLOYEE, EMPLOYER, STARTDATE, ENDDATE, 
+			REGIONCODE, EMPID, VALUE, CURRENCY
+			FROM EMPLOYMENT;
+         OPEN C1;
+        END P1
+		</create>
+		<drop>
+		DROP PROCEDURE selectAllEmployments
+		</drop>
+	</database-object>
+
+	
+	<database-object>
+		<create>
+		CREATE PROCEDURE paramHandling (IN j SMALLINT, IN i SMALLINT) RESULT SETS 1
+        P1: BEGIN
+         DECLARE C1 CURSOR WITH RETURN FOR
+    		SELECT j as value, i as value2 from sysibm.sysdummy1;
+         OPEN C1;
+        END P1
+		</create>
+		<drop>
+		DROP PROCEDURE paramHandling
+		</drop>
+	</database-object>
+	
+    <database-object>
+	 <create>
+		CREATE PROCEDURE simpleScalar (IN j SMALLINT) RESULT SETS 1
+        P1: BEGIN
+         DECLARE C1 CURSOR WITH RETURN FOR
+    		SELECT j as value, 'getAll' as name from sysibm.sysdummy1;
+         OPEN C1;
+        END P1
+	 </create>
+	 <drop>
+		DROP PROCEDURE simpleScalar
+	 </drop>
+	</database-object>	
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/db2/Mappings.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/mysql/Mappings.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/mysql/Mappings.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/mysql/Mappings.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,256 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+    This mapping demonstrates the use of Hibernate with all-handwritten SQL!
+
+    This version is for MySQL
+-->
+
+<hibernate-mapping package="org.hibernate.test.sql.hand" default-access="field">
+
+	<class name="Organization">
+		<id name="id" unsaved-value="0" column="orgid">
+			<generator class="increment"/>
+		</id>
+		<property name="name" not-null="true"/>
+		<set name="employments" 
+			inverse="true"
+			order-by="DUMMY">
+			<key column="employer"/> <!-- only needed for DDL generation -->
+			<one-to-many class="Employment"/>
+			<loader query-ref="organizationEmployments"/>
+		</set>
+		<!-- query-list name="currentEmployments" 
+			query-ref="organizationCurrentEmployments"-->
+		<loader query-ref="organization"/>
+		<sql-insert>INSERT INTO Organization (NAME, ORGID) VALUES ( UPPER(?), ? )</sql-insert>
+		<sql-update>UPDATE Organization SET NAME=UPPER(?) WHERE ORGID=?</sql-update>
+		<sql-delete>DELETE FROM Organization WHERE ORGID=?</sql-delete>
+	</class>
+	
+	<class name="Person">
+		<id name="id" unsaved-value="0" column="perid">
+			<generator class="increment"/>
+		</id>
+		<property name="name" not-null="true"/>
+		<loader query-ref="person"/>
+		<sql-insert>INSERT INTO Person (NAME, PERID) VALUES ( UPPER(?), ? )</sql-insert>
+		<sql-update>UPDATE Person SET NAME=UPPER(?) WHERE PERID=?</sql-update>
+		<sql-delete>DELETE FROM Person WHERE PERID=?</sql-delete>
+	</class>
+	
+	<class name="Employment">
+		<id name="employmentId" unsaved-value="0" column="empid">
+			<generator class="increment"/>
+		</id>
+		<many-to-one name="employee" not-null="true" update="false"/>
+		<many-to-one name="employer" not-null="true" update="false"/>
+		<property name="startDate" not-null="true" update="false" insert="false"/>
+		<property name="endDate" insert="false"/>
+		<property name="regionCode" update="false"/>
+	  <property name="salary" type="org.hibernate.test.sql.hand.MonetaryAmountUserType">
+			<column name="VALUE" sql-type="float"/>
+			<column name="CURRENCY"/>			
+		</property>
+		<loader query-ref="employment"/>
+   		<sql-insert>
+			INSERT INTO Employment 
+				(EMPLOYEE, EMPLOYER, STARTDATE, REGIONCODE, VALUE, CURRENCY, EMPID) 
+				VALUES (?, ?, now(), UPPER(?), ?, ?, ?)
+		</sql-insert>
+		<sql-update>UPDATE Employment SET ENDDATE=?, VALUE=?, CURRENCY=? WHERE EMPID=?</sql-update> 
+		<sql-delete>DELETE FROM Employment WHERE EMPID=?</sql-delete> 
+	</class>
+
+    <class name="TextHolder">
+        <id name="id" column="id">
+            <generator class="increment"/>
+        </id>
+        <property name="description" type="text" length="15000"/>
+        <loader query-ref="textholder"/>
+        <sql-insert>
+            INSERT INTO TextHolder
+            (DESCRIPTION, ID)
+            VALUES (?, ?)
+        </sql-insert>
+        <sql-update>UPDATE TextHolder SET DESCRIPTION=? WHERE ID=?</sql-update>
+        <sql-delete>DELETE FROM TextHolder WHERE ID=?</sql-delete>
+    </class>
+
+    <class name="ImageHolder">
+        <id name="id" column="id">
+            <generator class="increment"/>
+        </id>
+        <property name="photo" type="image" length="15000"/>
+        <loader query-ref="imageholder"/>
+        <sql-insert>
+            INSERT INTO ImageHolder
+            (PHOTO, ID)
+            VALUES (?, ?)
+        </sql-insert>
+        <sql-update>UPDATE ImageHolder SET PHOTO=? WHERE ID=?</sql-update>
+        <sql-delete>DELETE FROM ImageHolder WHERE ID=?</sql-delete>
+    </class>
+    
+    <resultset name="org-emp-regionCode">
+        <return-scalar column="regionCode" type="string"/>
+        <return alias="org" class="Organization"/>
+        <return-join alias="emp" property="org.employments"/>
+    </resultset>
+
+    <resultset name="org-emp-person">
+        <return alias="org" class="Organization"/>
+        <return-join alias="emp" property="org.employments"/>
+        <return-join alias="pers" property="emp.employee"/>
+    </resultset>
+	
+	<sql-query name="person">
+		<return alias="p" class="Person" lock-mode="upgrade"/>
+		SELECT NAME AS {p.name}, PERID AS {p.id} FROM Person WHERE PERID=? /*FOR UPDATE*/
+	</sql-query>
+
+	<sql-query name="organization">
+		<return alias="org" class="Organization"/>
+		<return-join alias="emp" property="org.employments"/>
+		SELECT {org.*}, {emp.*}
+		FROM Organization org
+			LEFT OUTER JOIN Employment emp ON org.ORGID = emp.EMPLOYER
+		WHERE org.ORGID=?
+	</sql-query>
+
+
+
+	<!--sql-query name="organization">
+		<return alias="org" class="Organization"/>
+		SELECT NAME AS {org.name}, ORGID AS {org.id} FROM ORGANIZATION
+		WHERE ORGID=?
+	</sql-query-->
+	
+	<sql-query name="allOrganizationsWithEmployees" flush-mode="never">
+		<return alias="org" class="Organization"/>
+		SELECT DISTINCT org.NAME AS {org.name}, org.ORGID AS {org.id} 
+		FROM Organization org
+		INNER JOIN Employment e ON e.EMPLOYER = org.ORGID
+	</sql-query>
+	
+	<sql-query name="employment">
+		<return alias="emp" class="Employment"/>
+		SELECT EMPLOYEE AS {emp.employee}, EMPLOYER AS {emp.employer}, 
+			STARTDATE AS {emp.startDate}, ENDDATE AS {emp.endDate},
+			REGIONCODE as {emp.regionCode}, EMPID AS {emp.id}
+		FROM Employment
+		WHERE EMPID = ?
+	</sql-query>
+
+	
+	<sql-query name="organizationEmployments">
+		<load-collection alias="empcol" role="Organization.employments"/>
+		SELECT {empcol.*}
+		FROM Employment empcol
+		WHERE EMPLOYER = :id
+		ORDER BY STARTDATE ASC, EMPLOYEE ASC
+	</sql-query>
+
+
+	<sql-query name="organizationCurrentEmployments">
+		<return alias="emp" class="Employment">		    
+			<return-property name="salary"> 
+		      <!-- as multi column properties are not supported via the
+		      {}-syntax, we need to provide an explicit column list for salary via <return-property> -->
+  			  <return-column name="VALUE"/>
+			  <return-column name="CURRENCY"/>			
+			</return-property>
+			<!-- Here we are remapping endDate. Notice that we can still use {emp.endDate} in the SQL. -->
+			<return-property name="endDate" column="myEndDate"/>
+		</return>
+		<synchronize table="EMPLOYMENT"/>
+		SELECT EMPLOYEE AS {emp.employee}, EMPLOYER AS {emp.employer}, 
+			STARTDATE AS {emp.startDate}, ENDDATE AS {emp.endDate},
+			REGIONCODE as {emp.regionCode}, EMPID AS {emp.id}, VALUE, CURRENCY
+		FROM Employment
+		WHERE EMPLOYER = :id AND ENDDATE IS NULL
+		ORDER BY STARTDATE ASC
+	</sql-query>
+
+	<sql-query name="simpleScalar" callable="true">
+	 <return-scalar column="name" type="string"/>
+	 <return-scalar column="value" type="long"/>
+		{ call simpleScalar(:number) }
+	</sql-query>
+
+	<sql-query name="paramhandling" callable="true">
+		<return-scalar column="value" type="long"/>
+		<return-scalar column="value2" type="long"/>
+		{ call paramHandling(?,?) }
+	</sql-query>
+
+	<sql-query name="paramhandling_mixed" callable="true">
+		<return-scalar column="value" type="long" />
+		<return-scalar column="value2" type="long" />
+		{ call paramHandling(?,:second) }
+	</sql-query>
+	
+	<sql-query name="selectAllEmployments" callable="true">
+		<return alias="" class="Employment">
+			<return-property name="employee" column="EMPLOYEE"/>
+			<return-property name="employer" column="EMPLOYER"/>			
+			<return-property name="startDate" column="STARTDATE"/>
+			<return-property name="endDate" column="ENDDATE"/>			
+			<return-property name="regionCode" column="REGIONCODE"/>			
+			<return-property name="id" column="EMPID"/>						
+			<return-property name="salary"> 
+				<!-- as multi column properties are not supported via the
+				{}-syntax, we need to provide an explicit column list for salary via <return-property> -->
+				<return-column name="VALUE"/>
+				<return-column name="CURRENCY"/>			
+			</return-property>
+		</return>
+		{ call selectAllEmployments() }
+	</sql-query>
+
+    <sql-query name="textholder">
+        <return alias="h" class="TextHolder" lock-mode="upgrade"/>
+        SELECT ID AS {h.id}, DESCRIPTION AS {h.description} FROM TextHolder WHERE ID=? /*FOR UPDATE*/
+    </sql-query>
+
+    <sql-query name="imageholder">
+        <return alias="h" class="ImageHolder" lock-mode="upgrade"/>
+        SELECT ID AS {h.id}, PHOTO AS {h.photo} FROM ImageHolder WHERE ID=? /*FOR UPDATE*/
+    </sql-query>
+
+	<database-object>
+		<create>
+		CREATE PROCEDURE selectAllEmployments ()
+			SELECT EMPLOYEE, EMPLOYER, STARTDATE, ENDDATE, 
+			REGIONCODE, EMPID, VALUE, CURRENCY
+			FROM Employment
+		</create>
+		<drop>
+		DROP PROCEDURE selectAllEmployments
+		</drop>
+	</database-object>
+	
+	<database-object>
+		<create>
+		CREATE PROCEDURE paramHandling (j int, i int) 
+			SELECT j AS value, i AS value2
+		</create>
+		<drop>
+		DROP PROCEDURE paramHandling
+		</drop>
+	</database-object>
+	
+	<database-object>
+		<create>
+		CREATE PROCEDURE simpleScalar (number int) 
+			SELECT number AS value, 'getAll' AS name
+		</create>
+		<drop>
+		DROP PROCEDURE simpleScalar
+		</drop>
+	</database-object>
+	
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/mysql/Mappings.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/mysql/MySQLCustomSQLTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/mysql/MySQLCustomSQLTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/mysql/MySQLCustomSQLTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,34 @@
+//$Id: MySQLCustomSQLTest.java 11486 2007-05-08 21:57:24Z steve.ebersole at jboss.com $
+package org.hibernate.test.sql.hand.custom.mysql;
+
+import junit.framework.Test;
+
+import org.hibernate.dialect.Dialect;
+import org.hibernate.dialect.MySQLDialect;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.sql.hand.custom.CustomStoredProcTestSupport;
+
+/**
+ * Custom SQL tests for MySQL
+ *
+ * @author Gavin King
+ */
+public class MySQLCustomSQLTest extends CustomStoredProcTestSupport {
+
+	public MySQLCustomSQLTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "sql/hand/custom/mysql/Mappings.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( MySQLCustomSQLTest.class );
+	}
+
+	public boolean appliesTo(Dialect dialect) {
+		return ( dialect instanceof MySQLDialect );
+	}
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/mysql/MySQLCustomSQLTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/oracle/Mappings.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/oracle/Mappings.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/oracle/Mappings.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,249 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+    This mapping demonstrates the use of Hibernate with all-handwritten SQL!
+
+    Note: this version is for Oracle
+-->
+<hibernate-mapping package="org.hibernate.test.sql.hand" default-access="field">
+
+    <class name="Organization">
+        <id name="id" unsaved-value="0" column="orgid">
+            <generator class="increment"/>
+        </id>
+        <property name="name" not-null="true"/>
+        <set name="employments"
+             inverse="true"
+             order-by="DUMMY">
+            <key column="employer"/>
+            <!-- only needed for DDL generation -->
+            <one-to-many class="Employment"/>
+            <loader query-ref="organizationEmployments"/>
+        </set>
+        <!-- query-list name="currentEmployments"
+         query-ref="organizationCurrentEmployments"-->
+        <loader query-ref="organization"/>
+        <sql-insert>INSERT INTO ORGANIZATION (NAME, ORGID) VALUES ( UPPER(?), ? )</sql-insert>
+        <sql-update>UPDATE ORGANIZATION SET NAME=UPPER(?) WHERE ORGID=?</sql-update>
+        <sql-delete>DELETE FROM ORGANIZATION WHERE ORGID=?</sql-delete>
+    </class>
+
+    <class name="Person">
+        <id name="id" unsaved-value="0" column="perid">
+            <generator class="increment"/>
+        </id>
+        <property name="name" not-null="true"/>
+        <loader query-ref="person"/>
+        <sql-insert callable="true" check="none">{call createPerson(?,?)}</sql-insert>
+        <sql-update>UPDATE PERSON SET NAME=UPPER(?) WHERE PERID=?</sql-update>
+        <sql-delete>DELETE FROM PERSON WHERE PERID=?</sql-delete>
+    </class>
+
+    <class name="Employment">
+        <id name="employmentId" unsaved-value="0" column="empid">
+            <generator class="increment"/>
+        </id>
+        <many-to-one name="employee" not-null="true" update="false"/>
+        <many-to-one name="employer" not-null="true" update="false"/>
+        <property name="startDate" not-null="true" update="false" insert="false"/>
+        <property name="endDate" insert="false"/>
+        <property name="regionCode" update="false"/>
+        <property name="salary" type="org.hibernate.test.sql.hand.MonetaryAmountUserType">
+            <column name="VALUE" sql-type="float"/>
+            <column name="CURRENCY"/>
+        </property>
+        <loader query-ref="employment"/>
+        <sql-insert>
+            INSERT INTO EMPLOYMENT
+            (EMPLOYEE, EMPLOYER, STARTDATE, REGIONCODE, VALUE, CURRENCY, EMPID)
+            VALUES (?, ?, CURRENT_DATE, UPPER(?), ?, ?, ?)
+        </sql-insert>
+        <sql-update>UPDATE EMPLOYMENT SET ENDDATE=?, VALUE=?, CURRENCY=? WHERE EMPID=?</sql-update>
+        <sql-delete>DELETE FROM EMPLOYMENT WHERE EMPID=?</sql-delete>
+    </class>
+
+    <class name="TextHolder">
+        <id name="id" column="id">
+            <generator class="increment"/>
+        </id>
+        <property name="description" type="text" length="15000"/>
+        <loader query-ref="textholder"/>
+        <sql-insert>
+            INSERT INTO TEXTHOLDER
+            (DESCRIPTION, ID)
+            VALUES (?, ?)
+        </sql-insert>
+        <sql-update>UPDATE TEXTHOLDER SET DESCRIPTION=? WHERE ID=?</sql-update>
+        <sql-delete>DELETE FROM TEXTHOLDER WHERE ID=?</sql-delete>
+    </class>
+
+    <class name="ImageHolder">
+        <id name="id" column="id">
+            <generator class="increment"/>
+        </id>
+        <property name="photo" type="image" length="15000"/>
+        <loader query-ref="imageholder"/>
+        <sql-insert>
+            INSERT INTO IMAGEHOLDER
+            (PHOTO, ID)
+            VALUES (?, ?)
+        </sql-insert>
+        <sql-update>UPDATE IMAGEHOLDER SET PHOTO=? WHERE ID=?</sql-update>
+        <sql-delete>DELETE FROM IMAGEHOLDER WHERE ID=?</sql-delete>
+    </class>    
+
+    <resultset name="org-emp-regionCode">
+        <return-scalar column="regionCode" type="string"/>
+        <return alias="org" class="Organization"/>
+        <return-join alias="emp" property="org.employments"/>
+    </resultset>
+
+    <resultset name="org-emp-person">
+        <return alias="org" class="Organization"/>
+        <return-join alias="emp" property="org.employments"/>
+        <return-join alias="pers" property="emp.employee"/>
+    </resultset>
+
+    <sql-query name="person">
+        <return alias="p" class="Person" lock-mode="upgrade"/>
+        SELECT NAME AS {p.name}, PERID AS {p.id} FROM PERSON WHERE PERID=? /*FOR UPDATE*/
+    </sql-query>
+
+    <sql-query name="organization">
+        <return alias="org" class="Organization"/>
+        <return-join alias="emp" property="org.employments"/>
+        SELECT {org.*}, {emp.*}
+        FROM ORGANIZATION org
+        LEFT OUTER JOIN EMPLOYMENT emp ON org.ORGID = emp.EMPLOYER
+        WHERE org.ORGID=?
+    </sql-query>
+
+
+    <sql-query name="allOrganizationsWithEmployees" flush-mode="never">
+        <return alias="org" class="Organization"/>
+        SELECT DISTINCT org.NAME AS {org.name}, org.ORGID AS {org.id}
+        FROM ORGANIZATION org
+        INNER JOIN EMPLOYMENT e ON e.EMPLOYER = org.ORGID
+    </sql-query>
+
+
+    <sql-query name="employment">
+        <return alias="emp" class="Employment"/>
+        SELECT EMPLOYEE AS {emp.employee}, EMPLOYER AS {emp.employer},
+        STARTDATE AS {emp.startDate}, ENDDATE AS {emp.endDate},
+        REGIONCODE as {emp.regionCode}, EMPID AS {emp.id}
+        FROM EMPLOYMENT
+        WHERE EMPID = ?
+    </sql-query>
+
+
+    <sql-query name="organizationEmployments">
+        <load-collection alias="empcol" role="Organization.employments"/>
+        SELECT {empcol.*}
+        FROM EMPLOYMENT empcol
+        WHERE EMPLOYER = :id
+        ORDER BY STARTDATE ASC, EMPLOYEE ASC
+    </sql-query>
+
+
+    <sql-query name="organizationCurrentEmployments">
+        <return alias="emp" class="Employment">
+            <return-property name="salary">
+                <!-- as multi column properties are not supported via the
+                              {}-syntax, we need to provide an explicit column list for salary via <return-property> -->
+                <return-column name="VALUE"/>
+                <return-column name="CURRENCY"/>
+            </return-property>
+            <!-- Here we are remapping endDate. Notice that we can still use {emp.endDate} in the SQL. -->
+            <return-property name="endDate" column="myEndDate"/>
+        </return>
+        <synchronize table="EMPLOYMENT"/>
+        SELECT EMPLOYEE AS {emp.employee}, EMPLOYER AS {emp.employer},
+        STARTDATE AS {emp.startDate}, ENDDATE AS {emp.endDate},
+        REGIONCODE as {emp.regionCode}, EMPID AS {emp.id}, VALUE, CURRENCY
+        FROM EMPLOYMENT
+        WHERE EMPLOYER = :id AND ENDDATE IS NULL
+        ORDER BY STARTDATE ASC
+    </sql-query>
+
+    <sql-query name="textholder">
+        <return alias="h" class="TextHolder" lock-mode="upgrade"/>
+        SELECT ID AS {h.id}, DESCRIPTION AS {h.description} FROM TEXTHOLDER WHERE ID=? /*FOR UPDATE*/
+    </sql-query>
+
+    <sql-query name="imageholder">
+        <return alias="h" class="ImageHolder" lock-mode="upgrade"/>
+        SELECT ID AS {h.id}, PHOTO AS {h.photo} FROM IMAGEHOLDER WHERE ID=? /*FOR UPDATE*/
+    </sql-query>
+
+    <database-object>
+        <create>
+            CREATE OR REPLACE FUNCTION testParamHandling (j number, i number)
+            RETURN SYS_REFCURSOR AS st_cursor SYS_REFCURSOR;
+            BEGIN
+            OPEN st_cursor FOR
+            SELECT j as value, i as value2 from dual;
+            RETURN st_cursor;
+            END;
+        </create>
+        <drop>
+            DROP FUNCTION testParamHandling
+        </drop>
+    </database-object>
+
+    <database-object>
+        <create>
+            CREATE OR REPLACE FUNCTION simpleScalar (j number)
+            RETURN SYS_REFCURSOR AS st_cursor SYS_REFCURSOR;
+            BEGIN
+            OPEN st_cursor FOR
+            SELECT j as value, 'getAll' as name from dual;
+            RETURN st_cursor;
+            END;
+        </create>
+        <drop>
+            DROP FUNCTION simpleScalar
+        </drop>
+    </database-object>
+
+    <database-object>
+        <create>
+            CREATE OR REPLACE FUNCTION allEmployments
+            RETURN SYS_REFCURSOR AS st_cursor SYS_REFCURSOR;
+            BEGIN
+            OPEN st_cursor FOR
+            SELECT EMPLOYEE, EMPLOYER, STARTDATE, ENDDATE,
+            REGIONCODE, EMPID, VALUE, CURRENCY
+            FROM EMPLOYMENT;
+            RETURN st_cursor;
+            END;
+        </create>
+        <drop>
+            DROP FUNCTION allEmployments
+        </drop>
+    </database-object>
+
+    <database-object>
+        <create>
+            CREATE OR REPLACE PROCEDURE createPerson(p_name PERSON.NAME%TYPE, p_id PERSON.PERID%TYPE)
+            AS
+                rowcount INTEGER;
+            BEGIN
+                INSERT INTO PERSON ( PERID, NAME ) VALUES ( p_id, UPPER( p_name ) );
+                rowcount := SQL%ROWCOUNT;
+                IF rowcount = 1 THEN
+                    NULL;
+                ELSE
+                    RAISE_APPLICATION_ERROR( -20001, 'Unexpected rowcount [' || rowcount || ']' );
+                END IF;
+            END;
+        </create>
+        <drop>
+            DROP PROCEDURE createPerson
+        </drop>
+    </database-object>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/oracle/Mappings.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/oracle/OracleCustomSQLTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/oracle/OracleCustomSQLTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/oracle/OracleCustomSQLTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,35 @@
+//$Id$
+package org.hibernate.test.sql.hand.custom.oracle;
+
+import junit.framework.Test;
+
+import org.hibernate.dialect.Dialect;
+import org.hibernate.dialect.Oracle9iDialect;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.sql.hand.custom.CustomStoredProcTestSupport;
+
+/**
+ * Custom SQL tests for Oracle
+ * 
+ * @author Gavin King
+ */
+public class OracleCustomSQLTest extends CustomStoredProcTestSupport {
+
+	public OracleCustomSQLTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "sql/hand/custom/oracle/Mappings.hbm.xml", "sql/hand/custom/oracle/StoredProcedures.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( OracleCustomSQLTest.class );
+	}
+
+	public boolean appliesTo(Dialect dialect) {
+		return ( dialect instanceof Oracle9iDialect );
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/oracle/OracleCustomSQLTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/oracle/StoredProcedures.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/oracle/StoredProcedures.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/oracle/StoredProcedures.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,45 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+    This version is for Oracle drivers proprietary handling of stored procedures/functions.
+-->
+<hibernate-mapping package="org.hibernate.test.sql.hand" default-access="field">
+
+    <sql-query name="simpleScalar" callable="true">
+        <return-scalar column="name" type="string"/>
+        <return-scalar column="value" type="long"/>
+        { ? = call simpleScalar(:number) }
+    </sql-query>
+
+    <sql-query name="paramhandling" callable="true">
+        <return-scalar column="value" type="long"/>
+        <return-scalar column="value2" type="long"/>
+        { ? = call testParamHandling(?,?) }
+    </sql-query>
+
+    <sql-query name="paramhandling_mixed" callable="true">
+        <return-scalar column="value" type="long"/>
+        <return-scalar column="value2" type="long"/>
+        { ? = call testParamHandling(?,:second) }
+    </sql-query>
+
+    <sql-query name="selectAllEmployments" callable="true">
+        <return alias="emp" class="Employment">
+            <return-property name="employee" column="EMPLOYEE"/>
+            <return-property name="employer" column="EMPLOYER"/>
+            <return-property name="startDate" column="STARTDATE"/>
+            <return-property name="endDate" column="ENDDATE"/>
+            <return-property name="regionCode" column="REGIONCODE"/>
+            <return-property name="employmentId" column="EMPID"/>
+            <return-property name="salary">
+                <return-column name="VALUE"/>
+                <return-column name="CURRENCY"/>
+            </return-property>
+        </return>
+        { ? = call allEmployments() }
+    </sql-query>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/oracle/StoredProcedures.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/sqlserver/Mappings.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/sqlserver/Mappings.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/sqlserver/Mappings.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,287 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+    This mapping demonstrates the use of Hibernate with all-handwritten SQL!
+     
+    NOTE: this version is for SQLServer
+-->
+<hibernate-mapping package="org.hibernate.test.sql.hand" default-access="field">
+
+	<class name="Organization" table="ORGANIZATION">
+		<id name="id" unsaved-value="0" column="ORGID">
+			<generator class="increment"/>
+		</id>
+		<property name="name" not-null="true" column="NAME"/>
+		<set name="employments" 
+			inverse="true"
+			order-by="DUMMY">
+			<key column="EMPLOYER"/> <!-- only needed for DDL generation -->
+			<one-to-many class="Employment"/>
+			<loader query-ref="organizationEmployments"/>
+		</set>
+		<!-- query-list name="currentEmployments" 
+			query-ref="organizationCurrentEmployments"-->
+		<loader query-ref="organization"/>
+		<sql-insert>INSERT INTO ORGANIZATION (NAME, ORGID) VALUES ( UPPER(?), ? )</sql-insert>
+		<sql-update>UPDATE ORGANIZATION SET NAME=UPPER(?) WHERE ORGID=?</sql-update>
+		<sql-delete>DELETE FROM ORGANIZATION WHERE ORGID=?</sql-delete>
+	</class>
+	
+	<class name="Person" table="PERSON">
+		<id name="id" unsaved-value="0" column="PERID">
+			<generator class="increment"/>
+		</id>
+		<property name="name" not-null="true" column="NAME"/>
+		<loader query-ref="person"/>
+		<sql-insert>INSERT INTO PERSON (NAME, PERID) VALUES ( UPPER(?), ? )</sql-insert>
+		<sql-update>UPDATE PERSON SET NAME=UPPER(?) WHERE PERID=?</sql-update>
+		<sql-delete>DELETE FROM PERSON WHERE PERID=?</sql-delete>
+	</class>
+	
+	<class name="Employment" table="EMPLOYMENT">
+		<id name="employmentId" unsaved-value="0" column="EMPID">
+			<generator class="increment"/>
+		</id>
+		<many-to-one name="employee" column="EMPLOYEE" not-null="true" update="false"/>
+		<many-to-one name="employer" column="EMPLOYER" not-null="true" update="false"/>
+		<property name="startDate" column="STARTDATE" not-null="true" update="false" insert="false"/>
+		<property name="endDate" column="ENDDATE" insert="false"/>
+		<property name="regionCode" column="REGIONCODE" update="false"/>
+        <property name="salary" type="org.hibernate.test.sql.hand.MonetaryAmountUserType">
+			<column name="VALUE" sql-type="float"/>
+			<column name="CURRENCY"/>			
+		</property>
+		<loader query-ref="employment"/>
+   		<sql-insert>
+			INSERT INTO EMPLOYMENT 
+				(EMPLOYEE, EMPLOYER, STARTDATE, REGIONCODE, VALUE, CURRENCY, EMPID) 
+				VALUES (?, ?, getdate(), UPPER(?), ?, ?, ?)
+		</sql-insert>
+		<sql-update>UPDATE EMPLOYMENT SET ENDDATE=?, VALUE=?, CURRENCY=? WHERE EMPID=?</sql-update> 
+		<sql-delete>DELETE FROM EMPLOYMENT WHERE EMPID=?</sql-delete> 
+	</class>
+
+    <class name="TextHolder">
+        <id name="id" column="id">
+            <generator class="increment"/>
+        </id>
+        <property name="description" type="text" length="15000"/>
+        <loader query-ref="textholder"/>
+        <sql-insert>
+            INSERT INTO TEXTHOLDER
+            (DESCRIPTION, ID)
+            VALUES (?, ?)
+        </sql-insert>
+        <sql-update>UPDATE TEXTHOLDER SET DESCRIPTION=? WHERE ID=?</sql-update>
+        <sql-delete>DELETE FROM TEXTHOLDER WHERE ID=?</sql-delete>
+    </class>
+
+    <class name="ImageHolder">
+        <id name="id" column="id">
+            <generator class="increment"/>
+        </id>
+        <property name="photo" type="image" length="15000"/>
+        <loader query-ref="imageholder"/>
+        <sql-insert>
+            INSERT INTO IMAGEHOLDER
+            (PHOTO, ID)
+            VALUES (?, ?)
+        </sql-insert>
+        <sql-update>UPDATE IMAGEHOLDER SET PHOTO=? WHERE ID=?</sql-update>
+        <sql-delete>DELETE FROM IMAGEHOLDER WHERE ID=?</sql-delete>
+    </class>
+
+    <resultset name="org-emp-regionCode">
+        <return-scalar column="regionCode" type="string"/>
+        <return alias="org" class="Organization"/>
+        <return-join alias="emp" property="org.employments"/>
+    </resultset>
+
+    <resultset name="org-emp-person">
+        <return alias="org" class="Organization"/>
+        <return-join alias="emp" property="org.employments"/>
+        <return-join alias="pers" property="emp.employee"/>
+    </resultset>
+	
+	<sql-query name="person">
+		<return alias="p" class="Person" lock-mode="upgrade"/>
+		SELECT NAME AS {p.name}, PERID AS {p.id} FROM PERSON WHERE PERID=? /*FOR UPDATE*/
+	</sql-query>
+
+	<sql-query name="organization">
+		<return alias="org" class="Organization"/>
+		<return-join alias="emp" property="org.employments"/>
+		SELECT {org.*}, {emp.*}
+		FROM ORGANIZATION org
+			LEFT OUTER JOIN EMPLOYMENT emp ON org.ORGID = emp.EMPLOYER
+		WHERE org.ORGID=?
+	</sql-query>
+
+
+	<!--sql-query name="organization">
+		<return alias="org" class="Organization"/>
+		SELECT NAME AS {org.name}, ORGID AS {org.id} FROM ORGANIZATION
+		WHERE ORGID=?
+	</sql-query-->
+	
+	<sql-query name="allOrganizationsWithEmployees" flush-mode="never">
+		<return alias="org" class="Organization"/>
+		SELECT DISTINCT org.NAME AS {org.name}, org.ORGID AS {org.id} 
+		FROM ORGANIZATION org
+		INNER JOIN EMPLOYMENT e ON e.EMPLOYER = org.ORGID
+	</sql-query>
+	
+	
+	
+
+	
+	<sql-query name="employment">
+		<return alias="emp" class="Employment"/>
+		SELECT EMPLOYEE AS {emp.employee}, EMPLOYER AS {emp.employer}, 
+			STARTDATE AS {emp.startDate}, ENDDATE AS {emp.endDate},
+			REGIONCODE as {emp.regionCode}, EMPID AS {emp.id}
+		FROM EMPLOYMENT
+		WHERE EMPID = ?
+	</sql-query>
+
+	<sql-query name="organizationEmployments">
+		<load-collection alias="empcol" role="Organization.employments"/>
+		SELECT {empcol.*}
+		FROM EMPLOYMENT empcol
+		WHERE EMPLOYER = :id
+		ORDER BY STARTDATE ASC, EMPLOYEE ASC
+	</sql-query>
+
+
+	<sql-query name="organizationCurrentEmployments">
+		<return alias="emp" class="Employment">		    
+			<return-property name="salary"> 
+		      <!-- as multi column properties are not supported via the
+		      {}-syntax, we need to provide an explicit column list for salary via <return-property> -->
+  			  <return-column name="VALUE"/>
+			  <return-column name="CURRENCY"/>			
+			</return-property>
+			<!-- Here we are remapping endDate. Notice that we can still use {emp.endDate} in the SQL. -->
+			<return-property name="endDate" column="myEndDate"/>
+		</return>
+		<synchronize table="EMPLOYMENT"/>
+		SELECT EMPLOYEE AS {emp.employee}, EMPLOYER AS {emp.employer}, 
+			STARTDATE AS {emp.startDate}, ENDDATE AS {emp.endDate},
+			REGIONCODE as {emp.regionCode}, EMPID AS {emp.id}, VALUE, CURRENCY
+		FROM EMPLOYMENT
+		WHERE EMPLOYER = :id AND ENDDATE IS NULL
+		ORDER BY STARTDATE ASC
+	</sql-query>
+
+	<sql-query name="simpleScalar" callable="true">
+		<return-scalar column="name" type="string"/>
+		<return-scalar column="value" type="long"/>
+		{ call simpleScalar(:number) }
+	</sql-query>
+
+	<sql-query name="paramhandling" callable="true">
+		<return-scalar column="value" type="long"/>
+		<return-scalar column="value2" type="long"/>
+		{ call paramHandling(?,?) }
+	</sql-query>
+
+	<sql-query name="paramhandling_mixed" callable="true">
+		<return-scalar column="value" type="long" />
+		<return-scalar column="value2" type="long" />
+		{ call paramHandling(?,:second) }
+	</sql-query>
+	
+	<sql-query name="selectAllEmployments" callable="true">
+		<return alias="" class="Employment">
+			<return-property name="employee" column="EMPLOYEE"/>
+			<return-property name="employer" column="EMPLOYER"/>			
+			<return-property name="startDate" column="STARTDATE"/>
+			<return-property name="endDate" column="ENDDATE"/>			
+			<return-property name="regionCode" column="REGIONCODE"/>			
+			<return-property name="id" column="EMPID"/>						
+			<return-property name="salary"> 
+				<!-- as multi column properties are not supported via the
+				{}-syntax, we need to provide an explicit column list for salary via <return-property> -->
+				<return-column name="VALUE"/>
+				<return-column name="CURRENCY"/>			
+			</return-property>
+		</return>
+		{ call selectAllEmployments() }
+	</sql-query>
+
+    <sql-query name="textholder">
+        <return alias="h" class="TextHolder" lock-mode="upgrade"/>
+        SELECT ID AS {h.id}, DESCRIPTION AS {h.description} FROM TEXTHOLDER WHERE ID=? /*FOR UPDATE*/
+    </sql-query>
+
+    <sql-query name="imageholder">
+        <return alias="h" class="ImageHolder" lock-mode="upgrade"/>
+        SELECT ID AS {h.id}, PHOTO AS {h.photo} FROM IMAGEHOLDER WHERE ID=? /*FOR UPDATE*/
+    </sql-query>
+    
+	<database-object>
+		<create>
+		CREATE PROCEDURE selectAllEmployments AS
+			SELECT EMPLOYEE, EMPLOYER, STARTDATE, ENDDATE, 
+			REGIONCODE, EMPID, VALUE, CURRENCY
+			FROM EMPLOYMENT
+		</create>
+		<drop>
+		DROP PROCEDURE selectAllEmployments
+		</drop>
+	</database-object>
+
+	<!-- The following is a workaround for HHH-3685 so that SchemaExport --> 
+	<!-- changes the transaction mode of selectAllEmployments to "chained" -->
+	<database-object>
+		<create>
+		sp_procxmode selectAllEmployments, 'chained'
+		</create>
+		<!-- no drop command corresponding to "sp_procxmode ..." -->
+		<drop/>
+	</database-object>
+
+	<database-object>
+		<create>
+		CREATE PROCEDURE paramHandling @j int, @i int AS
+			SELECT @j as value, @i as value2
+		</create>
+		<drop>
+		DROP PROCEDURE paramHandling
+		</drop>
+	</database-object>
+	
+	<!-- The following is a workaround for HHH-3685 so that SchemaExport --> 
+	<!-- changes the transaction mode of paramHandling to "chained" -->
+	<database-object>
+		<create>
+		sp_procxmode paramHandling, 'chained'
+		</create>
+		<!-- no drop command corresponding to "sp_procxmode ..." -->
+	<drop/>
+	</database-object>
+
+	<database-object>
+		<create>
+		CREATE PROCEDURE simpleScalar @number int AS
+			SELECT @number as value, 'getAll' as name
+		</create>
+		<drop>
+		DROP PROCEDURE simpleScalar
+		</drop>
+	</database-object>
+	
+	<!-- The following is a workaround for HHH-3685 so that SchemaExport --> 
+	<!-- changes the transaction mode of simpleScalar to "chained" -->
+	<database-object>
+		<create>
+		sp_procxmode simpleScalar, 'chained'
+		</create>
+		<!-- no drop command corresponding to "sp_procxmode ..." -->
+		<drop/>
+	</database-object>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/sqlserver/Mappings.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/sqlserver/SQLServerCustomSQLTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/sqlserver/SQLServerCustomSQLTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/sqlserver/SQLServerCustomSQLTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.sql.hand.custom.sqlserver;
+
+import junit.framework.Test;
+
+import org.hibernate.dialect.Dialect;
+import org.hibernate.dialect.SQLServerDialect;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.sql.hand.custom.CustomStoredProcTestSupport;
+
+/**
+ * Custom SQL tests for SQLServer
+ *
+ * @author Gail Badner
+ */
+public class SQLServerCustomSQLTest extends CustomStoredProcTestSupport {
+
+	public SQLServerCustomSQLTest(String str) {
+		super( str );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "sql/hand/custom/sqlserver/Mappings.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( SQLServerCustomSQLTest.class );
+	}
+
+	public boolean appliesTo(Dialect dialect) {
+		return ( dialect instanceof SQLServerDialect );
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/sqlserver/SQLServerCustomSQLTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/sybase/Mappings.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/sybase/Mappings.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/sybase/Mappings.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,287 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+    This mapping demonstrates the use of Hibernate with all-handwritten SQL!
+     
+    NOTE: this version is for Sybase
+-->
+<hibernate-mapping package="org.hibernate.test.sql.hand" default-access="field">
+
+	<class name="Organization" table="ORGANIZATION">
+		<id name="id" unsaved-value="0" column="ORGID">
+			<generator class="increment"/>
+		</id>
+		<property name="name" not-null="true" column="NAME"/>
+		<set name="employments" 
+			inverse="true"
+			order-by="DUMMY">
+			<key column="EMPLOYER"/> <!-- only needed for DDL generation -->
+			<one-to-many class="Employment"/>
+			<loader query-ref="organizationEmployments"/>
+		</set>
+		<!-- query-list name="currentEmployments" 
+			query-ref="organizationCurrentEmployments"-->
+		<loader query-ref="organization"/>
+		<sql-insert>INSERT INTO ORGANIZATION (NAME, ORGID) VALUES ( UPPER(?), ? )</sql-insert>
+		<sql-update>UPDATE ORGANIZATION SET NAME=UPPER(?) WHERE ORGID=?</sql-update>
+		<sql-delete>DELETE FROM ORGANIZATION WHERE ORGID=?</sql-delete>
+	</class>
+	
+	<class name="Person" table="PERSON">
+		<id name="id" unsaved-value="0" column="PERID">
+			<generator class="increment"/>
+		</id>
+		<property name="name" not-null="true" column="NAME"/>
+		<loader query-ref="person"/>
+		<sql-insert>INSERT INTO PERSON (NAME, PERID) VALUES ( UPPER(?), ? )</sql-insert>
+		<sql-update>UPDATE PERSON SET NAME=UPPER(?) WHERE PERID=?</sql-update>
+		<sql-delete>DELETE FROM PERSON WHERE PERID=?</sql-delete>
+	</class>
+	
+	<class name="Employment" table="EMPLOYMENT">
+		<id name="employmentId" unsaved-value="0" column="EMPID">
+			<generator class="increment"/>
+		</id>
+		<many-to-one name="employee" column="EMPLOYEE" not-null="true" update="false"/>
+		<many-to-one name="employer" column="EMPLOYER" not-null="true" update="false"/>
+		<property name="startDate" column="STARTDATE" not-null="true" update="false" insert="false"/>
+		<property name="endDate" column="ENDDATE" insert="false"/>
+		<property name="regionCode" column="REGIONCODE" update="false"/>
+        <property name="salary" type="org.hibernate.test.sql.hand.MonetaryAmountUserType">
+			<column name="VALUE" sql-type="float"/>
+			<column name="CURRENCY"/>			
+		</property>
+		<loader query-ref="employment"/>
+   		<sql-insert>
+			INSERT INTO EMPLOYMENT 
+				(EMPLOYEE, EMPLOYER, STARTDATE, REGIONCODE, VALUE, CURRENCY, EMPID) 
+				VALUES (?, ?, getdate(), UPPER(?), ?, ?, ?)
+		</sql-insert>
+		<sql-update>UPDATE EMPLOYMENT SET ENDDATE=?, VALUE=?, CURRENCY=? WHERE EMPID=?</sql-update> 
+		<sql-delete>DELETE FROM EMPLOYMENT WHERE EMPID=?</sql-delete> 
+	</class>
+
+    <class name="TextHolder">
+        <id name="id" column="id">
+            <generator class="increment"/>
+        </id>
+        <property name="description" type="text" length="15000"/>
+        <loader query-ref="textholder"/>
+        <sql-insert>
+            INSERT INTO TEXTHOLDER
+            (DESCRIPTION, ID)
+            VALUES (?, ?)
+        </sql-insert>
+        <sql-update>UPDATE TEXTHOLDER SET DESCRIPTION=? WHERE ID=?</sql-update>
+        <sql-delete>DELETE FROM TEXTHOLDER WHERE ID=?</sql-delete>
+    </class>
+
+    <class name="ImageHolder">
+        <id name="id" column="id">
+            <generator class="increment"/>
+        </id>
+        <property name="photo" type="image" length="15000"/>
+        <loader query-ref="imageholder"/>
+        <sql-insert>
+            INSERT INTO IMAGEHOLDER
+            (PHOTO, ID)
+            VALUES (?, ?)
+        </sql-insert>
+        <sql-update>UPDATE IMAGEHOLDER SET PHOTO=? WHERE ID=?</sql-update>
+        <sql-delete>DELETE FROM IMAGEHOLDER WHERE ID=?</sql-delete>
+    </class>
+
+    <resultset name="org-emp-regionCode">
+        <return-scalar column="regionCode" type="string"/>
+        <return alias="org" class="Organization"/>
+        <return-join alias="emp" property="org.employments"/>
+    </resultset>
+
+    <resultset name="org-emp-person">
+        <return alias="org" class="Organization"/>
+        <return-join alias="emp" property="org.employments"/>
+        <return-join alias="pers" property="emp.employee"/>
+    </resultset>
+	
+	<sql-query name="person">
+		<return alias="p" class="Person" lock-mode="upgrade"/>
+		SELECT NAME AS {p.name}, PERID AS {p.id} FROM PERSON WHERE PERID=? /*FOR UPDATE*/
+	</sql-query>
+
+	<sql-query name="organization">
+		<return alias="org" class="Organization"/>
+		<return-join alias="emp" property="org.employments"/>
+		SELECT {org.*}, {emp.*}
+		FROM ORGANIZATION org
+			LEFT OUTER JOIN EMPLOYMENT emp ON org.ORGID = emp.EMPLOYER
+		WHERE org.ORGID=?
+	</sql-query>
+
+
+	<!--sql-query name="organization">
+		<return alias="org" class="Organization"/>
+		SELECT NAME AS {org.name}, ORGID AS {org.id} FROM ORGANIZATION
+		WHERE ORGID=?
+	</sql-query-->
+	
+	<sql-query name="allOrganizationsWithEmployees" flush-mode="never">
+		<return alias="org" class="Organization"/>
+		SELECT DISTINCT org.NAME AS {org.name}, org.ORGID AS {org.id} 
+		FROM ORGANIZATION org
+		INNER JOIN EMPLOYMENT e ON e.EMPLOYER = org.ORGID
+	</sql-query>
+	
+	
+	
+
+	
+	<sql-query name="employment">
+		<return alias="emp" class="Employment"/>
+		SELECT EMPLOYEE AS {emp.employee}, EMPLOYER AS {emp.employer}, 
+			STARTDATE AS {emp.startDate}, ENDDATE AS {emp.endDate},
+			REGIONCODE as {emp.regionCode}, EMPID AS {emp.id}
+		FROM EMPLOYMENT
+		WHERE EMPID = ?
+	</sql-query>
+
+	<sql-query name="organizationEmployments">
+		<load-collection alias="empcol" role="Organization.employments"/>
+		SELECT {empcol.*}
+		FROM EMPLOYMENT empcol
+		WHERE EMPLOYER = :id
+		ORDER BY STARTDATE ASC, EMPLOYEE ASC
+	</sql-query>
+
+
+	<sql-query name="organizationCurrentEmployments">
+		<return alias="emp" class="Employment">		    
+			<return-property name="salary"> 
+		      <!-- as multi column properties are not supported via the
+		      {}-syntax, we need to provide an explicit column list for salary via <return-property> -->
+  			  <return-column name="VALUE"/>
+			  <return-column name="CURRENCY"/>			
+			</return-property>
+			<!-- Here we are remapping endDate. Notice that we can still use {emp.endDate} in the SQL. -->
+			<return-property name="endDate" column="myEndDate"/>
+		</return>
+		<synchronize table="EMPLOYMENT"/>
+		SELECT EMPLOYEE AS {emp.employee}, EMPLOYER AS {emp.employer}, 
+			STARTDATE AS {emp.startDate}, ENDDATE AS {emp.endDate},
+			REGIONCODE as {emp.regionCode}, EMPID AS {emp.id}, VALUE, CURRENCY
+		FROM EMPLOYMENT
+		WHERE EMPLOYER = :id AND ENDDATE IS NULL
+		ORDER BY STARTDATE ASC
+	</sql-query>
+
+	<sql-query name="simpleScalar" callable="true">
+		<return-scalar column="name" type="string"/>
+		<return-scalar column="value" type="long"/>
+		{ call simpleScalar(:number) }
+	</sql-query>
+
+	<sql-query name="paramhandling" callable="true">
+		<return-scalar column="value" type="long"/>
+		<return-scalar column="value2" type="long"/>
+		{ call paramHandling(?,?) }
+	</sql-query>
+
+	<sql-query name="paramhandling_mixed" callable="true">
+		<return-scalar column="value" type="long" />
+		<return-scalar column="value2" type="long" />
+		{ call paramHandling(?,:second) }
+	</sql-query>
+	
+	<sql-query name="selectAllEmployments" callable="true">
+		<return alias="" class="Employment">
+			<return-property name="employee" column="EMPLOYEE"/>
+			<return-property name="employer" column="EMPLOYER"/>			
+			<return-property name="startDate" column="STARTDATE"/>
+			<return-property name="endDate" column="ENDDATE"/>			
+			<return-property name="regionCode" column="REGIONCODE"/>			
+			<return-property name="id" column="EMPID"/>						
+			<return-property name="salary"> 
+				<!-- as multi column properties are not supported via the
+				{}-syntax, we need to provide an explicit column list for salary via <return-property> -->
+				<return-column name="VALUE"/>
+				<return-column name="CURRENCY"/>			
+			</return-property>
+		</return>
+		{ call selectAllEmployments() }
+	</sql-query>
+
+    <sql-query name="textholder">
+        <return alias="h" class="TextHolder" lock-mode="upgrade"/>
+        SELECT ID AS {h.id}, DESCRIPTION AS {h.description} FROM TEXTHOLDER WHERE ID=? /*FOR UPDATE*/
+    </sql-query>
+
+    <sql-query name="imageholder">
+        <return alias="h" class="ImageHolder" lock-mode="upgrade"/>
+        SELECT ID AS {h.id}, PHOTO AS {h.photo} FROM IMAGEHOLDER WHERE ID=? /*FOR UPDATE*/
+    </sql-query>    
+
+	<database-object>
+		<create>
+		CREATE PROCEDURE selectAllEmployments AS
+			SELECT EMPLOYEE, EMPLOYER, STARTDATE, ENDDATE, 
+			REGIONCODE, EMPID, VALUE, CURRENCY
+			FROM EMPLOYMENT
+		</create>
+		<drop>
+		DROP PROCEDURE selectAllEmployments
+		</drop>
+	</database-object>
+
+	<!-- The following is a workaround for HHH-3685 so that SchemaExport --> 
+	<!-- changes the transaction mode of selectAllEmployments to "chained" -->
+	<database-object>
+		<create>
+		sp_procxmode selectAllEmployments, 'chained'
+		</create>
+		<!-- no drop command corresponding to "sp_procxmode ..." -->
+		<drop/>
+	</database-object>
+
+	<database-object>
+		<create>
+		CREATE PROCEDURE paramHandling @j int, @i int AS
+			SELECT @j as value, @i as value2
+		</create>
+		<drop>
+		DROP PROCEDURE paramHandling
+		</drop>
+	</database-object>
+	
+	<!-- The following is a workaround for HHH-3685 so that SchemaExport --> 
+	<!-- changes the transaction mode of paramHandling to "chained" -->
+	<database-object>
+		<create>
+		sp_procxmode paramHandling, 'chained'
+		</create>
+		<!-- no drop command corresponding to "sp_procxmode ..." -->
+	<drop/>
+	</database-object>
+
+	<database-object>
+		<create>
+		CREATE PROCEDURE simpleScalar @number int AS
+			SELECT @number as value, 'getAll' as name
+		</create>
+		<drop>
+		DROP PROCEDURE simpleScalar
+		</drop>
+	</database-object>
+	
+	<!-- The following is a workaround for HHH-3685 so that SchemaExport --> 
+	<!-- changes the transaction mode of simpleScalar to "chained" -->
+	<database-object>
+		<create>
+		sp_procxmode simpleScalar, 'chained'
+		</create>
+		<!-- no drop command corresponding to "sp_procxmode ..." -->
+		<drop/>
+	</database-object>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/sybase/Mappings.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/sybase/SybaseCustomSQLTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/sybase/SybaseCustomSQLTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/sybase/SybaseCustomSQLTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,40 @@
+//$Id$
+package org.hibernate.test.sql.hand.custom.sybase;
+
+import junit.framework.Test;
+
+import org.hibernate.dialect.Dialect;
+import org.hibernate.dialect.SybaseDialect;
+import org.hibernate.dialect.SybaseASE15Dialect;
+import org.hibernate.dialect.Sybase11Dialect;
+import org.hibernate.dialect.SybaseAnywhereDialect;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.test.sql.hand.custom.CustomStoredProcTestSupport;
+
+/**
+ * Custom SQL tests for Sybase dialects
+ * 
+ * @author Gavin King
+ */
+public class SybaseCustomSQLTest extends CustomStoredProcTestSupport {
+
+	public SybaseCustomSQLTest(String str) {
+		super( str );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "sql/hand/custom/sybase/Mappings.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( SybaseCustomSQLTest.class );
+	}
+
+	public boolean appliesTo(Dialect dialect) {
+		return ( dialect instanceof SybaseDialect ||
+				dialect instanceof SybaseASE15Dialect ||
+				dialect instanceof Sybase11Dialect ||
+				dialect instanceof SybaseAnywhereDialect );
+	}
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/custom/sybase/SybaseCustomSQLTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/identity/CustomInsertSQLWithIdentityColumnTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/identity/CustomInsertSQLWithIdentityColumnTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/identity/CustomInsertSQLWithIdentityColumnTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,50 @@
+package org.hibernate.test.sql.hand.identity;
+
+import junit.framework.Test;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.testing.junit.functional.DatabaseSpecificFunctionalTestCase;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.Session;
+import org.hibernate.JDBCException;
+import org.hibernate.test.sql.hand.Organization;
+
+/**
+ * Custom SQL tests for combined usage of custom insert SQL and identity columns
+ *
+ * @author Gail Badner
+ */
+public class CustomInsertSQLWithIdentityColumnTest extends DatabaseSpecificFunctionalTestCase {
+
+	public CustomInsertSQLWithIdentityColumnTest(String str) {
+		super( str );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( CustomInsertSQLWithIdentityColumnTest.class );
+	}
+
+	public String[] getMappings() {
+		return new String[] {"sql/hand/identity/Mappings.hbm.xml"};
+	}
+
+	public boolean appliesTo(Dialect dialect) {
+		return dialect.supportsIdentityColumns();
+	}
+
+	public void testBadInsertionFails() {
+		Session session = openSession();
+		session.beginTransaction();
+		Organization org = new Organization( "hola!" );
+		try {
+			session.save( org );
+			session.delete( org );
+			fail( "expecting bad custom insert statement to fail" );
+		}
+		catch( JDBCException e ) {
+			// expected failure
+		}
+
+		session.getTransaction().rollback();
+		session.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/identity/CustomInsertSQLWithIdentityColumnTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/identity/Mappings.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/identity/Mappings.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/identity/Mappings.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+    This mapping demonstrates the combined use of IDENTITY PK columns and
+    custom supplied SQL statements.
+
+    @author : Gail Badner
+-->
+
+<hibernate-mapping package="org.hibernate.test.sql.hand" default-access="field">
+
+	<class name="Organization" table="ORGANIZATION">
+		<id name="id" column="ORG_ID">
+			<generator class="identity"/>
+		</id>
+		<property name="name" not-null="true"/>
+        <!-- Intentionally bad SQL statement!!! -->
+        <sql-insert>INSERT INTO PERSON WHERE x=y</sql-insert>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/identity/Mappings.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/query/NativeSQLQueries.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/query/NativeSQLQueries.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/query/NativeSQLQueries.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,316 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+  This mapping demonstrates the use of Hibernate with
+  all-handwritten SQL!
+-->
+
+<hibernate-mapping package="org.hibernate.test.sql.hand" default-access="field">
+	   
+	<class name="Organization" table="ORGANIZATION">
+		<id name="id" unsaved-value="0" column="ORGID">
+			<generator class="increment"/>
+		</id>
+		<property name="name" column="NAME" not-null="true"/>
+		<set lazy="true" name="employments" 
+			inverse="true">
+			<key column="EMPLOYER"/> <!-- only needed for DDL generation -->
+			<one-to-many class="Employment"/>
+		</set>
+	</class>
+	
+	<class name="Person" table="PERSON">
+		<id name="id" unsaved-value="0" column="PERID">
+			<generator class="increment"/>
+		</id>
+		<property name="name" column="NAME" not-null="true"/>
+	</class>
+
+	<class name="Group" table="GROUPP">
+		<id name="id" unsaved-value="0" column="ID">
+			<generator class="increment"/>
+		</id>
+		<property name="name" column="NAME" not-null="true"/>
+		<list name="persons" table="GROUP_PERSON"
+			cascade="none" inverse="false" lazy="true">
+			<key column="GROUP_ID"	/>
+			<list-index column="POS" />
+			<many-to-many class="Person" column="PERSON_ID" />
+		</list>
+	</class>
+	
+	<class name="Employment" table="EMPLOYMENT">
+		<id name="employmentId" unsaved-value="0" column="EMPID">
+			<generator class="increment"/>
+		</id>
+		<many-to-one name="employee" column="EMPLOYEE" not-null="true" update="false"/>
+		<many-to-one name="employer" column="EMPLOYER" not-null="true" update="false"/>
+		<property name="startDate" column="STARTDATE" not-null="false"/>
+		<property name="endDate" column="ENDDATE" insert="false"/>
+		<property name="regionCode" column="REGIONCODE" update="false"/>
+	    <property name="salary" type="org.hibernate.test.sql.hand.MonetaryAmountUserType">
+			<column name="VALUE" sql-type="float"/>
+			<column name="CURRENCY"/>			
+		</property>
+	</class>
+	
+	<class name="Order" table="TBL_ORDER">
+	  <composite-id name="orderId" class="Order$OrderId">
+	  	<key-property name="orgid"/>
+		<key-property name="ordernumber"/>
+	  </composite-id>
+	  
+	  <many-to-one name="product">
+	    <column name="PROD_ORGID"/>
+	    <column name="PROD_NO"/>
+	  </many-to-one>
+	  <many-to-one name="person"/>
+	</class>
+	
+	<class name="Product">
+	  <composite-id name="productId" class="Product$ProductId">
+	  	<key-property name="orgid"/>
+		<key-property name="productnumber"/>
+	  </composite-id>
+	  
+	  <property name="name"/>
+	  
+	  <set name="orders" inverse="true">
+	  	<key>
+	  		<column name="PROD_ORGID"/>
+	  		<column name="PROD_NO"/>	  		
+	  	</key>
+	  	<one-to-many class="Order"/>
+	  </set>
+	</class>
+
+    <class name="Dimension">
+        <id name="id" type="long">
+            <generator class="increment"/>
+        </id>
+        <property name="length" column="d_len"/>
+        <property name="width" column="d_width"/>
+    </class>
+
+    <class name="SpaceShip">
+        <id name="id" type="integer">
+            <generator class="increment"/>
+        </id>
+        <property name="name" column="fld_name"/>
+        <property name="model" column="fld_model"/>
+        <property name="speed" column="fld_speed"/>
+        <component name="dimensions">
+            <property name="length" column="fld_length"/>
+            <property name="width" column="fld_width"/>
+        </component>
+    </class>
+
+    <class name="Speech">
+        <id name="id" type="integer">
+            <generator class="increment"/>
+        </id>
+        <property name="name" column="name"/>
+        <property name="length" column="flength"/>
+    </class>
+
+    <class name="TextHolder">
+        <id name="id" column="id">
+            <generator class="increment"/>
+        </id>
+        <property name="description" type="text" length="15000"/>
+    </class>
+
+    <class name="ImageHolder">
+        <id name="id" column="id">
+            <generator class="increment"/>
+        </id>
+        <property name="photo" type="image" length="15000"/>
+    </class>    
+
+    <resultset name="org-emp-regionCode">
+        <return-scalar column="regionCode" type="string"/>
+        <return alias="org" class="Organization"/>
+        <return-join alias="emp" property="org.employments"/>
+    </resultset>
+
+    <resultset name="org-emp-person">
+        <return alias="org" class="Organization"/>
+        <return-join alias="emp" property="org.employments"/>
+        <return-join alias="pers" property="emp.employee"/>
+    </resultset>
+
+
+    <resultset name="org-description">
+        <return alias="org" class="Organization"/>
+        <return-join alias="emp" property="org.employments"/>
+    </resultset>
+
+    <resultset name="spaceship-vol">
+        <return alias="sps" class="SpaceShip">
+            <return-property name="id" column="id"/>
+            <return-property name="name" column="name"/>
+            <return-property name="model" column="model"/>
+            <return-property name="speed" column="speed"/>
+            <return-property name="dimensions.length" column="length"/>
+            <return-property name="dimensions.width" column="width"/>
+        </return>
+        <return-scalar column="surface"/>
+        <return-scalar column="volume"/>
+    </resultset>
+
+    <resultset name="speech">
+        <return alias="sp" class="Speech">
+            <return-property name="id" column="id"/>
+            <return-property name="name" column="name"/>
+            <return-property name="length" column="flength"/>
+        </return>
+        <return-scalar column="scalarName"/>
+    </resultset>
+
+    <sql-query name="spaceship" resultset-ref="spaceship-vol">
+		select id as id,
+               fld_name as name,
+               fld_model as model,
+               fld_speed as speed,
+               fld_length as length,
+               fld_width as width,
+               fld_length * fld_width as surface,
+               fld_length * fld_width *10 as volume
+        from SpaceShip
+	</sql-query>
+
+    <sql-query name="orgNamesOnly">
+		<return-scalar column="NAME" type="string"/>
+		SELECT org.NAME FROM ORGANIZATION org
+	</sql-query>
+
+	<sql-query name="orgNamesAndOrgs">
+		<return-scalar column="thename" type="string"/>
+		<return alias="org" class="Organization"/>
+		SELECT org.NAME AS thename, org.NAME AS {org.name}, org.ORGID AS {org.id} 
+		FROM ORGANIZATION org
+		ORDER BY thename
+	</sql-query>
+
+	<sql-query name="orgsAndOrgNames">
+		<return alias="org" class="Organization"/>
+		<return-scalar column="thename" type="string"/>
+		SELECT org.NAME AS thename, org.NAME AS {org.name}, org.ORGID AS {org.id} 
+		FROM ORGANIZATION org
+		ORDER BY thename
+	</sql-query>	
+
+	<sql-query name="orgIdsAndOrgNames">
+		<return-scalar column="orgid" type="long"/>
+		<return-scalar column="thename" type="string"/>
+		SELECT NAME AS thename, ORGID AS orgid
+		FROM ORGANIZATION
+		ORDER BY thename
+	</sql-query>
+
+	<sql-query name="AllEmploymentAsMapped">
+		<return class="Employment"/>
+		SELECT * FROM EMPLOYMENT
+	</sql-query>
+
+	<sql-query name="EmploymentAndPerson">
+		<return class="Employment"/>
+		<return class="Person"/>
+		SELECT * FROM EMPLOYMENT, PERSON
+	</sql-query>
+
+	<sql-query name="organizationEmploymentsExplicitAliases">
+		<load-collection alias="empcol" role="Organization.employments"/>
+		SELECT empcol.EMPLOYER as {empcol.key}, empcol.EMPID as {empcol.element}, {empcol.element.*} 
+		FROM EMPLOYMENT empcol
+		WHERE EMPLOYER = :id
+		ORDER BY STARTDATE ASC, EMPLOYEE ASC
+	</sql-query>	
+
+	<sql-query name="organizationreturnproperty">
+		<return alias="org" class="Organization">
+            <return-property name="id" column="ORGID"/>
+            <return-property name="name" column="NAME"/>
+		</return>
+		<return-join alias="emp" property="org.employments">
+			<return-property name="key" column="EMPLOYER"/>
+			<return-property name="element" column="EMPID"/>			
+			<return-property name="element.employee" column="EMPLOYEE"/>
+			<return-property name="element.employer" column="EMPLOYER"/>			
+			<return-property name="element.startDate" column="XSTARTDATE"/>
+			<return-property name="element.endDate" column="ENDDATE"/>			
+			<return-property name="element.regionCode" column="REGIONCODE"/>			
+			<return-property name="element.employmentId" column="EMPID"/>						
+			<return-property name="element.salary">
+                <return-column name="VALUE"/>
+                <return-column name="CURRENCY"/>
+			</return-property>
+		</return-join>
+		SELECT org.ORGID as orgid,
+            org.NAME as name,
+            emp.EMPLOYER as employer,
+            emp.EMPID as empid,
+            emp.EMPLOYEE as employee,
+            emp.EMPLOYER as employer,
+            emp.STARTDATE as xstartDate,
+            emp.ENDDATE as endDate,
+            emp.REGIONCODE as regionCode,
+            emp.VALUE as VALUE,
+            emp.CURRENCY as CURRENCY
+        FROM ORGANIZATION org
+			LEFT OUTER JOIN EMPLOYMENT emp ON org.ORGID = emp.EMPLOYER
+	</sql-query>
+
+    
+	<sql-query name="organizationautodetect" resultset-ref="org-description">
+	<!--  equal to "organizationpropertyreturn" but since no {} nor return-property are used hibernate will fallback to use the columns directly from the mapping -->
+		<return alias="org" class="Organization"/>
+		<return-join alias="emp" property="org.employments"/>
+        SELECT org.ORGID as orgid,
+            org.NAME as name,
+            emp.EMPLOYER as employer,
+            emp.EMPID as empid,
+            emp.EMPLOYEE as employee,
+            emp.EMPLOYER as employer,
+            emp.STARTDATE as startDate,
+            emp.ENDDATE as endDate,
+            emp.REGIONCODE as regionCode,
+            emp.VALUE as VALUE,
+            emp.CURRENCY as CURRENCY
+		FROM ORGANIZATION org
+			LEFT OUTER JOIN EMPLOYMENT emp ON org.ORGID = emp.EMPLOYER
+	</sql-query>
+
+	<sql-query name="manyToManyFetch">
+        <![CDATA[
+        	SELECT 	groupp.ID as group_id,
+        			groupp.NAME as group_name,
+        			group_person.PERSON_ID as group_person_personId,
+        			group_person.GROUP_ID as group_person_groupId,
+        			group_person.POS as group_person_pos,
+        			person.PERID as person_id,
+        			person.NAME as person_name
+			FROM 	GROUPP groupp,
+					GROUP_PERSON group_person,
+					PERSON person
+			WHERE 	groupp.ID = group_person.GROUP_ID
+					and person.PERID = group_person.PERSON_ID
+       ]]>
+        <return alias="groupp" class="Group">
+            <return-property name="id" column="group_id" />
+            <return-property name="name" column="group_name" />
+        </return>
+        <return-join alias="group_person" property="groupp.persons">
+            <return-property name="key" column="group_person_groupId" />
+            <return-property name="index" column="group_person_pos" />
+            <return-property name="element" column="person_id" />
+            <return-property name="element.id" column="person_id" />
+            <return-property name="element.name" column="person_name" />
+        </return-join>
+    </sql-query>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/query/NativeSQLQueries.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/query/NativeSQLQueriesTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/query/NativeSQLQueriesTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/query/NativeSQLQueriesTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,769 @@
+package org.hibernate.test.sql.hand.query;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.HashMap;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.HibernateException;
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.dialect.H2Dialect;
+import org.hibernate.util.ArrayHelper;
+import org.hibernate.test.sql.hand.Organization;
+import org.hibernate.test.sql.hand.Person;
+import org.hibernate.test.sql.hand.Employment;
+import org.hibernate.test.sql.hand.Product;
+import org.hibernate.test.sql.hand.Order;
+import org.hibernate.test.sql.hand.Dimension;
+import org.hibernate.test.sql.hand.SpaceShip;
+import org.hibernate.test.sql.hand.Speech;
+import org.hibernate.test.sql.hand.Group;
+import org.hibernate.test.sql.hand.TextHolder;
+import org.hibernate.test.sql.hand.ImageHolder;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.transform.DistinctRootEntityResultTransformer;
+import org.hibernate.transform.Transformers;
+import org.hibernate.transform.BasicTransformerAdapter;
+
+/**
+ * Tests of various features of native SQL queries.
+ *
+ * @author Steve Ebersole
+ */
+public class NativeSQLQueriesTest extends FunctionalTestCase {
+
+	public NativeSQLQueriesTest(String x) {
+		super( x );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "sql/hand/query/NativeSQLQueries.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		super.configure( cfg );
+		cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( NativeSQLQueriesTest.class );
+	}
+
+	protected String getOrganizationFetchJoinEmploymentSQL() {
+		return "SELECT org.ORGID as {org.id}, " +
+		       "        org.NAME as {org.name}, " +
+		       "        emp.EMPLOYER as {emp.key}, " +
+		       "        emp.EMPID as {emp.element}, " +
+		       "        {emp.element.*}  " +
+		       "FROM ORGANIZATION org " +
+		       "    LEFT OUTER JOIN EMPLOYMENT emp ON org.ORGID = emp.EMPLOYER";
+	}
+
+	protected String getOrganizationJoinEmploymentSQL() {
+		return "SELECT org.ORGID as {org.id}, " +
+		       "        org.NAME as {org.name}, " +
+		       "        {emp.*}  " +
+		       "FROM ORGANIZATION org " +
+		       "    LEFT OUTER JOIN EMPLOYMENT emp ON org.ORGID = emp.EMPLOYER";
+	}
+
+	protected String getEmploymentSQL() {
+		return "SELECT * FROM EMPLOYMENT";
+	}
+
+	protected String getEmploymentSQLMixedScalarEntity() {
+		return "SELECT e.*, e.employer as employerid  FROM EMPLOYMENT e" ;
+	}
+
+	protected String getOrgEmpRegionSQL() {
+		return "select {org.*}, {emp.*}, emp.REGIONCODE " +
+		       "from ORGANIZATION org " +
+		       "     left outer join EMPLOYMENT emp on org.ORGID = emp.EMPLOYER";
+	}
+
+	protected String getOrgEmpPersonSQL() {
+		return "select {org.*}, {emp.*}, {pers.*} " +
+		       "from ORGANIZATION org " +
+		       "    join EMPLOYMENT emp on org.ORGID = emp.EMPLOYER " +
+		       "    join PERSON pers on pers.PERID = emp.EMPLOYEE ";
+	}
+
+	protected String getDescriptionsSQL() {
+		return "select DESCRIPTION from TEXTHOLDER";
+	}
+
+	protected String getPhotosSQL() {
+		return "select PHOTO from IMAGEHOLDER";
+	}
+
+	public void testFailOnNoAddEntityOrScalar() {
+		// Note: this passes, but for the wrong reason.
+		//      there is actually an exception thrown, but it is the database
+		//      throwing a sql exception because the SQL gets passed
+		//      "un-processed"...
+		//
+		// Oddly, H2 accepts this query.
+		if ( H2Dialect.class.isInstance( getDialect() ) ) {
+			return;
+		}
+		Session s = openSession();
+		s.beginTransaction();
+		try {
+			String sql = "select {org.*} " +
+			             "from organization org";
+			s.createSQLQuery( sql ).list();
+			fail( "Should throw an exception since no addEntity nor addScalar has been performed." );
+		}
+		catch( HibernateException he) {
+			// expected behavior
+		}
+		finally {
+			s.getTransaction().rollback();
+			s.close();
+		}
+	}
+
+	public void testManualSynchronization() {
+		Session s = openSession();
+		s.beginTransaction();
+
+		sfi().getStatistics().clear();
+
+		// create an Organization...
+		Organization jboss = new Organization( "JBoss" );
+		s.persist( jboss );
+
+		// now query on Employment, this should not cause an auto-flush
+		s.createSQLQuery( getEmploymentSQL() ).list();
+		assertEquals( 0, sfi().getStatistics().getEntityInsertCount() );
+
+		// now try to query on Employment but this time add Organization as a synchronized query space...
+		s.createSQLQuery( getEmploymentSQL() ).addSynchronizedEntityClass( Organization.class ).list();
+		assertEquals( 1, sfi().getStatistics().getEntityInsertCount() );
+
+		// clean up
+		s.delete( jboss );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testSQLQueryInterface() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Organization ifa = new Organization("IFA");
+		Organization jboss = new Organization("JBoss");
+		Person gavin = new Person("Gavin");
+		Employment emp = new Employment(gavin, jboss, "AU");
+
+		s.persist(ifa);
+		s.persist(jboss);
+		s.persist(gavin);
+		s.persist(emp);
+
+		List l = s.createSQLQuery( getOrgEmpRegionSQL() )
+				.addEntity("org", Organization.class)
+				.addJoin("emp", "org.employments")
+				.addScalar("regionCode", Hibernate.STRING)
+				.list();
+		assertEquals( 2, l.size() );
+
+		l = s.createSQLQuery( getOrgEmpPersonSQL() )
+				.addEntity("org", Organization.class)
+				.addJoin("emp", "org.employments")
+				.addJoin("pers", "emp.employee")
+				.list();
+		assertEquals( l.size(), 1 );
+
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+
+		l = s.createSQLQuery( "select {org.*}, {emp.*} " +
+			       "from ORGANIZATION org " +
+			       "     left outer join EMPLOYMENT emp on org.ORGID = emp.EMPLOYER, ORGANIZATION org2" )
+		.addEntity("org", Organization.class)
+		.addJoin("emp", "org.employments")
+		.setResultTransformer( DistinctRootEntityResultTransformer.INSTANCE )
+		.list();
+		assertEquals( l.size(), 2 );
+
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+
+		s.delete(emp);
+		s.delete(gavin);
+		s.delete(ifa);
+		s.delete(jboss);
+
+		t.commit();
+		s.close();
+	}
+
+	public void testResultSetMappingDefinition() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Organization ifa = new Organization("IFA");
+		Organization jboss = new Organization("JBoss");
+		Person gavin = new Person("Gavin");
+		Employment emp = new Employment(gavin, jboss, "AU");
+
+		s.persist(ifa);
+		s.persist(jboss);
+		s.persist(gavin);
+		s.persist(emp);
+
+		List l = s.createSQLQuery( getOrgEmpRegionSQL() )
+				.setResultSetMapping( "org-emp-regionCode" )
+				.list();
+		assertEquals( l.size(), 2 );
+
+		l = s.createSQLQuery( getOrgEmpPersonSQL() )
+				.setResultSetMapping( "org-emp-person" )
+				.list();
+		assertEquals( l.size(), 1 );
+
+		s.delete(emp);
+		s.delete(gavin);
+		s.delete(ifa);
+		s.delete(jboss);
+
+		t.commit();
+		s.close();
+	}
+
+	public void testScalarValues() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Organization ifa = new Organization( "IFA" );
+		Organization jboss = new Organization( "JBoss" );
+
+		Serializable idIfa = s.save( ifa );
+		Serializable idJBoss = s.save( jboss );
+
+		s.flush();
+
+		List result = s.getNamedQuery( "orgNamesOnly" ).list();
+		assertTrue( result.contains( "IFA" ) );
+		assertTrue( result.contains( "JBoss" ) );
+
+		result = s.getNamedQuery( "orgNamesOnly" ).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list();
+		Map m = (Map) result.get(0);
+		assertEquals( 2, result.size() );
+		assertEquals( 1, m.size() );
+		assertTrue( m.containsKey("NAME") );
+
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+
+		Iterator iter = s.getNamedQuery( "orgNamesAndOrgs" ).list().iterator();
+		Object[] o = ( Object[] ) iter.next();
+		assertEquals( o[0], "IFA" );
+		assertEquals( ( ( Organization ) o[1] ).getName(), "IFA" );
+		o = ( Object[] ) iter.next();
+		assertEquals( o[0], "JBoss" );
+		assertEquals( ( ( Organization ) o[1] ).getName(), "JBoss" );
+
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+
+		// test that the ordering of the results is truly based on the order in which they were defined
+		iter = s.getNamedQuery( "orgsAndOrgNames" ).list().iterator();
+		Object[] row = ( Object[] ) iter.next();
+		assertEquals( "expecting non-scalar result first", Organization.class, row[0].getClass() );
+		assertEquals( "expecting scalar result second", String.class, row[1].getClass() );
+		assertEquals( ( ( Organization ) row[0] ).getName(), "IFA" );
+		assertEquals( row[1], "IFA" );
+		row = ( Object[] ) iter.next();
+		assertEquals( "expecting non-scalar result first", Organization.class, row[0].getClass() );
+		assertEquals( "expecting scalar result second", String.class, row[1].getClass() );
+		assertEquals( ( ( Organization ) row[0] ).getName(), "JBoss" );
+		assertEquals( row[1], "JBoss" );
+		assertFalse( iter.hasNext() );
+
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+
+		iter = s.getNamedQuery( "orgIdsAndOrgNames" ).list().iterator();
+		o = ( Object[] ) iter.next();
+		assertEquals( o[1], "IFA" );
+		assertEquals( o[0], idIfa );
+		o = ( Object[] ) iter.next();
+		assertEquals( o[1], "JBoss" );
+		assertEquals( o[0], idJBoss );
+
+		s.delete( ifa );
+		s.delete( jboss );
+		t.commit();
+		s.close();
+	}
+
+	public void testMappedAliasStrategy() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Organization ifa = new Organization("IFA");
+		Organization jboss = new Organization("JBoss");
+		Person gavin = new Person("Gavin");
+		Employment emp = new Employment(gavin, jboss, "AU");
+		Serializable orgId = s.save(jboss);
+		Serializable orgId2 = s.save(ifa);
+		s.save(gavin);
+		s.save(emp);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Query namedQuery = s.getNamedQuery("AllEmploymentAsMapped");
+		List list = namedQuery.list();
+		assertEquals(1,list.size());
+		Employment emp2 = (Employment) list.get(0);
+		assertEquals(emp2.getEmploymentId(), emp.getEmploymentId() );
+		assertEquals(emp2.getStartDate().getDate(), emp.getStartDate().getDate() );
+		assertEquals(emp2.getEndDate(), emp.getEndDate() );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Query sqlQuery = s.getNamedQuery("EmploymentAndPerson");
+		sqlQuery.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
+		list = sqlQuery.list();
+		assertEquals(1,list.size() );
+		Object res = list.get(0);
+		assertClassAssignability(res.getClass(),Map.class);
+		Map m = (Map) res;
+		assertEquals(2,m.size());
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		sqlQuery = s.getNamedQuery( "organizationreturnproperty" );
+		sqlQuery.setResultTransformer( Transformers.ALIAS_TO_ENTITY_MAP );
+		list = sqlQuery.list();
+		assertEquals( 2,list.size() );
+		m = (Map) list.get(0);
+		assertEquals( 2, m.size() );
+		assertTrue( m.containsKey("org") );
+		assertTrue( m.containsKey("emp") );
+		assertClassAssignability( m.get("org").getClass(), Organization.class );
+		if ( jboss.getId() == ( (Organization) m.get("org") ).getId() ) {
+			assertClassAssignability( m.get("emp").getClass(), Employment.class );
+		}
+		Map m2 = (Map) list.get(1);
+		assertEquals( 2, m.size() );
+		assertTrue( m2.containsKey("org") );
+		assertTrue( m2.containsKey("emp") );
+		assertClassAssignability( m2.get("org").getClass(), Organization.class );
+		if ( jboss.getId() == ( (Organization) m2.get("org") ).getId() ) {
+			assertClassAssignability( m2.get("emp").getClass(), Employment.class );
+		}
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		namedQuery = s.getNamedQuery("EmploymentAndPerson");
+		list = namedQuery.list();
+		assertEquals(1,list.size() );
+		Object[] objs = (Object[]) list.get(0);
+		assertEquals(2, objs.length);
+		emp2 = (Employment) objs[0];
+		gavin = (Person) objs[1];
+		s.delete(emp2);
+		s.delete(jboss);
+		s.delete(gavin);
+		s.delete(ifa);
+		t.commit();
+		s.close();
+	}
+
+	/* test for native sql composite id joins which has never been implemented */
+	public void testCompositeIdJoinsFailureExpected() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Person person = new Person();
+		person.setName( "Noob" );
+
+		Product product = new Product();
+		product.setProductId( new Product.ProductId() );
+		product.getProductId().setOrgid( "x" );
+		product.getProductId().setProductnumber( "1234" );
+		product.setName( "Hibernate 3" );
+
+		Order order = new Order();
+		order.setOrderId( new Order.OrderId() );
+		order.getOrderId().setOrdernumber( "1" );
+		order.getOrderId().setOrgid( "y" );
+
+		product.getOrders().add( order );
+		order.setProduct( product );
+		order.setPerson( person );
+
+		s.save( product );
+		s.save( order);
+		s.save( person );
+
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Product p = (Product) s.createQuery( "from Product p join fetch p.orders" ).list().get(0);
+		assertTrue(Hibernate.isInitialized( p.getOrders()));
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Object[] o =  (Object[]) s.createSQLQuery( "select\r\n" +
+				"        product.orgid as {product.id.orgid}," +
+				"        product.productnumber as {product.id.productnumber}," +
+				"        {prod_orders}.orgid as orgid3_1_,\r\n" +
+				"        {prod_orders}.ordernumber as ordernum2_3_1_,\r\n" +
+				"        product.name as {product.name}," +
+				"        {prod_orders.element.*}" +
+				/*"        orders.PROD_NO as PROD4_3_1_,\r\n" +
+				"        orders.person as person3_1_,\r\n" +
+				"        orders.PROD_ORGID as PROD3_0__,\r\n" +
+				"        orders.PROD_NO as PROD4_0__,\r\n" +
+				"        orders.orgid as orgid0__,\r\n" +
+				"        orders.ordernumber as ordernum2_0__ \r\n" +*/
+				"    from\r\n" +
+				"        Product product \r\n" +
+				"    inner join\r\n" +
+				"        TBL_ORDER {prod_orders} \r\n" +
+				"            on product.orgid={prod_orders}.PROD_ORGID \r\n" +
+				"            and product.productnumber={prod_orders}.PROD_NO" )
+				.addEntity( "product", Product.class )
+				.addJoin( "prod_orders", "product.orders" )
+				.list().get(0);
+
+		p = (Product) o[0];
+		assertTrue(Hibernate.isInitialized( p.getOrders() ));
+		assertNotNull(p.getOrders().iterator().next());
+		t.commit();
+		s.close();
+	}
+
+	public void testAutoDetectAliasing() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Organization ifa = new Organization("IFA");
+		Organization jboss = new Organization("JBoss");
+		Person gavin = new Person("Gavin");
+		Employment emp = new Employment(gavin, jboss, "AU");
+		Serializable orgId = s.save(jboss);
+		Serializable orgId2 = s.save(ifa);
+		s.save(gavin);
+		s.save(emp);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		List list = s.createSQLQuery( getEmploymentSQL() )
+				.addEntity( Employment.class.getName() )
+				.list();
+		assertEquals( 1,list.size() );
+
+		Employment emp2 = (Employment) list.get(0);
+		assertEquals(emp2.getEmploymentId(), emp.getEmploymentId() );
+		assertEquals(emp2.getStartDate().getDate(), emp.getStartDate().getDate() );
+		assertEquals(emp2.getEndDate(), emp.getEndDate() );
+
+		s.clear();
+
+		list = s.createSQLQuery( getEmploymentSQL() )
+		.addEntity( Employment.class.getName() )
+		.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP)
+		.list();
+		assertEquals( 1,list.size() );
+		Map m = (Map) list.get(0);
+		assertTrue(m.containsKey("Employment"));
+		assertEquals(1,m.size());
+
+		list = s.createSQLQuery(getEmploymentSQL()).list();
+		assertEquals(1, list.size());
+		Object[] o = (Object[]) list.get(0);
+		assertEquals(8, o.length);
+
+		list = s.createSQLQuery( getEmploymentSQL() ).setResultTransformer( new UpperCasedAliasToEntityMapResultTransformer() ).list();
+		assertEquals(1, list.size());
+		m = (Map) list.get(0);
+		assertTrue(m.containsKey("EMPID"));
+		assertTrue(m.containsKey("VALUE"));
+		assertTrue(m.containsKey("ENDDATE"));
+		assertEquals(8, m.size());
+
+		list = s.createSQLQuery( getEmploymentSQLMixedScalarEntity() ).addScalar( "employerid" ).addEntity( Employment.class ).list();
+		assertEquals(1, list.size());
+		o = (Object[]) list.get(0);
+		assertEquals(2, o.length);
+		assertClassAssignability( o[0].getClass(), Number.class);
+		assertClassAssignability( o[1].getClass(), Employment.class);
+
+
+
+		Query queryWithCollection = s.getNamedQuery("organizationEmploymentsExplicitAliases");
+		queryWithCollection.setLong("id",  jboss.getId() );
+		list = queryWithCollection.list();
+		assertEquals(list.size(),1);
+
+		s.clear();
+
+		list = s.createSQLQuery( getOrganizationJoinEmploymentSQL() )
+				.addEntity( "org", Organization.class )
+				.addJoin( "emp", "org.employments" )
+				.list();
+		assertEquals( 2,list.size() );
+
+		s.clear();
+
+		list = s.createSQLQuery( getOrganizationFetchJoinEmploymentSQL() )
+				.addEntity( "org", Organization.class )
+				.addJoin( "emp", "org.employments" )
+				.list();
+		assertEquals( 2,list.size() );
+
+		s.clear();
+
+		// TODO : why twice?
+		s.getNamedQuery( "organizationreturnproperty" ).list();
+		list = s.getNamedQuery( "organizationreturnproperty" ).list();
+		assertEquals( 2,list.size() );
+
+		s.clear();
+
+		list = s.getNamedQuery( "organizationautodetect" ).list();
+		assertEquals( 2,list.size() );
+
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete(emp2);
+
+		s.delete(jboss);
+		s.delete(gavin);
+		s.delete(ifa);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		Dimension dim = new Dimension( 3, Integer.MAX_VALUE );
+		s.save( dim );
+		list = s.createSQLQuery( "select d_len * d_width as surface, d_len * d_width * 10 as volume from Dimension" ).list();
+		s.delete( dim );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		SpaceShip enterprise = new SpaceShip();
+		enterprise.setModel( "USS" );
+		enterprise.setName( "Entreprise" );
+		enterprise.setSpeed( 50d );
+		Dimension d = new Dimension(45, 10);
+		enterprise.setDimensions( d );
+		s.save( enterprise );
+		Object[] result = (Object[]) s.getNamedQuery( "spaceship" ).uniqueResult();
+		enterprise = ( SpaceShip ) result[0];
+		assertTrue(50d == enterprise.getSpeed() );
+		assertTrue( 450d == extractDoubleValue( result[1] ) );
+		assertTrue( 4500d == extractDoubleValue( result[2] ) );
+		s.delete( enterprise );
+		t.commit();
+		s.close();
+
+	}
+
+	public void testMixAndMatchEntityScalar() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Speech speech = new Speech();
+		speech.setLength( new Double( 23d ) );
+		speech.setName( "Mine" );
+		s.persist( speech );
+		s.flush();
+		s.clear();
+
+		List l = s.createSQLQuery( "select name, id, flength, name as scalarName from Speech" )
+				.setResultSetMapping( "speech" )
+				.list();
+		assertEquals( l.size(), 1 );
+
+		t.rollback();
+		s.close();
+	}
+
+	private double extractDoubleValue(Object value) {
+		if ( value instanceof BigInteger ) {
+			return ( ( BigInteger ) value ).doubleValue();
+		}
+		else if ( value instanceof BigDecimal ) {
+			return ( ( BigDecimal ) value ).doubleValue();
+		}
+		else {
+			return Double.valueOf( value.toString() ).doubleValue();
+		}
+	}
+
+	public void testAddJoinForManyToMany() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Person gavin = new Person( "Gavin" );
+		Person max = new Person( "Max" );
+		Person pete = new Person( "Pete" );
+
+		Group hibernate = new Group( "Hibernate" );
+		Group seam = new Group( "Seam" );
+
+		s.persist( gavin );
+		s.persist( max );
+		s.persist( pete );
+		s.persist( seam );
+		s.persist( hibernate );
+
+		hibernate.getPersons().add( gavin );
+		hibernate.getPersons().add( max );
+		seam.getPersons().add( gavin );
+		seam.getPersons().add( pete );
+
+		s.flush();
+		s.clear();
+
+		// todo : see http://opensource.atlassian.com/projects/hibernate/browse/HHH-3908
+//		String sqlStr = "SELECT {groupp.*} , {gp.*} " +
+//				"FROM GROUPP groupp, GROUP_PERSON gp, PERSON person WHERE groupp.ID = gp.GROUP_ID and person.PERID = gp.PERSON_ID";
+//
+//		List l = s.createSQLQuery( sqlStr )
+//				.addEntity("groupp", Group.class)
+//				.addJoin("gp","groupp.persons")
+//				.list();
+		List l = s.getNamedQuery( "manyToManyFetch" ).list();
+		//assertEquals( 2, l.size() );
+
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+
+		seam.getPersons().remove( gavin );
+		seam.getPersons().remove( pete );
+
+		hibernate.getPersons().remove( gavin );
+		hibernate.getPersons().remove( max );
+
+		s.delete( seam );
+		s.delete( hibernate );
+		s.delete( gavin );
+		s.delete( max );
+		s.delete( pete );
+
+		t.commit();
+		s.close();
+	}
+
+	public void testTextTypeInSQLQuery() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		String description = buildLongString( 15000, 'a' );
+		TextHolder holder = new TextHolder( description );
+		s.persist( holder );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		String descriptionRead = ( String ) s.createSQLQuery( getDescriptionsSQL() )
+				.uniqueResult();
+		assertEquals( description, descriptionRead );
+		s.delete( holder );
+		t.commit();
+		s.close();
+	}
+
+	public void testImageTypeInSQLQuery() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		byte[] photo = buildLongByteArray( 15000, true );
+		ImageHolder holder = new ImageHolder( photo );
+		s.persist( holder );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		byte[] photoRead = ( byte[] ) s.createSQLQuery( getPhotosSQL() )
+				.uniqueResult();
+		assertTrue( ArrayHelper.isEquals( photo, photoRead ) );
+		s.delete( holder );
+		t.commit();
+		s.close();
+	}
+
+	private String buildLongString(int size, char baseChar) {
+		StringBuffer buff = new StringBuffer();
+		for( int i = 0; i < size; i++ ) {
+			buff.append( baseChar );
+		}
+		return buff.toString();
+	}
+
+	private byte[] buildLongByteArray(int size, boolean on) {
+		byte[] data = new byte[size];
+		data[0] = mask( on );
+		for ( int i = 0; i < size; i++ ) {
+			data[i] = mask( on );
+			on = !on;
+		}
+		return data;
+	}
+
+	private byte mask(boolean on) {
+		return on ? ( byte ) 1 : ( byte ) 0;
+	}
+
+	private static class UpperCasedAliasToEntityMapResultTransformer extends BasicTransformerAdapter implements Serializable {
+		public Object transformTuple(Object[] tuple, String[] aliases) {
+			Map result = new HashMap( tuple.length );
+			for ( int i = 0; i < tuple.length; i++ ) {
+				String alias = aliases[i];
+				if ( alias != null ) {
+					result.put( alias.toUpperCase(), tuple[i] );
+				}
+			}
+			return result;
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/query/NativeSQLQueriesTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/quotedidentifiers/Mappings.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/quotedidentifiers/Mappings.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/quotedidentifiers/Mappings.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,58 @@
+<?xml version="1.0"?>
+<!--
+  ~ Hibernate, Relational Persistence for Idiomatic Java
+  ~
+  ~ Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+  ~ indicated by the @author tags or express copyright attribution
+  ~ statements applied by the authors.  All third-party contributions are
+  ~ distributed under license by Red Hat Inc.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, as published by the Free Software Foundation.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  ~ or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+  ~ for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public License
+  ~ along with this distribution; if not, write to:
+  ~ Free Software Foundation, Inc.
+  ~ 51 Franklin Street, Fifth Floor
+  ~ Boston, MA  02110-1301  USA
+  -->
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.sql.hand.quotedidentifiers">
+
+	<class name="Person" table="`Person`">
+		<id name="id" unsaved-value="0" column="`pId`">
+			<generator class="increment"/>
+		</id>
+		<property name="name" column="`pName`" not-null="true"/>
+	</class>
+    
+    <resultset name="person-scalar">
+        <return-scalar column="`pId`"/>
+        <return-scalar column="`pName`"/>
+    </resultset>
+
+    <resultset name="person-entity-basic">
+        <return alias="p" class="Person"/>
+    </resultset>
+
+    <resultset name="person-entity-expanded">
+		<return alias="p" class="Person">
+			<return-property name="id" column="`pId`"/>
+			<return-property name="name" column="`pName`"/>
+		</return>
+    </resultset>
+
+    <sql-query name="query-person">
+        select p."pId", p."pName" from "Person" p
+    </sql-query>
+	
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/quotedidentifiers/Mappings.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/quotedidentifiers/NativeSqlAndQuotedIdentifiersTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/quotedidentifiers/NativeSqlAndQuotedIdentifiersTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/quotedidentifiers/NativeSqlAndQuotedIdentifiersTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,105 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.sql.hand.quotedidentifiers;
+
+import org.hibernate.SQLQuery;
+import org.hibernate.Session;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.testing.junit.functional.DatabaseSpecificFunctionalTestCase;
+
+/**
+ * Test of various situations with native-sql queries and quoted identifiers
+ *
+ * @author Steve Ebersole
+ */
+public class NativeSqlAndQuotedIdentifiersTest extends DatabaseSpecificFunctionalTestCase {
+	public NativeSqlAndQuotedIdentifiersTest(String string) {
+		super( string );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "sql/hand/quotedidentifiers/Mappings.hbm.xml" };
+	}
+
+	@Override
+	public boolean appliesTo(Dialect dialect) {
+		return '\"' == dialect.openQuote();
+	}
+
+	@Override
+	protected void prepareTest() throws Exception {
+		Session session = sfi().openSession();
+		session.beginTransaction();
+		session.save( new Person( "me" ) );
+		session.getTransaction().commit();
+		session.close();
+	}
+
+	@Override
+	protected void cleanupTest() throws Exception {
+		Session session = sfi().openSession();
+		session.beginTransaction();
+		session.createQuery( "delete Person" ).executeUpdate();
+		session.getTransaction().commit();
+		session.close();
+	}
+
+	public void testCompleteScalarDiscovery() {
+		Session session = openSession();
+		session.beginTransaction();
+		session.getNamedQuery( "query-person" ).list();
+		session.getTransaction().commit();
+		session.close();
+	}
+
+	public void testPartialScalarDiscovery() {
+		Session session = openSession();
+		session.beginTransaction();
+		SQLQuery query = (SQLQuery) session.getNamedQuery( "query-person" );
+		query.setResultSetMapping( "person-scalar" );
+		query.list();
+		session.getTransaction().commit();
+		session.close();
+	}
+
+	public void testBasicEntityMapping() {
+		Session session = openSession();
+		session.beginTransaction();
+		SQLQuery query = (SQLQuery) session.getNamedQuery( "query-person" );
+		query.setResultSetMapping( "person-entity-basic" );
+		query.list();
+		session.getTransaction().commit();
+		session.close();
+	}
+
+	public void testExpandedEntityMapping() {
+		Session session = openSession();
+		session.beginTransaction();
+		SQLQuery query = (SQLQuery) session.getNamedQuery( "query-person" );
+		query.setResultSetMapping( "person-entity-expanded" );
+		query.list();
+		session.getTransaction().commit();
+		session.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/quotedidentifiers/NativeSqlAndQuotedIdentifiersTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/quotedidentifiers/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/quotedidentifiers/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/quotedidentifiers/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,57 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.sql.hand.quotedidentifiers;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class Person {
+	private Long id;
+	private String name;
+
+	public Person() {
+	}
+
+	public Person(String name) {
+		this.name = name;
+	}
+
+	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;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/sql/hand/quotedidentifiers/Person.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/Contact.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/Contact.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/Contact.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.stateless">
+
+	<class name="Contact">
+		<id name="id">
+			<generator class="native" />
+		</id>
+		<many-to-one name="org" lazy="false" fetch="join" />
+	</class>
+
+	<class name="Org">
+		<id name="id">
+			<generator class="native" />
+		</id>
+		<many-to-one name="country" lazy="false" fetch="join" />
+	</class>
+
+	<class name="Country">
+		<id name="id">
+			<generator class="native" />
+		</id>
+	</class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/Contact.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/Contact.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/Contact.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/Contact.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,47 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.stateless;
+
+/**
+ * 
+ * @author stliu
+ */
+public class Contact {
+	private Integer id;
+	public Integer getId() {
+		return id;
+	}
+	public void setId( Integer id ) {
+		this.id = id;
+	}
+	public Org getOrg() {
+		return org;
+	}
+	public void setOrg( Org org ) {
+		this.org = org;
+	}
+	private Org org;
+	
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/Contact.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/Country.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/Country.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/Country.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,13 @@
+package org.hibernate.test.stateless;
+
+public class Country {
+	private Integer id;
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/Country.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/Document.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/Document.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/Document.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+
+-->
+
+<hibernate-mapping 
+	package="org.hibernate.test.stateless">
+
+	<class name="Document">
+		<id name="name"/>
+		<timestamp name="lastModified"/>
+		<property name="text"/>
+	</class>
+
+    <class name="Paper">
+		<id name="id">
+            <generator class="native"/>
+        </id>
+        <property name="color"/>
+	</class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/Document.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/Document.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/Document.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/Document.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,46 @@
+//$Id: Document.java 8057 2005-08-31 23:19:53Z oneovthafew $
+package org.hibernate.test.stateless;
+
+import java.util.Date;
+
+/**
+ * @author Gavin King
+ */
+public class Document {
+	
+	private String text;
+	private String name;
+	private Date lastModified;
+
+	Document() {}
+	
+	public Document(String text, String name) {
+		this.text = text;
+		this.name = name;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getText() {
+		return text;
+	}
+
+	public void setText(String text) {
+		this.text = text;
+	}
+
+	public Date getLastModified() {
+		return lastModified;
+	}
+
+	void setLastModified(Date lastModified) {
+		this.lastModified = lastModified;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/Document.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/Org.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/Org.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/Org.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,23 @@
+package org.hibernate.test.stateless;
+
+public class Org {
+	private Integer id;
+	private Country country;
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public Country getCountry() {
+		return country;
+	}
+
+	public void setCountry(Country country) {
+		this.country = country;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/Org.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/Paper.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/Paper.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/Paper.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,26 @@
+//$Id: Paper.java 8048 2005-08-30 21:27:17Z epbernard $
+package org.hibernate.test.stateless;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Paper {
+	private Integer id;
+	private String color;
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getColor() {
+		return color;
+	}
+
+	public void setColor(String color) {
+		this.color = color;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/Paper.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/StatelessSessionQueryTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/StatelessSessionQueryTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/StatelessSessionQueryTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,117 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.test.stateless;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.hibernate.FetchMode;
+import org.hibernate.Session;
+import org.hibernate.StatelessSession;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+
+/**
+ * 
+ * @author stliu
+ */
+public class StatelessSessionQueryTest extends FunctionalTestCase {
+
+	public StatelessSessionQueryTest( String string ) {
+		super( string );
+	}
+
+	public void testCriteria() {
+		TestData testData=new TestData();
+		testData.createData();
+		StatelessSession s = getSessions().openStatelessSession();
+		assertEquals( 1, s.createCriteria( Contact.class ).list().size() );
+		s.close();
+		testData.cleanData();
+	}
+
+	public void testCriteriaWithSelectFetchMode() {
+		TestData testData=new TestData();
+		testData.createData();
+		StatelessSession s = getSessions().openStatelessSession();
+		assertEquals( 1, s.createCriteria( Contact.class ).setFetchMode( "org", FetchMode.SELECT )
+				.list().size() );
+		s.close();
+		testData.cleanData();
+	}
+
+	public void testHQL() {
+		TestData testData=new TestData();
+		testData.createData();
+		StatelessSession s = getSessions().openStatelessSession();
+		assertEquals( 1, s.createQuery( "from Contact c join fetch c.org join fetch c.org.country" )
+				.list().size() );
+		s.close();
+		testData.cleanData();
+	}
+	private class TestData{
+		List list = new ArrayList();
+		public void createData(){
+			Session session = openSession();
+			Transaction tx = session.beginTransaction();
+			Country usa = new Country();
+			session.save( usa );
+			list.add( usa );
+			Org disney = new Org();
+			disney.setCountry( usa );
+			session.save( disney );
+			list.add( disney );
+			Contact waltDisney = new Contact();
+			waltDisney.setOrg( disney );
+			session.save( waltDisney );
+			list.add( waltDisney );
+			tx.commit();
+			session.close();
+		}
+		public void cleanData(){
+			Session session = openSession();
+			Transaction tx = session.beginTransaction();
+			for(Object obj: list){
+				session.delete( obj );
+			}
+			tx.commit();
+			session.close();
+		}
+	}
+
+
+	@Override
+	public void configure( Configuration cfg ) {
+		super.configure( cfg );
+		cfg.setProperty( Environment.MAX_FETCH_DEPTH, "1" );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "stateless/Contact.hbm.xml" };
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/StatelessSessionQueryTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/StatelessSessionTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/StatelessSessionTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/StatelessSessionTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,168 @@
+//$Id: StatelessSessionTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.stateless;
+
+import java.util.Date;
+
+import junit.framework.Test;
+
+import org.hibernate.ScrollMode;
+import org.hibernate.ScrollableResults;
+import org.hibernate.StatelessSession;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class StatelessSessionTest extends FunctionalTestCase {
+	
+	public StatelessSessionTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "stateless/Document.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( StatelessSessionTest.class );
+	}
+
+	public void testCreateUpdateReadDelete() {
+		StatelessSession ss = getSessions().openStatelessSession();
+		Transaction tx = ss.beginTransaction();
+		Document doc = new Document("blah blah blah", "Blahs");
+		ss.insert(doc);
+		assertNotNull( doc.getName() );
+		Date initVersion = doc.getLastModified();
+		assertNotNull( initVersion );
+		tx.commit();
+		
+		tx = ss.beginTransaction();
+		doc.setText("blah blah blah .... blah");
+		ss.update(doc);
+		assertNotNull( doc.getLastModified() );
+		assertNotSame( doc.getLastModified(), initVersion );
+		tx.commit();
+		
+		tx = ss.beginTransaction();
+		doc.setText("blah blah blah .... blah blay");
+		ss.update(doc);
+		tx.commit();
+		
+		Document doc2 = (Document) ss.get(Document.class.getName(), "Blahs");
+		assertEquals("Blahs", doc2.getName());
+		assertEquals(doc.getText(), doc2.getText());
+				
+		doc2 = (Document) ss.createQuery("from Document where text is not null").uniqueResult();
+		assertEquals("Blahs", doc2.getName());
+		assertEquals(doc.getText(), doc2.getText());
+		
+		ScrollableResults sr = ss.createQuery("from Document where text is not null")
+			.scroll(ScrollMode.FORWARD_ONLY);
+		sr.next();
+		doc2 = (Document) sr.get(0);
+		sr.close();
+		assertEquals("Blahs", doc2.getName());
+		assertEquals(doc.getText(), doc2.getText());
+				
+		doc2 = (Document) ss.createSQLQuery("select * from Document")
+			.addEntity(Document.class)
+			.uniqueResult();
+		assertEquals("Blahs", doc2.getName());
+		assertEquals(doc.getText(), doc2.getText());
+				
+		doc2 = (Document) ss.createCriteria(Document.class).uniqueResult();
+		assertEquals("Blahs", doc2.getName());
+		assertEquals(doc.getText(), doc2.getText());
+		
+		sr = ss.createCriteria(Document.class).scroll(ScrollMode.FORWARD_ONLY);
+		sr.next();
+		doc2 = (Document) sr.get(0);
+		sr.close();
+		assertEquals("Blahs", doc2.getName());
+		assertEquals(doc.getText(), doc2.getText());
+
+		tx = ss.beginTransaction();
+		ss.delete(doc);
+		tx.commit();
+		ss.close();
+
+	}
+
+	public void testHqlBulk() {
+		StatelessSession ss = getSessions().openStatelessSession();
+		Transaction tx = ss.beginTransaction();
+		Document doc = new Document("blah blah blah", "Blahs");
+		ss.insert(doc);
+		Paper paper = new Paper();
+		paper.setColor( "White" );
+		ss.insert(paper);
+		tx.commit();
+
+		tx = ss.beginTransaction();
+		int count = ss.createQuery( "update Document set name = :newName where name = :oldName" )
+				.setString( "newName", "Foos" )
+				.setString( "oldName", "Blahs" )
+				.executeUpdate();
+		assertEquals( "hql-update on stateless session", 1, count );
+		count = ss.createQuery( "update Paper set color = :newColor" )
+				.setString( "newColor", "Goldenrod" )
+				.executeUpdate();
+		assertEquals( "hql-update on stateless session", 1, count );
+		tx.commit();
+
+		tx = ss.beginTransaction();
+		count = ss.createQuery( "delete Document" ).executeUpdate();
+		assertEquals( "hql-delete on stateless session", 1, count );
+		count = ss.createQuery( "delete Paper" ).executeUpdate();
+		assertEquals( "hql-delete on stateless session", 1, count );
+		tx.commit();
+		ss.close();
+	}
+
+	public void testInitId() {
+		StatelessSession ss = getSessions().openStatelessSession();
+		Transaction tx = ss.beginTransaction();
+		Paper paper = new Paper();
+		paper.setColor( "White" );
+		ss.insert(paper);
+		assertNotNull( paper.getId() );
+		tx.commit();
+
+		tx = ss.beginTransaction();
+		ss.delete( ss.get( Paper.class, paper.getId() ) );
+		tx.commit();
+		ss.close();
+	}
+
+	public void testRefresh() {
+		StatelessSession ss = getSessions().openStatelessSession();
+		Transaction tx = ss.beginTransaction();
+		Paper paper = new Paper();
+		paper.setColor( "whtie" );
+		ss.insert( paper );
+		tx.commit();
+		ss.close();
+
+		ss = getSessions().openStatelessSession();
+		tx = ss.beginTransaction();
+		Paper p2 = ( Paper ) ss.get( Paper.class, paper.getId() );
+		p2.setColor( "White" );
+		ss.update( p2 );
+		tx.commit();
+		ss.close();
+
+		ss = getSessions().openStatelessSession();
+		tx = ss.beginTransaction();
+		assertEquals( "whtie", paper.getColor() );
+		ss.refresh( paper );
+		assertEquals( "White", paper.getColor() );
+		ss.delete( paper );
+		tx.commit();
+		ss.close();
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/StatelessSessionTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/fetching/Mappings.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/fetching/Mappings.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/fetching/Mappings.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,56 @@
+<?xml version="1.0"?>
+<!--
+  ~ Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+  ~ indicated by the @author tags or express copyright attribution
+  ~ statements applied by the authors.  All third-party contributions are
+  ~ distributed under license by Red Hat Middleware LLC.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, as published by the Free Software Foundation.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  ~ or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+  ~ for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public License
+  ~ along with this distribution; if not, write to:
+  ~ Free Software Foundation, Inc.
+  ~ 51 Franklin Street, Fifth Floor
+  ~ Boston, MA  02110-1301  USA
+  -->
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.stateless.fetching">
+
+	<class name="User">
+		<id name="id" type="long">
+            <generator class="increment" />
+		</id>
+        <property name="name" type="string"/>
+	</class>
+
+    <class name="Resource">
+		<id name="id" type="long">
+            <generator class="increment" />
+		</id>
+        <property name="name" type="string"/>
+        <many-to-one name="owner"/>
+    </class>
+
+    <class name="Task">
+		<id name="id" type="long">
+            <generator class="increment" />
+		</id>
+        <property name="description" type="string"/>
+        <many-to-one name="user" column="`user`"/>
+        <many-to-one name="resource"/>
+        <property name="dueDate" type="timestamp"/>
+        <property name="startDate" type="timestamp"/>
+        <property name="completionDate" type="timestamp"/>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/fetching/Mappings.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/fetching/Resource.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/fetching/Resource.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/fetching/Resource.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.stateless.fetching;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class Resource {
+	private Long id;
+	private String name;
+	private User owner;
+
+	public Resource() {
+	}
+
+	public Resource(String name, User owner) {
+		this.name = name;
+		this.owner = owner;
+	}
+
+	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 User getOwner() {
+		return owner;
+	}
+
+	public void setOwner(User owner) {
+		this.owner = owner;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/fetching/Resource.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/fetching/StatelessSessionFetchingTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/fetching/StatelessSessionFetchingTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/fetching/StatelessSessionFetchingTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,149 @@
+/*
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.stateless.fetching;
+
+import java.util.Date;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.DefaultNamingStrategy;
+import org.hibernate.util.StringHelper;
+import org.hibernate.Session;
+import org.hibernate.StatelessSession;
+import org.hibernate.Hibernate;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class StatelessSessionFetchingTest extends FunctionalTestCase {
+	private static final Logger log = LoggerFactory.getLogger( StatelessSessionFetchingTest.class );
+
+	public StatelessSessionFetchingTest(String name) {
+		super( name );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( StatelessSessionFetchingTest.class );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "stateless/fetching/Mappings.hbm.xml" };
+	}
+
+	// trying a new thing here in tests with this naming strategy to help alleviate table name clashes
+
+	private class TestingNamingStrategy extends DefaultNamingStrategy {
+		private final String prefix = determineUniquePrefix();
+
+		protected String applyPrefix(String baseTableName) {
+			String prefixed = prefix + '_' + baseTableName;
+			log.debug( "prefixed table name : {} -> {} ", baseTableName, prefixed );
+			return prefixed;
+		}
+
+		@Override
+		public String classToTableName(String className) {
+			return applyPrefix( super.classToTableName( className ) );
+		}
+
+		@Override
+		public String tableName(String tableName) {
+			if ( tableName.startsWith( "`" ) && tableName.endsWith( "`" ) ) {
+				return tableName;
+			}
+			if ( tableName.startsWith( prefix + '_' ) ) {
+				return tableName;
+			}
+			return applyPrefix( tableName );
+		}
+
+		@Override
+		public String collectionTableName(String ownerEntity, String ownerEntityTable, String associatedEntity, String associatedEntityTable, String propertyName) {
+			String tableName = super.collectionTableName( ownerEntity, ownerEntityTable, associatedEntity, associatedEntityTable, propertyName );
+			return applyPrefix( tableName );
+		}
+
+		@Override
+		public String logicalCollectionTableName(String tableName, String ownerEntityTable, String associatedEntityTable, String propertyName) {
+			String resolvedTableName = prefix + '_' + super.logicalCollectionTableName( tableName, ownerEntityTable, associatedEntityTable, propertyName );
+			System.out.println( "Logical collection table name : " + tableName + " -> " + resolvedTableName );
+			return resolvedTableName;
+		}
+
+		private String determineUniquePrefix() {
+			return StringHelper.collapseQualifier( getClass().getName(), false ).toUpperCase();
+		}
+	}
+
+	@Override
+	public void configure(Configuration cfg) {
+		super.configure( cfg );
+		cfg.setNamingStrategy( new TestingNamingStrategy() );
+	}
+
+	public void testDynamicFetch() {
+		Session s = openSession();
+		s.beginTransaction();
+		Date now = new Date();
+		User me = new User( "me" );
+		User you = new User( "you" );
+		Resource yourClock = new Resource( "clock", you );
+		Task task = new Task( me, "clean", yourClock, now ); // :)
+		s.save( me );
+		s.save( you );
+		s.save( yourClock );
+		s.save( task );
+		s.getTransaction().commit();
+		s.close();
+
+		StatelessSession ss = sfi().openStatelessSession();
+		ss.beginTransaction();
+		Task taskRef = ( Task ) ss.createQuery( "from Task t join fetch t.resource join fetch t.user" ).uniqueResult();
+		assertTrue( taskRef != null );
+		assertTrue( Hibernate.isInitialized( taskRef ) );
+		assertTrue( Hibernate.isInitialized( taskRef.getUser() ) );
+		assertTrue( Hibernate.isInitialized( taskRef.getResource() ) );
+		assertFalse( Hibernate.isInitialized( taskRef.getResource().getOwner() ) );
+		ss.getTransaction().commit();
+		ss.close();
+
+		cleanup();
+	}
+
+	private void cleanup() {
+		Session s = openSession();
+		s.beginTransaction();
+		s.createQuery( "delete Task" ).executeUpdate();
+		s.createQuery( "delete Resource" ).executeUpdate();
+		s.createQuery( "delete User" ).executeUpdate();
+		s.getTransaction().commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/fetching/StatelessSessionFetchingTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/fetching/Task.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/fetching/Task.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/fetching/Task.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,111 @@
+/*
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.stateless.fetching;
+
+import java.util.Date;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class Task {
+	private Long id;
+	private String description;
+	private User user;
+	private Resource resource;
+	private Date dueDate;
+	private Date startDate;
+	private Date completionDate;
+
+	public Task() {
+	}
+
+	public Task(User user, String description, Resource resource, Date dueDate) {
+		this( user, description, resource, dueDate, null, null );
+	}
+
+	public Task(User user, String description, Resource resource, Date dueDate, Date startDate, Date completionDate) {
+		this.user = user;
+		this.resource = resource;
+		this.description = description;
+		this.dueDate = dueDate;
+		this.startDate = startDate;
+		this.completionDate = completionDate;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public User getUser() {
+		return user;
+	}
+
+	public void setUser(User user) {
+		this.user = user;
+	}
+
+	public Resource getResource() {
+		return resource;
+	}
+
+	public void setResource(Resource resource) {
+		this.resource = resource;
+	}
+
+	public String getDescription() {
+		return description;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
+	public Date getDueDate() {
+		return dueDate;
+	}
+
+	public void setDueDate(Date dueDate) {
+		this.dueDate = dueDate;
+	}
+
+	public Date getStartDate() {
+		return startDate;
+	}
+
+	public void setStartDate(Date startDate) {
+		this.startDate = startDate;
+	}
+
+	public Date getCompletionDate() {
+		return completionDate;
+	}
+
+	public void setCompletionDate(Date completionDate) {
+		this.completionDate = completionDate;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/fetching/Task.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/fetching/User.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/fetching/User.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/fetching/User.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.stateless.fetching;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class User {
+	private Long id;
+	private String name;
+
+	public User() {
+	}
+
+	public User(String name) {
+		this.name = name;
+	}
+
+	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;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stateless/fetching/User.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/Continent.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/Continent.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/Continent.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,44 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.stats">
+
+    <import class="Locality"/>
+
+    <class name="Continent">
+		<id name="id">
+		 <generator class="native"/>
+		</id>
+		<property name="name"/>
+		<set name="countries">
+			<key column="country_id"/>
+			<one-to-many class="Country"/>
+		</set>
+	</class>
+	
+	<class name="Country">
+		<id name="id">
+			<generator class="native"/>
+		</id>
+		<property name="name"/>
+	</class>
+
+    <class name="State">
+        <id name="id">
+            <generator class="native"/>
+        </id>
+        <property name="name"/>
+        <many-to-one name="country"/>
+    </class>
+
+    <class name="Province">
+        <id name="id">
+            <generator class="native"/>
+        </id>
+        <property name="name"/>
+        <many-to-one name="country"/>
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/Continent.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/Continent.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/Continent.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/Continent.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,38 @@
+//$Id: Continent.java 6736 2005-05-09 16:09:38Z epbernard $
+package org.hibernate.test.stats;
+
+import java.util.Set;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Continent {
+	private Integer id;
+	private String name;
+	private Set countries;
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Set getCountries() {
+		return countries;
+	}
+
+	public void setCountries(Set countries) {
+		this.countries = countries;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/Continent.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/Continent2.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/Continent2.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/Continent2.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.stats">
+
+	<class name="Continent" table="tbl_continent">
+		<id name="id">
+		 <generator class="native"/>
+		</id>
+		<property name="name"/>
+		<set name="countries">
+			<key column="country_id"/>
+			<one-to-many class="Country"/>
+		</set>
+	</class>
+	
+	<class name="Country" table="tbl_country">
+		<id name="id">
+			<generator class="native"/>
+		</id>
+		<property name="name"/>
+	</class>
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/Continent2.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/Country.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/Country.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/Country.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,41 @@
+//$Id: Country.java 6736 2005-05-09 16:09:38Z epbernard $
+package org.hibernate.test.stats;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Country {
+	private Integer id;
+	private String name;
+
+	public boolean equals(Object o) {
+		if (this == o) return true;
+		if (!(o instanceof Country)) return false;
+
+		final Country country = (Country) o;
+
+		if (!name.equals(country.name)) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		return name.hashCode();
+	}
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/Country.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/Locality.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/Locality.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/Locality.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,42 @@
+package org.hibernate.test.stats;
+
+/**
+ * @author Steve Ebersole
+ */
+public class Locality {
+	private Long id;
+	private String name;
+	private Country country;
+
+	public Locality() {
+	}
+
+	public Locality(String name, Country country) {
+		this.name = name;
+		this.country = country;
+	}
+
+	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 Country getCountry() {
+		return country;
+	}
+
+	public void setCountry(Country country) {
+		this.country = country;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/Locality.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/Province.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/Province.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/Province.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,7 @@
+package org.hibernate.test.stats;
+
+/**
+ * @author Steve Ebersole
+ */
+public class Province extends Locality {
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/Province.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/SessionStatsTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/SessionStatsTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/SessionStatsTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,75 @@
+//$Id: SessionStatsTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.stats;
+
+import java.util.HashSet;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.stat.SessionStatistics;
+import org.hibernate.stat.Statistics;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class SessionStatsTest extends FunctionalTestCase {
+
+	public SessionStatsTest(String x) {
+		super(x);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "stats/Continent2.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( SessionStatsTest.class );
+	}
+
+	public void testSessionStatistics() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Statistics stats = getSessions().getStatistics();
+		stats.clear();
+		boolean isStats = stats.isStatisticsEnabled();
+		stats.setStatisticsEnabled(true);
+		Continent europe = fillDb(s);
+		tx.commit();
+		s.clear();
+		tx = s.beginTransaction();
+		SessionStatistics sessionStats = s.getStatistics();
+		assertEquals( 0, sessionStats.getEntityKeys().size() );
+		assertEquals( 0, sessionStats.getEntityCount() );
+		assertEquals( 0, sessionStats.getCollectionKeys().size() );
+		assertEquals( 0, sessionStats.getCollectionCount() );
+		europe = (Continent) s.get( Continent.class, europe.getId() );
+		Hibernate.initialize( europe.getCountries() );
+		Hibernate.initialize( europe.getCountries().iterator().next() );
+		assertEquals( 2, sessionStats.getEntityKeys().size() );
+		assertEquals( 2, sessionStats.getEntityCount() );
+		assertEquals( 1, sessionStats.getCollectionKeys().size() );
+		assertEquals( 1, sessionStats.getCollectionCount() );
+		tx.commit();
+		s.close();
+
+		stats.setStatisticsEnabled( isStats);
+
+	}
+
+	private Continent fillDb(Session s) {
+		Continent europe = new Continent();
+		europe.setName("Europe");
+		Country france = new Country();
+		france.setName("France");
+		europe.setCountries( new HashSet() );
+		europe.getCountries().add(france);
+		s.persist(france);
+		s.persist(europe);
+		return europe;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/SessionStatsTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/State.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/State.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/State.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,7 @@
+package org.hibernate.test.stats;
+
+/**
+ * @author Steve Ebersole
+ */
+public class State extends Locality {
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/State.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/StatsTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/StatsTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/StatsTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,237 @@
+//$Id: StatsTest.java 15731 2008-12-26 23:42:56Z gbadner $
+package org.hibernate.test.stats;
+
+import java.util.HashSet;
+import java.util.Iterator;
+
+import junit.framework.Test;
+
+import org.hibernate.FetchMode;
+import org.hibernate.Hibernate;
+import org.hibernate.ScrollableResults;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.mapping.Collection;
+import org.hibernate.stat.QueryStatistics;
+import org.hibernate.stat.Statistics;
+
+/**
+ * Show the difference between fetch and load
+ *
+ * @author Emmanuel Bernard
+ */
+public class StatsTest extends FunctionalTestCase {
+
+	public StatsTest(String x) {
+		super(x);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "stats/Continent.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		super.configure( cfg );
+		cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( StatsTest.class );
+	}
+
+	public void testCollectionFetchVsLoad() throws Exception {
+		Statistics stats = getSessions().getStatistics();
+		stats.clear();
+
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Continent europe = fillDb(s);
+		tx.commit();
+		s.clear();
+
+		tx = s.beginTransaction();
+		assertEquals(0, stats.getCollectionLoadCount() );
+		assertEquals(0,  stats.getCollectionFetchCount() );
+		Continent europe2 = (Continent) s.get( Continent.class, europe.getId() );
+		assertEquals("Lazy true: no collection should be loaded", 0, stats.getCollectionLoadCount() );
+		assertEquals( 0, stats.getCollectionFetchCount() );
+		europe2.getCountries().size();
+		assertEquals( 1, stats.getCollectionLoadCount() );
+		assertEquals("Explicit fetch of the collection state", 1, stats.getCollectionFetchCount() );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		stats.clear();
+		europe = fillDb(s);
+		tx.commit();
+		s.clear();
+		tx = s.beginTransaction();
+		assertEquals( 0, stats.getCollectionLoadCount() );
+		assertEquals( 0, stats.getCollectionFetchCount() );
+		europe2 = (Continent) s.createQuery(
+				"from " + Continent.class.getName() + " a join fetch a.countries where a.id = " + europe.getId()
+			).uniqueResult();
+		assertEquals( 1, stats.getCollectionLoadCount() );
+		assertEquals( "collection should be loaded in the same query as its parent", 0, stats.getCollectionFetchCount() );
+		tx.commit();
+		s.close();
+
+		Collection coll = getCfg().getCollectionMapping(Continent.class.getName() + ".countries");
+		coll.setFetchMode(FetchMode.JOIN);
+		coll.setLazy(false);
+		SessionFactory sf = getCfg().buildSessionFactory();
+		stats = sf.getStatistics();
+		stats.clear();
+		stats.setStatisticsEnabled(true);
+		s = sf.openSession();
+		tx = s.beginTransaction();
+		europe = fillDb(s);
+		tx.commit();
+		s.clear();
+		tx = s.beginTransaction();
+		assertEquals( 0, stats.getCollectionLoadCount() );
+		assertEquals( 0, stats.getCollectionFetchCount() );
+		europe2 = (Continent) s.get( Continent.class, europe.getId() );
+		assertEquals( 1, stats.getCollectionLoadCount() );
+		assertEquals( "Should do direct load, not indirect second load when lazy false and JOIN", 0, stats.getCollectionFetchCount() );
+		tx.commit();
+		s.close();
+		sf.close();
+
+		coll = getCfg().getCollectionMapping(Continent.class.getName() + ".countries");
+		coll.setFetchMode(FetchMode.SELECT);
+		coll.setLazy(false);
+		sf = getCfg().buildSessionFactory();
+		stats = sf.getStatistics();
+		stats.clear();
+		stats.setStatisticsEnabled(true);
+		s = sf.openSession();
+		tx = s.beginTransaction();
+		europe = fillDb(s);
+		tx.commit();
+		s.clear();
+		tx = s.beginTransaction();
+		assertEquals( 0, stats.getCollectionLoadCount() );
+		assertEquals( 0, stats.getCollectionFetchCount() );
+		europe2 = (Continent) s.get( Continent.class, europe.getId() );
+		assertEquals( 1, stats.getCollectionLoadCount() );
+		assertEquals( "Should do explicit collection load, not part of the first one", 1, stats.getCollectionFetchCount() );
+		Iterator countries = europe2.getCountries().iterator();
+		while ( countries.hasNext() ) {
+			s.delete( countries.next() );
+		}
+		cleanDb( s );
+		tx.commit();
+		s.close();
+	}
+
+	public void testQueryStatGathering() {
+		Statistics stats = getSessions().getStatistics();
+		stats.clear();
+
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		fillDb(s);
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		final String continents = "from Continent";
+		int results = s.createQuery( continents ).list().size();
+		QueryStatistics continentStats = stats.getQueryStatistics( continents );
+		assertNotNull( "stats were null",  continentStats );
+		assertEquals( "unexpected execution count", 1, continentStats.getExecutionCount() );
+		assertEquals( "unexpected row count", results, continentStats.getExecutionRowCount() );
+		long maxTime = continentStats.getExecutionMaxTime();
+		assertEquals( maxTime, stats.getQueryExecutionMaxTime() );
+//		assertEquals( continents, stats.getQueryExecutionMaxTimeQueryString() );
+
+		Iterator itr = s.createQuery( continents ).iterate();
+		// iterate() should increment the execution count
+		assertEquals( "unexpected execution count", 2, continentStats.getExecutionCount() );
+		// but should not effect the cumulative row count
+		assertEquals( "unexpected row count", results, continentStats.getExecutionRowCount() );
+		Hibernate.close( itr );
+
+		ScrollableResults scrollableResults = s.createQuery( continents ).scroll();
+		// same deal with scroll()...
+		assertEquals( "unexpected execution count", 3, continentStats.getExecutionCount() );
+		assertEquals( "unexpected row count", results, continentStats.getExecutionRowCount() );
+		// scroll through data because SybaseASE15Dialect throws NullPointerException
+		// if data is not read before closing the ResultSet
+		while ( scrollableResults.next() ) {
+			// do nothing
+		}
+		scrollableResults.close();
+		tx.commit();
+		s.close();
+
+		// explicitly check that statistics for "split queries" get collected
+		// under the original query
+		stats.clear();
+		s = openSession();
+		tx = s.beginTransaction();
+		final String localities = "from Locality";
+		results = s.createQuery( localities ).list().size();
+		QueryStatistics localityStats = stats.getQueryStatistics( localities );
+		assertNotNull( "stats were null",  localityStats );
+		// ...one for each split query
+		assertEquals( "unexpected execution count", 2, localityStats.getExecutionCount() );
+		assertEquals( "unexpected row count", results, localityStats.getExecutionRowCount() );
+		maxTime = localityStats.getExecutionMaxTime();
+		assertEquals( maxTime, stats.getQueryExecutionMaxTime() );
+//		assertEquals( localities, stats.getQueryExecutionMaxTimeQueryString() );
+		tx.commit();
+		s.close();
+		assertFalse( s.isOpen() );
+
+		// native sql queries
+		stats.clear();
+		s = openSession();
+		tx = s.beginTransaction();
+		final String sql = "select id, name from Country";
+		results = s.createSQLQuery( sql ).addEntity( Country.class ).list().size();
+		QueryStatistics sqlStats = stats.getQueryStatistics( sql );
+		assertNotNull( "sql stats were null", sqlStats );
+		assertEquals( "unexpected execution count", 1, sqlStats.getExecutionCount() );
+		assertEquals( "unexpected row count", results, sqlStats.getExecutionRowCount() );
+		maxTime = sqlStats.getExecutionMaxTime();
+		assertEquals( maxTime, stats.getQueryExecutionMaxTime() );
+//		assertEquals( sql, stats.getQueryExecutionMaxTimeQueryString() );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		cleanDb( s );
+		tx.commit();
+		s.close();
+	}
+
+	private Continent fillDb(Session s) {
+		Continent europe = new Continent();
+		europe.setName("Europe");
+		Country france = new Country();
+		france.setName("France");
+		europe.setCountries( new HashSet() );
+		europe.getCountries().add(france);
+		s.persist(france);
+		s.persist(europe);
+		return europe;
+	}
+
+	private void cleanDb(Session s) {
+		s.createQuery( "delete Locality" ).executeUpdate();
+		s.createQuery( "delete Country" ).executeUpdate();
+		s.createQuery( "delete Continent" ).executeUpdate();
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/stats/StatsTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/Customer.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/Customer.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/Customer.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,26 @@
+// $Id: Customer.java 5899 2005-02-24 20:08:04Z steveebersole $
+package org.hibernate.test.subclassfilter;
+
+/**
+ * Implementation of Customer.
+ *
+ * @author Steve Ebersole
+ */
+public class Customer extends Person {
+	private Employee contactOwner;
+
+	public Customer() {
+	}
+
+	public Customer(String name) {
+		super( name );
+	}
+
+	public Employee getContactOwner() {
+		return contactOwner;
+	}
+
+	public void setContactOwner(Employee contactOwner) {
+		this.contactOwner = contactOwner;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/Customer.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/DiscrimSubclassFilterTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/DiscrimSubclassFilterTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/DiscrimSubclassFilterTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,132 @@
+// $Id: DiscrimSubclassFilterTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.subclassfilter;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.Transaction;
+import org.hibernate.classic.Session;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Implementation of DiscrimSubclassFilterTest.
+ *
+ * @author Steve Ebersole
+ */
+public class DiscrimSubclassFilterTest extends FunctionalTestCase {
+
+	public DiscrimSubclassFilterTest(String name) {
+		super( name );
+	}
+
+	public final String[] getMappings() {
+		return new String[] { "subclassfilter/discrim-subclass.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( DiscrimSubclassFilterTest.class );
+	}
+
+	public void testFiltersWithSubclass() {
+		Session s = openSession();
+		s.enableFilter( "region" ).setParameter( "userRegion", "US" );
+		Transaction t = s.beginTransaction();
+
+		prepareTestData( s );
+		s.clear();
+
+		List results;
+		Iterator itr;
+
+		results = s.createQuery( "from Person" ).list();
+		assertEquals( "Incorrect qry result count", 4, results.size() );
+		s.clear();
+
+		results = s.createQuery( "from Employee" ).list();
+		assertEquals( "Incorrect qry result count", 2, results.size() );
+		s.clear();
+
+		results = new ArrayList( new HashSet( s.createQuery( "from Person as p left join fetch p.minions" ).list() ) );
+		assertEquals( "Incorrect qry result count", 4, results.size() );
+		itr = results.iterator();
+		while ( itr.hasNext() ) {
+			// find john
+			final Person p = ( Person ) itr.next();
+			if ( p.getName().equals( "John Doe" ) ) {
+				Employee john = ( Employee ) p;
+				assertEquals( "Incorrect fecthed minions count", 1, john.getMinions().size() );
+				break;
+			}
+		}
+		s.clear();
+
+		results = new ArrayList( new HashSet( s.createQuery( "from Employee as p left join fetch p.minions" ).list() ) );
+		assertEquals( "Incorrect qry result count", 2, results.size() );
+		itr = results.iterator();
+		while ( itr.hasNext() ) {
+			// find john
+			final Person p = ( Person ) itr.next();
+			if ( p.getName().equals( "John Doe" ) ) {
+				Employee john = ( Employee ) p;
+				assertEquals( "Incorrect fecthed minions count", 1, john.getMinions().size() );
+				break;
+			}
+		}
+
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery( "delete Customer where contactOwner is not null" ).executeUpdate();
+		s.createQuery( "delete Employee where manager is not null" ).executeUpdate();
+		s.createQuery( "delete Person" ).executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	private void prepareTestData(Session s) {
+		Employee john = new Employee("John Doe");
+		john.setCompany( "JBoss" );
+		john.setDepartment( "hr" );
+		john.setTitle( "hr guru" );
+		john.setRegion( "US" );
+
+		Employee polli = new Employee("Polli Wog");
+		polli.setCompany( "JBoss" );
+		polli.setDepartment( "hr" );
+		polli.setTitle( "hr novice" );
+		polli.setRegion( "US" );
+		polli.setManager( john );
+		john.getMinions().add( polli );
+
+		Employee suzie = new Employee( "Suzie Q" );
+		suzie.setCompany( "JBoss" );
+		suzie.setDepartment( "hr" );
+		suzie.setTitle( "hr novice" );
+		suzie.setRegion( "EMEA" );
+		suzie.setManager( john );
+		john.getMinions().add( suzie );
+
+		Customer cust = new Customer( "John Q Public" );
+		cust.setCompany( "Acme" );
+		cust.setRegion( "US" );
+		cust.setContactOwner( john );
+
+		Person ups = new Person( "UPS guy" );
+		ups.setCompany( "UPS" );
+		ups.setRegion( "US" );
+
+		s.save( john );
+		s.save( cust );
+		s.save( ups );
+
+		s.flush();
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/DiscrimSubclassFilterTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/Employee.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/Employee.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/Employee.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,56 @@
+// $Id: Employee.java 5899 2005-02-24 20:08:04Z steveebersole $
+package org.hibernate.test.subclassfilter;
+
+import java.util.Set;
+import java.util.HashSet;
+
+/**
+ * Implementation of Employee.
+ *
+ * @author Steve Ebersole
+ */
+public class Employee extends Person {
+    private String title;
+	private String department;
+	private Employee manager;
+	private Set minions = new HashSet();
+
+	public Employee() {
+	}
+
+	public Employee(String name) {
+		super( name );
+	}
+
+	public String getTitle() {
+		return title;
+	}
+
+	public void setTitle(String title) {
+		this.title = title;
+	}
+
+	public String getDepartment() {
+		return department;
+	}
+
+	public void setDepartment(String department) {
+		this.department = department;
+	}
+
+	public Employee getManager() {
+		return manager;
+	}
+
+	public void setManager(Employee manager) {
+		this.manager = manager;
+	}
+
+	public Set getMinions() {
+		return minions;
+	}
+
+	public void setMinions(Set minions) {
+		this.minions = minions;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/Employee.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/JoinedSubclassFilterTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/JoinedSubclassFilterTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/JoinedSubclassFilterTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,143 @@
+// $Id: JoinedSubclassFilterTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.subclassfilter;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.Transaction;
+import org.hibernate.classic.Session;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Implementation of JoinedSubclassFilterTest.
+ *
+ * @author Steve Ebersole
+ */
+public class JoinedSubclassFilterTest extends FunctionalTestCase {
+
+	public JoinedSubclassFilterTest(String name) {
+		super( name );
+	}
+
+	public final String[] getMappings() {
+		return new String[] { "subclassfilter/joined-subclass.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( JoinedSubclassFilterTest.class );
+	}
+
+	public void testFiltersWithJoinedSubclass() {
+		Session s = openSession();
+		s.enableFilter( "region" ).setParameter( "userRegion", "US" );
+		Transaction t = s.beginTransaction();
+
+		prepareTestData( s );
+		s.clear();
+
+		List results = s.createQuery( "from Person" ).list();
+		assertEquals( "Incorrect qry result count", 4, results.size() );
+		s.clear();
+
+		results = s.createQuery( "from Employee" ).list();
+		assertEquals( "Incorrect qry result count", 2, results.size() );
+		Iterator itr = results.iterator();
+		while ( itr.hasNext() ) {
+			// find john
+			final Person p = ( Person ) itr.next();
+			if ( p.getName().equals( "John Doe" ) ) {
+				Employee john = ( Employee ) p;
+				assertEquals( "Incorrect fecthed minions count", 2, john.getMinions().size() );
+				break;
+			}
+		}
+		s.clear();
+
+		// TODO : currently impossible to define a collection-level filter w/ joined-subclass elements that will filter based on a superclass column and function correctly in (theta only?) outer joins;
+		// this is consistent with the behaviour of a collection-level where.
+		// this might be one argument for "pulling" the attached class-level filters into collection assocations,
+		// although we'd need some way to apply the appropriate alias in that scenario.
+		results = new ArrayList( new HashSet( s.createQuery( "from Person as p left join fetch p.minions" ).list() ) );
+		assertEquals( "Incorrect qry result count", 4, results.size() );
+		itr = results.iterator();
+		while ( itr.hasNext() ) {
+			// find john
+			final Person p = ( Person ) itr.next();
+			if ( p.getName().equals( "John Doe" ) ) {
+				Employee john = ( Employee ) p;
+				assertEquals( "Incorrect fecthed minions count", 2, john.getMinions().size() );
+				break;
+			}
+		}
+		s.clear();
+
+		results = new ArrayList( new HashSet( s.createQuery( "from Employee as p left join fetch p.minions" ).list() ) );
+		assertEquals( "Incorrect qry result count", 2, results.size() );
+		itr = results.iterator();
+		while ( itr.hasNext() ) {
+			// find john
+			final Person p = ( Person ) itr.next();
+			if ( p.getName().equals( "John Doe" ) ) {
+				Employee john = ( Employee ) p;
+				assertEquals( "Incorrect fecthed minions count", 2, john.getMinions().size() );
+				break;
+			}
+		}
+
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery( "delete Customer where contactOwner is not null" ).executeUpdate();
+		s.createQuery( "delete Employee where manager is not null" ).executeUpdate();
+		s.createQuery( "delete Person" ).executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	private void prepareTestData(Session s) {
+		Employee john = new Employee("John Doe");
+		john.setCompany( "JBoss" );
+		john.setDepartment( "hr" );
+		john.setTitle( "hr guru" );
+		john.setRegion( "US" );
+
+		Employee polli = new Employee("Polli Wog");
+		polli.setCompany( "JBoss" );
+		polli.setDepartment( "hr" );
+		polli.setTitle( "hr novice" );
+		polli.setRegion( "US" );
+		polli.setManager( john );
+		john.getMinions().add( polli );
+
+		Employee suzie = new Employee( "Suzie Q" );
+		suzie.setCompany( "JBoss" );
+		suzie.setDepartment( "hr" );
+		suzie.setTitle( "hr novice" );
+		suzie.setRegion( "EMEA" );
+		suzie.setManager( john );
+		john.getMinions().add( suzie );
+
+		Customer cust = new Customer( "John Q Public" );
+		cust.setCompany( "Acme" );
+		cust.setRegion( "US" );
+		cust.setContactOwner( john );
+
+		Person ups = new Person( "UPS guy" );
+		ups.setCompany( "UPS" );
+		ups.setRegion( "US" );
+
+		s.save( john );
+		s.save( cust );
+		s.save( ups );
+
+		s.flush();
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/JoinedSubclassFilterTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,53 @@
+// $Id: Person.java 5899 2005-02-24 20:08:04Z steveebersole $
+package org.hibernate.test.subclassfilter;
+
+/**
+ * Implementation of Person.
+ *
+ * @author Steve Ebersole
+ */
+public class Person {
+	private Long id;
+	private String name;
+	private String company;
+	private String region;
+
+	public Person() {
+	}
+
+	public Person(String name) {
+		this.name = name;
+	}
+
+	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 String getCompany() {
+		return company;
+	}
+
+	public void setCompany(String company) {
+		this.company = company;
+	}
+
+	public String getRegion() {
+		return region;
+	}
+
+	public void setRegion(String region) {
+		this.region = region;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/Person.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/UnionSubclassFilterTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/UnionSubclassFilterTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/UnionSubclassFilterTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,130 @@
+// $Id: UnionSubclassFilterTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.subclassfilter;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.Transaction;
+import org.hibernate.classic.Session;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Implementation of DiscrimSubclassFilterTest.
+ *
+ * @author Steve Ebersole
+ */
+public class UnionSubclassFilterTest extends FunctionalTestCase {
+
+	public UnionSubclassFilterTest(String name) {
+		super( name );
+	}
+
+	public final String[] getMappings() {
+		return new String[] { "subclassfilter/union-subclass.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( UnionSubclassFilterTest.class );
+	}
+
+	public void testFiltersWithUnionSubclass() {
+		Session s = openSession();
+		s.enableFilter( "region" ).setParameter( "userRegion", "US" );
+		Transaction t = s.beginTransaction();
+
+		prepareTestData( s );
+		s.clear();
+
+		List results;
+		Iterator itr;
+
+		results = s.createQuery( "from Person" ).list();
+		assertEquals( "Incorrect qry result count", 4, results.size() );
+		s.clear();
+
+		results = s.createQuery( "from Employee" ).list();
+		assertEquals( "Incorrect qry result count", 2, results.size() );
+		s.clear();
+
+		results = new ArrayList( new HashSet( s.createQuery( "from Person as p left join fetch p.minions" ).list() ) );
+		assertEquals( "Incorrect qry result count", 4, results.size() );
+		itr = results.iterator();
+		while ( itr.hasNext() ) {
+			// find john
+			final Person p = ( Person ) itr.next();
+			if ( p.getName().equals( "John Doe" ) ) {
+				Employee john = ( Employee ) p;
+				assertEquals( "Incorrect fecthed minions count", 1, john.getMinions().size() );
+				break;
+			}
+		}
+		s.clear();
+
+		results = new ArrayList( new HashSet( s.createQuery( "from Employee as p left join fetch p.minions" ).list() ) );
+		assertEquals( "Incorrect qry result count", 2, results.size() );
+		itr = results.iterator();
+		while ( itr.hasNext() ) {
+			// find john
+			final Person p = ( Person ) itr.next();
+			if ( p.getName().equals( "John Doe" ) ) {
+				Employee john = ( Employee ) p;
+				assertEquals( "Incorrect fecthed minions count", 1, john.getMinions().size() );
+				break;
+			}
+		}
+
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete( "from Person" );
+		t.commit();
+		s.close();
+
+	}
+
+	private void prepareTestData(Session s) {
+		Employee john = new Employee( "John Doe" );
+		john.setCompany( "JBoss" );
+		john.setDepartment( "hr" );
+		john.setTitle( "hr guru" );
+		john.setRegion( "US" );
+
+		Employee polli = new Employee( "Polli Wog" );
+		polli.setCompany( "JBoss" );
+		polli.setDepartment( "hr" );
+		polli.setTitle( "hr novice" );
+		polli.setRegion( "US" );
+		polli.setManager( john );
+		john.getMinions().add( polli );
+
+		Employee suzie = new Employee( "Suzie Q" );
+		suzie.setCompany( "JBoss" );
+		suzie.setDepartment( "hr" );
+		suzie.setTitle( "hr novice" );
+		suzie.setRegion( "EMEA" );
+		suzie.setManager( john );
+		john.getMinions().add( suzie );
+
+		Customer cust = new Customer( "John Q Public" );
+		cust.setCompany( "Acme" );
+		cust.setRegion( "US" );
+		cust.setContactOwner( john );
+
+		Person ups = new Person( "UPS guy" );
+		ups.setCompany( "UPS" );
+		ups.setRegion( "US" );
+
+		s.save( john );
+		s.save( cust );
+		s.save( ups );
+
+		s.flush();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/UnionSubclassFilterTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/discrim-subclass.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/discrim-subclass.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/discrim-subclass.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,44 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.subclassfilter">
+
+	<class name="Person" discriminator-value="0" table="SPerson">
+
+		<id name="id" column="person_id">
+			<generator class="native"/>
+		</id>
+
+		<discriminator type="int"
+			formula="CASE WHEN company is null THEN 0 WHEN company = 'JBoss' THEN 1 ELSE 2 END"/>
+
+		<property name="name"/>
+		<property name="company"/>
+		<property name="region"/>
+
+		<subclass name="Employee" discriminator-value="1">
+			<property name="title"/>
+			<property name="department" column="dept"/>
+			<many-to-one name="manager" column="mgr_id" class="Employee" cascade="none"/>
+			<set name="minions" inverse="true" lazy="true" cascade="all">
+				<key column="mgr_id"/>
+				<one-to-many class="Employee"/>
+				<filter name="region" condition="region = :userRegion"/>
+			</set>
+		</subclass>
+
+		<subclass name="Customer" discriminator-value="2">
+			<many-to-one name="contactOwner" class="Employee"/>
+		</subclass>
+
+		<filter name="region" condition="region = :userRegion"/>
+
+	</class>
+
+	<filter-def name="region">
+		<filter-param name="userRegion" type="string"/>
+    </filter-def>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/discrim-subclass.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/joined-subclass.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/joined-subclass.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/joined-subclass.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,43 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.subclassfilter">
+
+	<class name="Person" table="JPerson">
+
+		<id name="id" column="person_id">
+			<generator class="native"/>
+		</id>
+
+		<property name="name"/>
+		<property name="company"/>
+		<property name="region"/>
+
+		<joined-subclass name="Employee" table="JEmployee">
+			<key column="person_id"/>
+
+			<property name="title"/>
+			<property name="department" column="dept"/>
+			<many-to-one name="manager" class="Employee" column="mgr_id" cascade="none"/>
+			<set name="minions" inverse="true" cascade="all" lazy="true">
+				<key column="mgr_id"/>
+				<one-to-many class="Employee"/>
+			</set>
+        </joined-subclass>
+
+		<joined-subclass name="Customer" table="JCustomer">
+			<key column="person_id"/>
+
+			<many-to-one name="contactOwner" class="Employee"/>
+		</joined-subclass>
+
+		<filter name="region" condition="region = :userRegion"/>
+	</class>
+
+	<filter-def name="region">
+		<filter-param name="userRegion" type="string"/>
+    </filter-def>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/joined-subclass.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/union-subclass.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/union-subclass.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/union-subclass.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,41 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.subclassfilter">
+
+	<class name="Person" table="UPerson">
+
+		<id name="id" column="person_id">
+			<generator class="hilo"/>
+		</id>
+
+		<property name="name" unique="true"/>
+		<property name="company"/>
+		<property name="region"/>
+
+		<union-subclass name="Employee" table="UEmployee">
+			<property name="title"/>
+			<property name="department" column="dept"/>
+			<many-to-one name="manager" column="mgr_id" class="Employee" cascade="none"/>
+			<set name="minions" inverse="true" lazy="true" cascade="all">
+				<key column="mgr_id"/>
+				<one-to-many class="Employee"/>
+				<filter name="region" condition="region = :userRegion"/>
+			</set>
+		</union-subclass>
+
+		<union-subclass name="Customer" table="UCustomer">
+			<many-to-one name="contactOwner" class="Employee"/>
+		</union-subclass>
+
+		<filter name="region" condition="region = :userRegion"/>
+
+	</class>
+
+	<filter-def name="region">
+		<filter-param name="userRegion" type="string"/>
+    </filter-def>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subclassfilter/union-subclass.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselect/Alien.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselect/Alien.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselect/Alien.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,44 @@
+//$Id: Alien.java 7203 2005-06-19 02:01:05Z oneovthafew $
+package org.hibernate.test.subselect;
+
+/**
+ * @author Gavin King
+ */
+public class Alien {
+	private Long id;
+	private String identity;
+	private String planet;
+	private String species;
+	private double heightInches;
+	
+	public void setIdentity(String identity) {
+		this.identity = identity;
+	}
+	public String getIdentity() {
+		return identity;
+	}
+	public void setSpecies(String species) {
+		this.species = species;
+	}
+	public String getSpecies() {
+		return species;
+	}
+	public void setPlanet(String planet) {
+		this.planet = planet;
+	}
+	public String getPlanet() {
+		return planet;
+	}
+	public double getHeightInches() {
+		return heightInches;
+	}
+	public void setHeightInches(double heightInches) {
+		this.heightInches = heightInches;
+	}
+	public void setId(Long id) {
+		this.id = id;
+	}
+	public Long getId() {
+		return id;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselect/Alien.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselect/Being.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselect/Being.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselect/Being.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,38 @@
+//$Id: Being.java 7203 2005-06-19 02:01:05Z oneovthafew $
+package org.hibernate.test.subselect;
+
+/**
+ * @author Gavin King
+ */
+public class Being {
+	private long id;
+	private String identity;
+	private String location;
+	private String species;
+	private double heightInches;	
+	
+	public void setLocation(String location) {
+		this.location = location;
+	}
+	public String getLocation() {
+		return location;
+	}
+	public void setSpecies(String species) {
+		this.species = species;
+	}
+	public String getSpecies() {
+		return species;
+	}
+	public void setIdentity(String identity) {
+		this.identity = identity;
+	}
+	public String getIdentity() {
+		return identity;
+	}
+	public double getHeightInches() {
+		return heightInches;
+	}
+	public void setHeightInches(double heightInches) {
+		this.heightInches = heightInches;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselect/Being.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselect/Beings.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselect/Beings.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselect/Beings.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,100 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+  This mapping demonstrates 
+
+     (1) use of a class-to-subselect mapping, that allows data
+         defined in other classes to be exposed as a read-only
+         entity (you would do this if you really wanted a view,
+         but didn't or couldn't define one for some reason)
+         This is a "derived entity" mapping.
+     
+     (2) use of <synchronize/> to ensure that auto-flush happens
+         correctly, and that queries against the derived entity
+         do not return stale data
+     
+-->
+
+<hibernate-mapping 
+	package="org.hibernate.test.subselect"
+	default-access="field">
+	
+	<class name="Human" table="humans">
+		
+		<id name="id" unsaved-value="0" 
+		        column="bid">
+			<generator class="hilo"/>
+		</id>
+		
+		<property name="name" 
+			not-null="true"/>
+		<property name="sex" 
+			not-null="true" 
+			update="false"/>
+		<property name="address"/>
+		<property name="heightInches">
+			<column name="height_centimeters" 
+				not-null="true" 
+				read="height_centimeters / 2.54" 
+				write="? * 2.54"/>
+		</property>		
+		
+	</class>
+	
+	<class name="Alien" table="aliens">
+		
+		<id name="id" unsaved-value="0" 
+		        column="bid">
+			<generator class="hilo"/>
+		</id>
+		
+		<property name="identity" 
+			not-null="true"
+			column="ident"/>
+		<property name="planet"/>
+		<property name="species" 
+			not-null="true" 
+			update="false"/>
+		<property name="heightInches">
+			<column name="height_centimeters" 
+				not-null="true" 
+				read="height_centimeters / 2.54" 
+				write="? * 2.54"/>
+		</property>			
+			
+	</class>
+	
+	<class name="Being" mutable="false">
+	
+		<subselect>
+			select bid, name as ident, address as loc, 'human' as species, height_centimeters
+			from humans 
+			union 
+			select bid, ident, planet as loc, species, height_centimeters
+			from aliens
+		</subselect>
+		
+		<synchronize table="humans"/>
+		<synchronize table="aliens"/>
+		
+		<id name="id" unsaved-value="0" 
+		        column="bid">
+			<generator class="native"/>
+		</id>
+		
+		<property name="identity" column="ident"/>
+		<property name="location" column="loc"/>
+		<property name="species"/>
+		<property name="heightInches">
+			<column name="height_centimeters" 
+				not-null="true" 
+				read="height_centimeters / 2.54"/>
+		</property>		
+		
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselect/Beings.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselect/Human.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselect/Human.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselect/Human.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,44 @@
+//$Id: Human.java 7203 2005-06-19 02:01:05Z oneovthafew $
+package org.hibernate.test.subselect;
+
+/**
+ * @author Gavin King
+ */
+public class Human {
+	private Long id;
+	private String name;
+	private char sex;
+	private String address;
+	private double heightInches;
+	
+	public void setAddress(String address) {
+		this.address = address;
+	}
+	public String getAddress() {
+		return address;
+	}
+	public void setSex(char sex) {
+		this.sex = sex;
+	}
+	public char getSex() {
+		return sex;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setId(Long id) {
+		this.id = id;
+	}
+	public Long getId() {
+		return id;
+	}
+	public double getHeightInches() {
+		return heightInches;
+	}
+	public void setHeightInches(double heightInches) {
+		this.heightInches = heightInches;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselect/Human.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselect/SubselectTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselect/SubselectTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselect/SubselectTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,124 @@
+//$Id: SubselectTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.subselect;
+
+import java.util.Iterator;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class SubselectTest extends FunctionalTestCase {
+	
+	public SubselectTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "subselect/Beings.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( SubselectTest.class );
+	}
+	
+	public void testEntitySubselect() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Human gavin = new Human();
+		gavin.setName( "gavin" );
+		gavin.setSex( 'M' );
+		gavin.setAddress( "Melbourne, Australia" );
+		Alien x23y4 = new Alien();
+		x23y4.setIdentity( "x23y4$$hu%3" );
+		x23y4.setPlanet( "Mars" );
+		x23y4.setSpecies( "martian" );
+		s.save(gavin);
+		s.save(x23y4);
+		s.flush();
+		List beings = s.createQuery("from Being").list();
+		for ( Iterator iter = beings.iterator(); iter.hasNext(); ) {
+			Being b = (Being) iter.next();
+			assertNotNull( b.getLocation() );
+			assertNotNull( b.getIdentity() );
+			assertNotNull( b.getSpecies() );
+		}
+		s.clear();
+		getSessions().evict(Being.class);
+		Being gav = (Being) s.get(Being.class, gavin.getId());
+		assertEquals( gav.getLocation(), gavin.getAddress() );
+		assertEquals( gav.getSpecies(), "human" );
+		assertEquals( gav.getIdentity(), gavin.getName() );
+		s.clear();
+		//test the <synchronized> tag:
+		gavin = (Human) s.get(Human.class, gavin.getId());
+		gavin.setAddress( "Atlanta, GA" );
+		gav = (Being) s.createQuery("from Being b where b.location like '%GA%'").uniqueResult();
+		assertEquals( gav.getLocation(), gavin.getAddress() );
+		s.delete(gavin);
+		s.delete(x23y4);
+		assertTrue( s.createQuery("from Being").list().isEmpty() );
+		t.commit();
+		s.close();
+	}
+	
+	public void testCustomColumnReadAndWrite() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		final double HUMAN_INCHES = 73;
+		final double ALIEN_INCHES = 931;
+		final double HUMAN_CENTIMETERS = HUMAN_INCHES * 2.54d;		
+		final double ALIEN_CENTIMETERS = ALIEN_INCHES * 2.54d;		
+		Human gavin = new Human();
+		gavin.setName( "gavin" );
+		gavin.setSex( 'M' );
+		gavin.setAddress( "Melbourne, Australia" );
+		gavin.setHeightInches( HUMAN_INCHES );
+		Alien x23y4 = new Alien();
+		x23y4.setIdentity( "x23y4$$hu%3" );
+		x23y4.setPlanet( "Mars" );
+		x23y4.setSpecies( "martian" );
+		x23y4.setHeightInches( ALIEN_INCHES );
+		s.save(gavin);
+		s.save(x23y4);
+		s.flush();
+		
+		// Test value conversion during insert
+		Double humanHeightViaSql = (Double)s.createSQLQuery("select height_centimeters from humans").uniqueResult();
+		assertEquals(HUMAN_CENTIMETERS, humanHeightViaSql, 0.01d);
+		Double alienHeightViaSql = (Double)s.createSQLQuery("select height_centimeters from aliens").uniqueResult();
+		assertEquals(ALIEN_CENTIMETERS, alienHeightViaSql, 0.01d);
+		s.clear();
+		
+		// Test projection
+		Double heightViaHql = (Double)s.createQuery("select heightInches from Being b where b.identity = 'gavin'").uniqueResult();
+		assertEquals(HUMAN_INCHES, heightViaHql, 0.01d);
+		
+		// Test restriction and entity load via criteria
+		Being b = (Being)s.createCriteria(Being.class)
+			.add(Restrictions.between("heightInches", HUMAN_INCHES - 0.01d, HUMAN_INCHES + 0.01d))
+			.uniqueResult();
+		assertEquals(HUMAN_INCHES, b.getHeightInches(), 0.01d);
+		
+		// Test predicate and entity load via HQL
+		b = (Being)s.createQuery("from Being b where b.heightInches between ? and ?")
+			.setDouble(0, ALIEN_INCHES - 0.01d)
+			.setDouble(1, ALIEN_INCHES + 0.01d)
+			.uniqueResult();
+		assertEquals(ALIEN_INCHES, b.getHeightInches(), 0.01d);
+                s.delete(gavin);
+                s.delete(x23y4);		
+		t.commit();
+		s.close();
+		
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselect/SubselectTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselectfetch/Child.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselectfetch/Child.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselectfetch/Child.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,34 @@
+//$Id: Child.java 6095 2005-03-17 05:57:29Z oneovthafew $
+package org.hibernate.test.subselectfetch;
+
+import java.util.List;
+
+/**
+ * @author Gavin King
+ */
+public class Child {
+	private String name;
+	private List friends;
+
+	Child() {}
+	public Child(String name) {
+		this.name = name;
+	}
+
+	public String getName() {
+		return name;
+	}
+	
+	public void setName(String name) {
+		this.name = name;
+	}
+	public List getFriends() {
+		return friends;
+	}
+	
+	public void setFriends(List friends) {
+		this.friends = friends;
+	}
+	
+	
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselectfetch/Child.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselectfetch/Parent.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselectfetch/Parent.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselectfetch/Parent.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,45 @@
+//$Id: Parent.java 6095 2005-03-17 05:57:29Z oneovthafew $
+package org.hibernate.test.subselectfetch;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Gavin King
+ */
+public class Parent {
+	private String name;
+	private List children = new ArrayList();
+	private List moreChildren = new ArrayList();
+	
+	Parent() {}
+	public Parent(String name) {
+		this.name = name;
+	}
+
+	public String getName() {
+		return name;
+	}
+	
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public List getChildren() {
+		return children;
+	}
+
+	public void setChildren(List children) {
+		this.children = children;
+	}
+	
+	public List getMoreChildren() {
+		return moreChildren;
+	}
+	
+	public void setMoreChildren(List moreChildren) {
+		this.moreChildren = moreChildren;
+	}
+	
+	
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselectfetch/Parent.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselectfetch/ParentChild.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselectfetch/ParentChild.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselectfetch/ParentChild.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping 
+	package="org.hibernate.test.subselectfetch">
+	
+	<class name="Child">
+		<id name="name"/>
+		<bag name="friends" fetch="subselect" table="ChildChild">
+			<key column="childName1" not-null="true"/>
+			<many-to-many class="Child" column="childName2"/>
+		</bag>
+	</class>
+	
+	<class name="Parent">
+		<id name="name"/>
+		<list name="children" fetch="subselect" cascade="persist, delete">
+			<key column="parentName" not-null="true"/>
+			<list-index column="loc"/>
+			<one-to-many class="Child"/>
+		</list>
+		<list name="moreChildren" table="ParentChild" fetch="subselect">
+			<key column="parentName" not-null="true"/>
+			<list-index column="loc"/>
+			<many-to-many class="Child" column="childName"/>
+		</list>
+	</class>
+		
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselectfetch/ParentChild.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselectfetch/SubselectFetchTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselectfetch/SubselectFetchTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselectfetch/SubselectFetchTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,384 @@
+//$Id: SubselectFetchTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.subselectfetch;
+
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.FetchMode;
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.criterion.Order;
+import org.hibernate.criterion.Property;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class SubselectFetchTest extends FunctionalTestCase {
+
+	public SubselectFetchTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "subselectfetch/ParentChild.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setProperty(Environment.GENERATE_STATISTICS, "true");
+	}
+
+	public String getCacheConcurrencyStrategy() {
+		return null;
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( SubselectFetchTest.class );
+	}
+	
+	public void testSubselectFetchHql() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Parent p = new Parent("foo");
+		p.getChildren().add( new Child("foo1") );
+		p.getChildren().add( new Child("foo2") );
+		Parent q = new Parent("bar");
+		q.getChildren().add( new Child("bar1") );
+		q.getChildren().add( new Child("bar2") );
+		q.getMoreChildren().addAll( p.getChildren() );
+		s.persist(p); 
+		s.persist(q);
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		
+		getSessions().getStatistics().clear();
+		
+		List parents = s.createQuery("from Parent where name between 'bar' and 'foo' order by name desc")
+			.list();
+		p = (Parent) parents.get(0);
+		q = (Parent) parents.get(1);
+
+		assertFalse( Hibernate.isInitialized( p.getChildren() ) );
+		assertFalse( Hibernate.isInitialized( q.getChildren() ) );
+
+		assertEquals( p.getChildren().size(), 2 );
+		
+		assertTrue( Hibernate.isInitialized( p.getChildren().iterator().next() ) );
+				
+		assertTrue( Hibernate.isInitialized( q.getChildren() ) );
+		
+		assertEquals( q.getChildren().size(), 2 );
+		
+		assertTrue( Hibernate.isInitialized( q.getChildren().iterator().next() ) );
+		
+		assertFalse( Hibernate.isInitialized( p.getMoreChildren() ) );
+		assertFalse( Hibernate.isInitialized( q.getMoreChildren() ) );
+
+		assertEquals( p.getMoreChildren().size(), 0 );
+		
+		assertTrue( Hibernate.isInitialized( q.getMoreChildren() ) );
+	
+		assertEquals( q.getMoreChildren().size(), 2 );
+		
+		assertTrue( Hibernate.isInitialized( q.getMoreChildren().iterator().next() ) );
+		
+		assertEquals( 3, getSessions().getStatistics().getPrepareStatementCount() );
+
+		Child c = (Child) p.getChildren().get(0);
+		c.getFriends().size();
+
+		s.delete(p);
+		s.delete(q);		
+
+		t.commit();
+		s.close();
+	}
+	
+	public void testSubselectFetchNamedParam() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Parent p = new Parent("foo");
+		p.getChildren().add( new Child("foo1") );
+		p.getChildren().add( new Child("foo2") );
+		Parent q = new Parent("bar");
+		q.getChildren().add( new Child("bar1") );
+		q.getChildren().add( new Child("bar2") );
+		q.getMoreChildren().addAll( p.getChildren() );
+		s.persist(p); 
+		s.persist(q);
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		
+		getSessions().getStatistics().clear();
+		
+		List parents = s.createQuery("from Parent where name between :bar and :foo order by name desc")
+			.setParameter("bar", "bar")
+			.setParameter("foo", "foo")
+			.list();
+		p = (Parent) parents.get(0);
+		q = (Parent) parents.get(1);
+
+		assertFalse( Hibernate.isInitialized( p.getChildren() ) );
+		assertFalse( Hibernate.isInitialized( q.getChildren() ) );
+
+		assertEquals( p.getChildren().size(), 2 );
+		
+		assertTrue( Hibernate.isInitialized( p.getChildren().iterator().next() ) );
+				
+		assertTrue( Hibernate.isInitialized( q.getChildren() ) );
+		
+		assertEquals( q.getChildren().size(), 2 );
+		
+		assertTrue( Hibernate.isInitialized( q.getChildren().iterator().next() ) );
+		
+		assertFalse( Hibernate.isInitialized( p.getMoreChildren() ) );
+		assertFalse( Hibernate.isInitialized( q.getMoreChildren() ) );
+
+		assertEquals( p.getMoreChildren().size(), 0 );
+		
+		assertTrue( Hibernate.isInitialized( q.getMoreChildren() ) );
+	
+		assertEquals( q.getMoreChildren().size(), 2 );
+		
+		assertTrue( Hibernate.isInitialized( q.getMoreChildren().iterator().next() ) );
+		
+		assertEquals( 3, getSessions().getStatistics().getPrepareStatementCount() );
+
+		Child c = (Child) p.getChildren().get(0);
+		c.getFriends().size();
+
+		s.delete(p);
+		s.delete(q);		
+
+		t.commit();
+		s.close();
+	}
+	
+	public void testSubselectFetchPosParam() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Parent p = new Parent("foo");
+		p.getChildren().add( new Child("foo1") );
+		p.getChildren().add( new Child("foo2") );
+		Parent q = new Parent("bar");
+		q.getChildren().add( new Child("bar1") );
+		q.getChildren().add( new Child("bar2") );
+		q.getMoreChildren().addAll( p.getChildren() );
+		s.persist(p); 
+		s.persist(q);
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		
+		getSessions().getStatistics().clear();
+		
+		List parents = s.createQuery("from Parent where name between ? and ? order by name desc")
+			.setParameter(0, "bar")
+			.setParameter(1, "foo")
+			.list();
+		p = (Parent) parents.get(0);
+		q = (Parent) parents.get(1);
+
+		assertFalse( Hibernate.isInitialized( p.getChildren() ) );
+		assertFalse( Hibernate.isInitialized( q.getChildren() ) );
+
+		assertEquals( p.getChildren().size(), 2 );
+		
+		assertTrue( Hibernate.isInitialized( p.getChildren().iterator().next() ) );
+				
+		assertTrue( Hibernate.isInitialized( q.getChildren() ) );
+		
+		assertEquals( q.getChildren().size(), 2 );
+		
+		assertTrue( Hibernate.isInitialized( q.getChildren().iterator().next() ) );
+		
+		assertFalse( Hibernate.isInitialized( p.getMoreChildren() ) );
+		assertFalse( Hibernate.isInitialized( q.getMoreChildren() ) );
+
+		assertEquals( p.getMoreChildren().size(), 0 );
+		
+		assertTrue( Hibernate.isInitialized( q.getMoreChildren() ) );
+	
+		assertEquals( q.getMoreChildren().size(), 2 );
+		
+		assertTrue( Hibernate.isInitialized( q.getMoreChildren().iterator().next() ) );
+		
+		assertEquals( 3, getSessions().getStatistics().getPrepareStatementCount() );
+
+		Child c = (Child) p.getChildren().get(0);
+		c.getFriends().size();
+
+		s.delete(p);
+		s.delete(q);		
+
+		t.commit();
+		s.close();
+	}
+	
+	public void testSubselectFetchWithLimit() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Parent p = new Parent("foo");
+		p.getChildren().add( new Child("foo1") );
+		p.getChildren().add( new Child("foo2") );
+		Parent q = new Parent("bar");
+		q.getChildren().add( new Child("bar1") );
+		q.getChildren().add( new Child("bar2") );
+		Parent r = new Parent("aaa");
+		r.getChildren().add( new Child("aaa1") );
+		s.persist(p); 
+		s.persist(q);
+		s.persist(r);
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		
+		getSessions().getStatistics().clear();
+		
+		List parents = s.createQuery("from Parent order by name desc")
+			.setMaxResults(2)
+			.list();
+		p = (Parent) parents.get(0);
+		q = (Parent) parents.get(1);
+		assertFalse( Hibernate.isInitialized( p.getChildren() ) );
+		assertFalse( Hibernate.isInitialized( p.getMoreChildren() ) );
+		assertFalse( Hibernate.isInitialized( q.getChildren() ) );
+		assertFalse( Hibernate.isInitialized( q.getMoreChildren() ) );
+		assertEquals( p.getMoreChildren().size(), 0 );
+		assertEquals( p.getChildren().size(), 2 );
+		assertTrue( Hibernate.isInitialized( q.getChildren() ) );
+		assertTrue( Hibernate.isInitialized( q.getMoreChildren() ) );
+		
+		assertEquals( 3, getSessions().getStatistics().getPrepareStatementCount() );
+		
+		r = (Parent) s.get( Parent.class, r.getName() );
+		assertTrue( Hibernate.isInitialized( r.getChildren() ) );
+		assertFalse( Hibernate.isInitialized( r.getMoreChildren() ) );
+		assertEquals( r.getChildren().size(), 1 );
+		assertEquals( r.getMoreChildren().size(), 0 );
+
+		s.delete(p);
+		s.delete(q);		
+		s.delete(r);
+		
+		t.commit();
+		s.close();
+	}
+	
+	public void testManyToManyCriteriaJoin() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Parent p = new Parent("foo");
+		p.getChildren().add( new Child("foo1") );
+		p.getChildren().add( new Child("foo2") );
+		Parent q = new Parent("bar");
+		q.getChildren().add( new Child("bar1") );
+		q.getChildren().add( new Child("bar2") );
+		q.getMoreChildren().addAll( p.getChildren() );
+		s.persist(p); 
+		s.persist(q);
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		
+		List parents = s.createCriteria(Parent.class)
+			.createCriteria("moreChildren")
+			.createCriteria("friends")
+			.addOrder( Order.desc("name") )
+			.list();
+
+		parents = s.createCriteria(Parent.class)
+			.setFetchMode("moreChildren", FetchMode.JOIN)
+			.setFetchMode("moreChildren.friends", FetchMode.JOIN)
+			.addOrder( Order.desc("name") )
+			.list();
+
+		s.delete( parents.get(0) );
+		s.delete( parents.get(1) );
+
+		t.commit();
+		s.close();
+	}
+	
+	public void testSubselectFetchCriteria() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Parent p = new Parent("foo");
+		p.getChildren().add( new Child("foo1") );
+		p.getChildren().add( new Child("foo2") );
+		Parent q = new Parent("bar");
+		q.getChildren().add( new Child("bar1") );
+		q.getChildren().add( new Child("bar2") );
+		q.getMoreChildren().addAll( p.getChildren() );
+		s.persist(p); 
+		s.persist(q);
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		
+		getSessions().getStatistics().clear();
+		
+		List parents = s.createCriteria(Parent.class)
+			.add( Property.forName("name").between("bar", "foo") )
+			.addOrder( Order.desc("name") )
+			.list();
+		p = (Parent) parents.get(0);
+		q = (Parent) parents.get(1);
+
+		assertFalse( Hibernate.isInitialized( p.getChildren() ) );
+		assertFalse( Hibernate.isInitialized( q.getChildren() ) );
+
+		assertEquals( p.getChildren().size(), 2 );
+				
+		assertTrue( Hibernate.isInitialized( p.getChildren().iterator().next() ) );
+		
+		assertTrue( Hibernate.isInitialized( q.getChildren() ) );
+		
+		assertEquals( q.getChildren().size(), 2 );
+		
+		assertTrue( Hibernate.isInitialized( q.getChildren().iterator().next() ) );
+		
+		assertFalse( Hibernate.isInitialized( p.getMoreChildren() ) );
+		assertFalse( Hibernate.isInitialized( q.getMoreChildren() ) );
+
+		assertEquals( p.getMoreChildren().size(), 0 );
+		
+		assertTrue( Hibernate.isInitialized( q.getMoreChildren() ) );
+	
+		assertEquals( q.getMoreChildren().size(), 2 );
+		
+		assertTrue( Hibernate.isInitialized( q.getMoreChildren().iterator().next() ) );
+		
+		assertEquals( 3, getSessions().getStatistics().getPrepareStatementCount() );
+
+		Child c = (Child) p.getChildren().get(0);
+		c.getFriends().size();
+
+		s.delete(p);
+		s.delete(q);		
+
+		t.commit();
+		s.close();
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/subselectfetch/SubselectFetchTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ternary/Employee.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ternary/Employee.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ternary/Employee.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,47 @@
+//$Id: Employee.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.ternary;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author Gavin King
+ */
+public class Employee {
+	private String name;
+	private Date hireDate;
+	private Map managerBySite = new HashMap();
+	private Set underlings = new HashSet();
+	
+	Employee() {}
+	public Employee(String name) {
+		this.name=name;
+	}
+	public Map getManagerBySite() {
+		return managerBySite;
+	}
+	public void setManagerBySite(Map managerBySite) {
+		this.managerBySite = managerBySite;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public Set getUnderlings() {
+		return underlings;
+	}
+	public void setUnderlings(Set underlings) {
+		this.underlings = underlings;
+	}
+	public Date getHireDate() {
+		return hireDate;
+	}
+	public void setHireDate(Date hireDate) {
+		this.hireDate = hireDate;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ternary/Employee.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ternary/Site.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ternary/Site.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ternary/Site.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,44 @@
+//$Id: Site.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.ternary;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author Gavin King
+ */
+public class Site {
+	private String name;
+	private String description;
+	private Set employees = new HashSet();
+	private Set managers = new HashSet();
+
+	Site() {}
+	public Site(String name) {
+		this.name=name;
+	}
+	public Set getManagers() {
+		return managers;
+	}
+	public void setManagers(Set managers) {
+		this.managers = managers;
+	}
+	public String getDescription() {
+		return description;
+	}
+	public void setDescription(String description) {
+		this.description = description;
+	}
+	public Set getEmployees() {
+		return employees;
+	}
+	public void setEmployees(Set employees) {
+		this.employees = employees;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ternary/Site.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ternary/Ternary.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ternary/Ternary.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ternary/Ternary.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping 
+	package="org.hibernate.test.ternary">
+
+	<class name="Employee">
+		<id name="name"/>
+		<property name="hireDate" type="imm_date"/>
+		<map name="managerBySite" table="employeeSite">
+			<key column="employeeName" not-null="true"/>
+			<map-key-many-to-many column="siteName" class="Site"/>
+			<many-to-many column="managerName" class="Employee"/>
+		</map>
+		<set name="underlings" table="employeeSite" inverse="true">
+			<key column="managerName" not-null="true"/>
+			<many-to-many column="employeeName" class="Employee"/>
+		</set>
+	</class>
+	
+	<class name="Site">
+		<id name="name"/>
+		<property name="description"/>
+		<set name="employees" table="employeeSite" inverse="true">
+			<key column="siteName"/>
+			<many-to-many column="employeeName" class="Employee"/>
+		</set>
+		<set name="managers" table="employeeSite" inverse="true">
+			<key column="siteName"/>
+			<many-to-many column="managerName" class="Employee"/>
+		</set>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ternary/Ternary.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ternary/TernaryTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ternary/TernaryTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ternary/TernaryTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,128 @@
+//$Id: TernaryTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.ternary;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class TernaryTest extends FunctionalTestCase {
+	
+	public TernaryTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "ternary/Ternary.hbm.xml" };
+	}
+
+	public String getCacheConcurrencyStrategy() {
+		return null;
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( TernaryTest.class );
+	}
+	
+	public void testTernary() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Employee bob = new Employee("Bob");
+		Employee tom = new Employee("Tom");
+		Employee jim = new Employee("Jim");
+		Employee tim = new Employee("Tim");
+		Site melb = new Site("Melbourne");
+		Site geel = new Site("Geelong");
+		s.persist(bob);
+		s.persist(tom);
+		s.persist(jim);
+		s.persist(tim);
+		s.persist(melb);
+		s.persist(geel);
+		bob.getManagerBySite().put(melb, tom);
+		bob.getManagerBySite().put(geel, jim);
+		tim.getManagerBySite().put(melb, tom);
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		tom = (Employee) s.get(Employee.class, "Tom");
+		assertFalse( Hibernate.isInitialized(tom.getUnderlings()) );
+		assertEquals( tom.getUnderlings().size(), 2 );
+		bob = (Employee) s.get(Employee.class, "Bob");
+		assertFalse( Hibernate.isInitialized(bob.getManagerBySite()) );
+		assertTrue( tom.getUnderlings().contains(bob) );
+		melb = (Site) s.get(Site.class, "Melbourne");
+		assertSame( bob.getManagerBySite().get(melb), tom );
+		assertTrue( melb.getEmployees().contains(bob) );
+		assertTrue( melb.getManagers().contains(tom) );
+		t.commit();
+		s.close();		
+
+		s = openSession();
+		t = s.beginTransaction();
+		List l = s.createQuery("from Employee e join e.managerBySite m where m.name='Bob'").list();
+		assertEquals( l.size(), 0 );
+		l = s.createQuery("from Employee e join e.managerBySite m where m.name='Tom'").list();
+		assertEquals( l.size(), 2 );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		l = s.createQuery("from Employee e left join fetch e.managerBySite").list();
+		assertEquals( l.size(), 5 );
+		Set set = new HashSet(l);
+		assertEquals( set.size(), 4 );
+		Iterator iter = set.iterator();
+		int total=0;
+		while ( iter.hasNext() ) {
+			Map map = ( (Employee) iter.next() ).getManagerBySite();
+			assertTrue( Hibernate.isInitialized(map) );
+			total += map.size();
+		}
+		assertTrue(total==3);
+
+		l = s.createQuery("from Employee e left join e.managerBySite m left join m.managerBySite m2").list();
+
+		// clean up...
+		l = s.createQuery("from Employee e left join fetch e.managerBySite").list();
+		Iterator itr = l.iterator();
+		while ( itr.hasNext() ) {
+			Employee emp = ( Employee ) itr.next();
+			emp.setManagerBySite( new HashMap() );
+			s.delete( emp );
+		}
+		((org.hibernate.classic.Session)s).delete("from Site");
+		t.commit();
+		s.close();
+	}
+
+	public void testIndexRelatedFunctions() {
+		Session session = openSession();
+		session.beginTransaction();
+		session.createQuery( "from Employee e join e.managerBySite as m where index(m) is not null" )
+				.list();
+		session.createQuery( "from Employee e join e.managerBySite as m where minIndex(m) is not null" )
+				.list();
+		session.createQuery( "from Employee e join e.managerBySite as m where maxIndex(m) is not null" )
+				.list();
+		session.getTransaction().commit();
+		session.close();
+	}
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/ternary/TernaryTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/timestamp/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/timestamp/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/timestamp/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,37 @@
+//$Id: Person.java 8054 2005-08-31 20:12:24Z oneovthafew $
+package org.hibernate.test.timestamp;
+
+import java.util.Date;
+
+/**
+ * @author Gavin King
+ */
+public class Person {
+	private String name;
+	private Date dob;
+	private String currentAddress;
+	Person() {}
+	public Person(String name, Date dob, String address) {
+		this.name = name;
+		this.dob = dob;
+		this.currentAddress = address;
+	}
+	public Date getDob() {
+		return dob;
+	}
+	public void setDob(Date dob) {
+		this.dob = dob;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public String getCurrentAddress() {
+		return currentAddress;
+	}
+	public void setCurrentAddress(String currentAddress) {
+		this.currentAddress = currentAddress;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/timestamp/Person.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/timestamp/TimestampTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/timestamp/TimestampTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/timestamp/TimestampTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,91 @@
+//$Id: TimestampTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.timestamp;
+
+import java.util.Date;
+
+import junit.framework.Test;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class TimestampTest extends FunctionalTestCase {
+	
+	public TimestampTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "timestamp/User.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setProperty(Environment.GENERATE_STATISTICS, "true");
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( TimestampTest.class );
+	}
+	
+	public void testUpdateFalse() {
+
+		getSessions().getStatistics().clear();
+		
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		User u = new User( "gavin", "secret", new Person("Gavin King", new Date(), "Karbarook Ave") );
+		s.persist(u);
+		s.flush();
+		u.getPerson().setName("XXXXYYYYY");
+		t.commit();
+		s.close();
+		
+		assertEquals( 1, getSessions().getStatistics().getEntityInsertCount() );
+		assertEquals( 0, getSessions().getStatistics().getEntityUpdateCount() );
+
+		s = openSession();
+		t = s.beginTransaction();
+		u = (User) s.get(User.class, "gavin");
+		assertEquals( u.getPerson().getName(), "Gavin King" );
+		s.delete(u);
+		t.commit();
+		s.close();
+		
+		assertEquals( 1, getSessions().getStatistics().getEntityDeleteCount() );
+	}
+	
+	public void testComponent() {
+		
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		User u = new User( "gavin", "secret", new Person("Gavin King", new Date(), "Karbarook Ave") );
+		s.persist(u);
+		s.flush();
+		u.getPerson().setCurrentAddress("Peachtree Rd");
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		u = (User) s.get(User.class, "gavin");
+		u.setPassword("$ecret");
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		u = (User) s.get(User.class, "gavin");
+		assertEquals( u.getPassword(), "$ecret" );
+		s.delete(u);
+		t.commit();
+		s.close();
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/timestamp/TimestampTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/timestamp/User.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/timestamp/User.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/timestamp/User.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.timestamp">
+	
+	<class name="User" table="T_USER" dynamic-update="true">
+		<id name="userName"/>
+		<timestamp name="lastModified"/>
+		<property name="password" column="`password`" not-null="true" optimistic-lock="false"/>
+		<component name="person">
+			<property name="name" update="false" not-null="true"/>
+			<property name="dob" update="false" not-null="true"/>
+			<property name="currentAddress" 
+				column="address" 
+				insert="false" 
+				update="false"/>
+		</component>
+	</class>
+	
+	<query name="userNameIn"><![CDATA[from User where person.name in (:nameList) or userName in (:nameList)]]></query>
+	
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/timestamp/User.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/timestamp/User.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/timestamp/User.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/timestamp/User.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,44 @@
+//$Id: User.java 8054 2005-08-31 20:12:24Z oneovthafew $
+package org.hibernate.test.timestamp;
+
+import java.util.Date;
+
+/**
+ * @author Gavin King
+ */
+public class User {
+	private String userName;
+	private String password;
+	private Person person;
+	private Date lastModified;
+	User() {}
+	public User(String id, String pw, Person person) {
+		this.userName = id;
+		this.password = pw;
+		this.person = person;
+	}
+	public Date getLastModified() {
+		return lastModified;
+	}
+	public void setLastModified(Date lastModified) {
+		this.lastModified = lastModified;
+	}
+	public String getPassword() {
+		return password;
+	}
+	public void setPassword(String password) {
+		this.password = password;
+	}
+	public Person getPerson() {
+		return person;
+	}
+	public void setPerson(Person person) {
+		this.person = person;
+	}
+	public String getUserName() {
+		return userName;
+	}
+	public void setUserName(String userName) {
+		this.userName = userName;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/timestamp/User.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/tm/CMTTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/tm/CMTTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/tm/CMTTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,515 @@
+//$Id: CMTTest.java 11303 2007-03-19 22:06:14Z steve.ebersole at jboss.com $
+package org.hibernate.test.tm;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import javax.transaction.Transaction;
+
+import junit.framework.Test;
+
+import org.hibernate.ConnectionReleaseMode;
+import org.hibernate.EntityMode;
+import org.hibernate.ScrollableResults;
+import org.hibernate.Session;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.criterion.Order;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.testing.tm.ConnectionProviderImpl;
+import org.hibernate.testing.tm.SimpleJtaTransactionManagerImpl;
+import org.hibernate.testing.tm.TransactionManagerLookupImpl;
+import org.hibernate.transaction.CMTTransactionFactory;
+import org.hibernate.util.SerializationHelper;
+
+/**
+ * @author Gavin King
+ */
+public class CMTTest extends FunctionalTestCase {
+
+	public CMTTest(String str) {
+		super( str );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "tm/Item.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		cfg.setProperty( Environment.CONNECTION_PROVIDER, ConnectionProviderImpl.class.getName() );
+		cfg.setProperty( Environment.TRANSACTION_MANAGER_STRATEGY, TransactionManagerLookupImpl.class.getName() );
+		cfg.setProperty( Environment.TRANSACTION_STRATEGY, CMTTransactionFactory.class.getName() );
+		cfg.setProperty( Environment.AUTO_CLOSE_SESSION, "true" );
+		cfg.setProperty( Environment.FLUSH_BEFORE_COMPLETION, "true" );
+		cfg.setProperty( Environment.RELEASE_CONNECTIONS, ConnectionReleaseMode.AFTER_STATEMENT.toString() );
+		cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
+		cfg.setProperty( Environment.USE_QUERY_CACHE, "true" );
+		cfg.setProperty( Environment.DEFAULT_ENTITY_MODE, EntityMode.MAP.toString() );
+	}
+
+	public String getCacheConcurrencyStrategy() {
+		return "transactional";
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( CMTTest.class );
+	}
+
+	public void testConcurrent() throws Exception {
+		getSessions().getStatistics().clear();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		Map foo = new HashMap();
+		foo.put( "name", "Foo" );
+		foo.put( "description", "a big foo" );
+		s.persist( "Item", foo );
+		Map bar = new HashMap();
+		bar.put( "name", "Bar" );
+		bar.put( "description", "a small bar" );
+		s.persist( "Item", bar );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		getSessions().evictEntity( "Item" );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s1 = openSession();
+		foo = ( Map ) s1.get( "Item", "Foo" );
+		//foo.put("description", "a big red foo");
+		//s1.flush();
+		Transaction tx1 = SimpleJtaTransactionManagerImpl.getInstance().suspend();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s2 = openSession();
+		foo = ( Map ) s2.get( "Item", "Foo" );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		SimpleJtaTransactionManagerImpl.getInstance().resume( tx1 );
+		tx1.commit();
+
+		getSessions().evictEntity( "Item" );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s1 = openSession();
+		s1.createCriteria( "Item" ).list();
+		//foo.put("description", "a big red foo");
+		//s1.flush();
+		tx1 = SimpleJtaTransactionManagerImpl.getInstance().suspend();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s2 = openSession();
+		s2.createCriteria( "Item" ).list();
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		SimpleJtaTransactionManagerImpl.getInstance().resume( tx1 );
+		tx1.commit();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s2 = openSession();
+		s2.createCriteria( "Item" ).list();
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertEquals( getSessions().getStatistics().getEntityLoadCount(), 7 );
+		assertEquals( getSessions().getStatistics().getEntityFetchCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 3 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryCacheMissCount(), 0 );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s.createQuery( "delete from Item" ).executeUpdate();
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+	}
+
+	public void testConcurrentCachedQueries() throws Exception {
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		Map foo = new HashMap();
+		foo.put( "name", "Foo" );
+		foo.put( "description", "a big foo" );
+		s.persist( "Item", foo );
+		Map bar = new HashMap();
+		bar.put( "name", "Bar" );
+		bar.put( "description", "a small bar" );
+		s.persist( "Item", bar );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		synchronized ( this ) {
+			wait( 1000 );
+		}
+
+		getSessions().getStatistics().clear();
+
+		getSessions().evictEntity( "Item" );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s4 = openSession();
+		Transaction tx4 = SimpleJtaTransactionManagerImpl.getInstance().suspend();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s1 = openSession();
+		List r1 = s1.createCriteria( "Item" ).addOrder( Order.asc( "description" ) )
+				.setCacheable( true ).list();
+		assertEquals( r1.size(), 2 );
+		Transaction tx1 = SimpleJtaTransactionManagerImpl.getInstance().suspend();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s2 = openSession();
+		List r2 = s2.createCriteria( "Item" ).addOrder( Order.asc( "description" ) )
+				.setCacheable( true ).list();
+		assertEquals( r2.size(), 2 );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertEquals( getSessions().getStatistics().getSecondLevelCacheHitCount(), 2 );
+		assertEquals( getSessions().getStatistics().getSecondLevelCacheMissCount(), 0 );
+		assertEquals( getSessions().getStatistics().getEntityLoadCount(), 2 );
+		assertEquals( getSessions().getStatistics().getEntityFetchCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 1 );
+		assertEquals( getSessions().getStatistics().getQueryCachePutCount(), 1 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 1 );
+		assertEquals( getSessions().getStatistics().getQueryCacheMissCount(), 1 );
+
+		SimpleJtaTransactionManagerImpl.getInstance().resume( tx1 );
+		tx1.commit();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s3 = openSession();
+		s3.createCriteria( "Item" ).addOrder( Order.asc( "description" ) )
+				.setCacheable( true ).list();
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertEquals( getSessions().getStatistics().getSecondLevelCacheHitCount(), 4 );
+		assertEquals( getSessions().getStatistics().getSecondLevelCacheMissCount(), 0 );
+		assertEquals( getSessions().getStatistics().getEntityLoadCount(), 2 );
+		assertEquals( getSessions().getStatistics().getEntityFetchCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 1 );
+		assertEquals( getSessions().getStatistics().getQueryCachePutCount(), 1 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 2 );
+		assertEquals( getSessions().getStatistics().getQueryCacheMissCount(), 1 );
+
+		SimpleJtaTransactionManagerImpl.getInstance().resume( tx4 );
+		List r4 = s4.createCriteria( "Item" ).addOrder( Order.asc( "description" ) )
+				.setCacheable( true ).list();
+		assertEquals( r4.size(), 2 );
+		tx4.commit();
+
+		assertEquals( getSessions().getStatistics().getSecondLevelCacheHitCount(), 6 );
+		assertEquals( getSessions().getStatistics().getSecondLevelCacheMissCount(), 0 );
+		assertEquals( getSessions().getStatistics().getEntityLoadCount(), 2 );
+		assertEquals( getSessions().getStatistics().getEntityFetchCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 1 );
+		assertEquals( getSessions().getStatistics().getQueryCachePutCount(), 1 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 3 );
+		assertEquals( getSessions().getStatistics().getQueryCacheMissCount(), 1 );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s.createQuery( "delete from Item" ).executeUpdate();
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+	}
+
+	public void testConcurrentCachedDirtyQueries() throws Exception {
+		if ( getDialect().doesReadCommittedCauseWritersToBlockReaders() ) {
+			reportSkip( "write locks block readers", "concurrent queries" );
+			return;
+		}
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		Map foo = new HashMap();
+		foo.put( "name", "Foo" );
+		foo.put( "description", "a big foo" );
+		s.persist( "Item", foo );
+		Map bar = new HashMap();
+		bar.put( "name", "Bar" );
+		bar.put( "description", "a small bar" );
+		s.persist( "Item", bar );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		synchronized ( this ) {
+			wait( 1000 );
+		}
+
+		getSessions().getStatistics().clear();
+
+		getSessions().evictEntity( "Item" );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s4 = openSession();
+		Transaction tx4 = SimpleJtaTransactionManagerImpl.getInstance().suspend();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s1 = openSession();
+		List r1 = s1.createCriteria( "Item" ).addOrder( Order.asc( "description" ) )
+				.setCacheable( true ).list();
+		assertEquals( r1.size(), 2 );
+		foo = ( Map ) r1.get( 0 );
+		foo.put( "description", "a big red foo" );
+		s1.flush();
+		Transaction tx1 = SimpleJtaTransactionManagerImpl.getInstance().suspend();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s2 = openSession();
+		List r2 = s2.createCriteria( "Item" ).addOrder( Order.asc( "description" ) )
+				.setCacheable( true ).list();
+		assertEquals( r2.size(), 2 );
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertEquals( getSessions().getStatistics().getSecondLevelCacheHitCount(), 0 );
+		assertEquals( getSessions().getStatistics().getSecondLevelCacheMissCount(), 0 );
+		assertEquals( getSessions().getStatistics().getEntityLoadCount(), 4 );
+		assertEquals( getSessions().getStatistics().getEntityFetchCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 2 );
+		assertEquals( getSessions().getStatistics().getQueryCachePutCount(), 2 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryCacheMissCount(), 2 );
+
+		SimpleJtaTransactionManagerImpl.getInstance().resume( tx1 );
+		tx1.commit();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s3 = openSession();
+		s3.createCriteria( "Item" ).addOrder( Order.asc( "description" ) )
+				.setCacheable( true ).list();
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+		assertEquals( getSessions().getStatistics().getSecondLevelCacheHitCount(), 0 );
+		assertEquals( getSessions().getStatistics().getSecondLevelCacheMissCount(), 0 );
+		assertEquals( getSessions().getStatistics().getEntityLoadCount(), 6 );
+		assertEquals( getSessions().getStatistics().getEntityFetchCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 3 );
+		assertEquals( getSessions().getStatistics().getQueryCachePutCount(), 3 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryCacheMissCount(), 3 );
+
+		SimpleJtaTransactionManagerImpl.getInstance().resume( tx4 );
+		List r4 = s4.createCriteria( "Item" ).addOrder( Order.asc( "description" ) )
+				.setCacheable( true ).list();
+		assertEquals( r4.size(), 2 );
+		tx4.commit();
+
+		assertEquals( getSessions().getStatistics().getSecondLevelCacheHitCount(), 2 );
+		assertEquals( getSessions().getStatistics().getSecondLevelCacheMissCount(), 0 );
+		assertEquals( getSessions().getStatistics().getEntityLoadCount(), 6 );
+		assertEquals( getSessions().getStatistics().getEntityFetchCount(), 0 );
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 3 );
+		assertEquals( getSessions().getStatistics().getQueryCachePutCount(), 3 );
+		assertEquals( getSessions().getStatistics().getQueryCacheHitCount(), 1 );
+		assertEquals( getSessions().getStatistics().getQueryCacheMissCount(), 3 );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s.createQuery( "delete from Item" ).executeUpdate();
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+	}
+
+	public void testCMT() throws Exception {
+		getSessions().getStatistics().clear();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		SimpleJtaTransactionManagerImpl.getInstance().getTransaction().commit();
+		assertFalse( s.isOpen() );
+
+		assertEquals( getSessions().getStatistics().getFlushCount(), 0 );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		SimpleJtaTransactionManagerImpl.getInstance().getTransaction().rollback();
+		assertFalse( s.isOpen() );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		Map item = new HashMap();
+		item.put( "name", "The Item" );
+		item.put( "description", "The only item we have" );
+		s.persist( "Item", item );
+		SimpleJtaTransactionManagerImpl.getInstance().getTransaction().commit();
+		assertFalse( s.isOpen() );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		item = ( Map ) s.createQuery( "from Item" ).uniqueResult();
+		assertNotNull( item );
+		s.delete( item );
+		SimpleJtaTransactionManagerImpl.getInstance().getTransaction().commit();
+		assertFalse( s.isOpen() );
+
+		assertEquals( getSessions().getStatistics().getTransactionCount(), 4 );
+		assertEquals( getSessions().getStatistics().getSuccessfulTransactionCount(), 3 );
+		assertEquals( getSessions().getStatistics().getEntityDeleteCount(), 1 );
+		assertEquals( getSessions().getStatistics().getEntityInsertCount(), 1 );
+		assertEquals( getSessions().getStatistics().getSessionOpenCount(), 4 );
+		assertEquals( getSessions().getStatistics().getSessionCloseCount(), 4 );
+		assertEquals( getSessions().getStatistics().getQueryExecutionCount(), 1 );
+		assertEquals( getSessions().getStatistics().getFlushCount(), 2 );
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s.createQuery( "delete from Item" ).executeUpdate();
+		SimpleJtaTransactionManagerImpl.getInstance().commit();
+
+	}
+
+	public void testCurrentSession() throws Exception {
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = getSessions().getCurrentSession();
+		Session s2 = getSessions().getCurrentSession();
+		assertSame( s, s2 );
+		SimpleJtaTransactionManagerImpl.getInstance().getTransaction().commit();
+		assertFalse( s.isOpen() );
+
+		// TODO : would be nice to automate-test that the SF internal map actually gets cleaned up
+		//      i verified that is does currently in my debugger...
+	}
+
+	public void testCurrentSessionWithIterate() throws Exception {
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		Map item1 = new HashMap();
+		item1.put( "name", "Item - 1" );
+		item1.put( "description", "The first item" );
+		s.persist( "Item", item1 );
+
+		Map item2 = new HashMap();
+		item2.put( "name", "Item - 2" );
+		item2.put( "description", "The second item" );
+		s.persist( "Item", item2 );
+		SimpleJtaTransactionManagerImpl.getInstance().getTransaction().commit();
+
+		// First, test iterating the partial iterator; iterate to past
+		// the first, but not the second, item
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = getSessions().getCurrentSession();
+		Iterator itr = s.createQuery( "from Item" ).iterate();
+		if ( !itr.hasNext() ) {
+			fail( "No results in iterator" );
+		}
+		itr.next();
+		if ( !itr.hasNext() ) {
+			fail( "Only one result in iterator" );
+		}
+		SimpleJtaTransactionManagerImpl.getInstance().getTransaction().commit();
+
+		// Next, iterate the entire result
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = getSessions().getCurrentSession();
+		itr = s.createQuery( "from Item" ).iterate();
+		if ( !itr.hasNext() ) {
+			fail( "No results in iterator" );
+		}
+		while ( itr.hasNext() ) {
+			itr.next();
+		}
+		SimpleJtaTransactionManagerImpl.getInstance().getTransaction().commit();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = openSession();
+		s.createQuery( "delete from Item" ).executeUpdate();
+		SimpleJtaTransactionManagerImpl.getInstance().getTransaction().commit();
+	}
+
+	public void testCurrentSessionWithScroll() throws Exception {
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = getSessions().getCurrentSession();
+		Map item1 = new HashMap();
+		item1.put( "name", "Item - 1" );
+		item1.put( "description", "The first item" );
+		s.persist( "Item", item1 );
+
+		Map item2 = new HashMap();
+		item2.put( "name", "Item - 2" );
+		item2.put( "description", "The second item" );
+		s.persist( "Item", item2 );
+		SimpleJtaTransactionManagerImpl.getInstance().getTransaction().commit();
+
+		// First, test partially scrolling the result with out closing
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = getSessions().getCurrentSession();
+		ScrollableResults results = s.createQuery( "from Item" ).scroll();
+		results.next();
+		SimpleJtaTransactionManagerImpl.getInstance().getTransaction().commit();
+
+		// Next, test partially scrolling the result with closing
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = getSessions().getCurrentSession();
+		results = s.createQuery( "from Item" ).scroll();
+		results.next();
+		results.close();
+		SimpleJtaTransactionManagerImpl.getInstance().getTransaction().commit();
+
+		// Next, scroll the entire result (w/o closing)
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = getSessions().getCurrentSession();
+		results = s.createQuery( "from Item" ).scroll();
+		while ( results.next() ) {
+			// do nothing
+		}
+		SimpleJtaTransactionManagerImpl.getInstance().getTransaction().commit();
+
+		// Next, scroll the entire result (closing)
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = getSessions().getCurrentSession();
+		results = s.createQuery( "from Item" ).scroll();
+		while ( results.next() ) {
+			// do nothing
+		}
+		results.close();
+		SimpleJtaTransactionManagerImpl.getInstance().getTransaction().commit();
+
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		s = getSessions().getCurrentSession();
+		s.createQuery( "delete from Item" ).executeUpdate();
+		SimpleJtaTransactionManagerImpl.getInstance().getTransaction().commit();
+	}
+
+	public void testAggressiveReleaseWithExplicitDisconnectReconnect() throws Exception {
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = getSessions().getCurrentSession();
+
+		s.createQuery( "from Item" ).list();
+
+		s.disconnect();
+		byte[] bytes = SerializationHelper.serialize( s );
+		s = ( Session ) SerializationHelper.deserialize( bytes );
+		s.reconnect();
+
+		s.createQuery( "from Item" ).list();
+
+		SimpleJtaTransactionManagerImpl.getInstance().getTransaction().commit();
+	}
+
+	public void testAggressiveReleaseWithConnectionRetreival() throws Exception {
+		SimpleJtaTransactionManagerImpl.getInstance().begin();
+		Session s = openSession();
+		Map item1 = new HashMap();
+		item1.put( "name", "Item - 1" );
+		item1.put( "description", "The first item" );
+		s.save( "Item", item1 );
+
+		Map item2 = new HashMap();
+		item2.put( "name", "Item - 2" );
+		item2.put( "description", "The second item" );
+		s.save( "Item", item2 );
+		SimpleJtaTransactionManagerImpl.getInstance().getTransaction().commit();
+
+		try {
+			SimpleJtaTransactionManagerImpl.getInstance().begin();
+			s = getSessions().getCurrentSession();
+			s.createQuery( "from Item" ).scroll().next();
+			s.connection();
+			SimpleJtaTransactionManagerImpl.getInstance().getTransaction().commit();
+		}
+		finally {
+			SimpleJtaTransactionManagerImpl.getInstance().begin();
+			s = openSession();
+			s.createQuery( "delete from Item" ).executeUpdate();
+			SimpleJtaTransactionManagerImpl.getInstance().getTransaction().commit();
+		}
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/tm/CMTTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/tm/Item.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/tm/Item.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/tm/Item.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.tm">
+
+	<class entity-name="Item" table="Things">
+		<id name="name" type="string"/>
+		<property name="description" type="string"/>		
+	</class>
+	
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/tm/Item.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedmanytoone/Address.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedmanytoone/Address.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedmanytoone/Address.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,55 @@
+//$Id: Address.java 6979 2005-06-01 03:51:32Z oneovthafew $
+package org.hibernate.test.typedmanytoone;
+
+import java.io.Serializable;
+
+/**
+ * @author Gavin King
+ */
+public class Address implements Serializable {
+	
+	private AddressId addressId;
+	private String street;
+	private String city;
+	private String state;
+	private String zip;
+	private Customer customer;
+
+	public Customer getCustomer() {
+		return customer;
+	}
+	public void setCustomer(Customer customer) {
+		this.customer = customer;
+	}
+	
+	public String getCity() {
+		return city;
+	}
+	public void setCity(String city) {
+		this.city = city;
+	}
+	public String getState() {
+		return state;
+	}
+	public void setState(String state) {
+		this.state = state;
+	}
+	public String getStreet() {
+		return street;
+	}
+	public void setStreet(String street) {
+		this.street = street;
+	}
+	public String getZip() {
+		return zip;
+	}
+	public void setZip(String zip) {
+		this.zip = zip;
+	}
+	public AddressId getAddressId() {
+		return addressId;
+	}
+	public void setAddressId(AddressId addressId) {
+		this.addressId = addressId;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedmanytoone/Address.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedmanytoone/AddressId.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedmanytoone/AddressId.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedmanytoone/AddressId.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,45 @@
+//$Id: AddressId.java 6979 2005-06-01 03:51:32Z oneovthafew $
+package org.hibernate.test.typedmanytoone;
+
+import java.io.Serializable;
+
+/**
+ * @author Gavin King
+ */
+public class AddressId implements Serializable {
+	private String type;
+	private String addressId;
+	
+	public AddressId(String type, String customerId) {
+		this.addressId = customerId;
+		this.type = type;
+	}
+	
+	public AddressId() {}
+	
+	public String getType() {
+		return type;
+	}
+	public void setType(String type) {
+		this.type = type;
+	}
+	public String getAddressId() {
+		return addressId;
+	}
+	public void setAddressId(String customerId) {
+		this.addressId = customerId;
+	}
+	public boolean equals(Object other) {
+		if ( !(other instanceof AddressId) ) return false;
+		AddressId add = (AddressId) other;
+		return type.equals(add.type) && addressId.equals(add.addressId);
+	}
+	public int hashCode() {
+		return addressId.hashCode() + type.hashCode();
+	}
+	
+	public String toString() {
+		return type + '#' + addressId;
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedmanytoone/AddressId.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedmanytoone/Customer.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedmanytoone/Customer.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedmanytoone/Customer.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,85 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+	Shows how to map a one-to-many relationship in the relational
+	schema to "typed" one-to-one associations in the object model.
+	We map the Address class twice, with different entity names,
+	specifying a filtering condition in each mapping. The typed
+	associations then reference the named entities.
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.typedmanytoone">
+
+	<class name="Customer" 
+			select-before-update="true" 
+			dynamic-update="true">
+	
+		<id name="customerId">
+			<generator class="assigned"/>
+		</id>
+	
+		<property name="name" not-null="true"/>
+		
+		<many-to-one name="billingAddress" 
+			entity-name="BillingAddress"
+			cascade="persist,save-update,delete"
+			fetch="join">
+			<column name="billingAddressId"/>
+			<formula>'BILLING'</formula>
+		</many-to-one>
+			
+		<many-to-one name="shippingAddress" 
+			entity-name="ShippingAddress"
+			cascade="persist,save-update,delete"
+			fetch="join">
+			<column name="shippingAddressId"/>
+			<formula>'SHIPPING'</formula>
+		</many-to-one>
+			
+	</class>
+	
+	<class name="Address"
+		table="Address"
+		entity-name="BillingAddress" 
+		where="add_type='BILLING'" 
+		check="add_type in ('BILLING', 'SHIPPING')"
+		select-before-update="true" 
+		dynamic-update="true">
+	
+		<composite-id name="addressId"> 
+			<key-property name="addressId"/>
+			<key-property name="type" column="add_type"/>
+		</composite-id>
+		
+		<property name="street" not-null="true"/>
+		<property name="city" not-null="true"/>
+		<property name="state" not-null="true"/>
+		<property name="zip" not-null="true"/>
+						
+	</class>
+
+	<class name="Address" 
+		table="Address"
+		entity-name="ShippingAddress"
+		where="add_type='SHIPPING'"
+		select-before-update="true" 
+		dynamic-update="true">
+	
+		<composite-id name="addressId">
+			<key-property name="addressId"/>
+			<key-property name="type" column="add_type"/>
+		</composite-id>
+		
+		<property name="street" not-null="true"/>
+		<property name="city" not-null="true"/>
+		<property name="state" not-null="true"/>
+		<property name="zip" not-null="true"/>
+						
+	</class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedmanytoone/Customer.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedmanytoone/Customer.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedmanytoone/Customer.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedmanytoone/Customer.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,40 @@
+//$Id: Customer.java 6979 2005-06-01 03:51:32Z oneovthafew $
+package org.hibernate.test.typedmanytoone;
+
+import java.io.Serializable;
+
+/**
+ * @author Gavin King
+ */
+public class Customer implements Serializable {
+
+	private String name;
+	private String customerId;
+	private Address billingAddress;
+	private Address shippingAddress;
+
+	public Address getBillingAddress() {
+		return billingAddress;
+	}
+	public void setBillingAddress(Address billingAddress) {
+		this.billingAddress = billingAddress;
+	}
+	public String getCustomerId() {
+		return customerId;
+	}
+	public void setCustomerId(String customerId) {
+		this.customerId = customerId;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public Address getShippingAddress() {
+		return shippingAddress;
+	}
+	public void setShippingAddress(Address shippingAddress) {
+		this.shippingAddress = shippingAddress;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedmanytoone/Customer.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedmanytoone/TypedManyToOneTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedmanytoone/TypedManyToOneTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedmanytoone/TypedManyToOneTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,113 @@
+//$Id: TypedManyToOneTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.typedmanytoone;
+
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class TypedManyToOneTest extends FunctionalTestCase {
+	
+	public TypedManyToOneTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "typedmanytoone/Customer.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( TypedManyToOneTest.class );
+	}
+	
+	public void testCreateQuery() {
+		Customer cust = new Customer();
+		cust.setCustomerId("abc123");
+		cust.setName("Matt");
+		
+		Address ship = new Address();
+		ship.setStreet("peachtree rd");
+		ship.setState("GA");
+		ship.setCity("ATL");
+		ship.setZip("30326");
+		ship.setAddressId( new AddressId("SHIPPING", "xyz123") );
+		ship.setCustomer(cust);
+		
+		Address bill = new Address();
+		bill.setStreet("peachtree rd");
+		bill.setState("GA");
+		bill.setCity("ATL");
+		bill.setZip("30326");
+		bill.setAddressId( new AddressId("BILLING", "xyz123") );
+		bill.setCustomer(cust);
+		
+		cust.setBillingAddress(bill);
+		cust.setShippingAddress(ship);
+		
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(cust);
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		List results = s.createQuery("from Customer cust left join fetch cust.billingAddress where cust.customerId='abc123'").list();
+		//List results = s.createQuery("from Customer cust left join fetch cust.billingAddress left join fetch cust.shippingAddress").list();
+		cust = (Customer) results.get(0);
+		assertFalse( Hibernate.isInitialized( cust.getShippingAddress() ) );
+		assertTrue( Hibernate.isInitialized( cust.getBillingAddress() ) );
+		assertEquals( "30326", cust.getBillingAddress().getZip() );
+		assertEquals( "30326", cust.getShippingAddress().getZip() );
+		assertEquals( "BILLING", cust.getBillingAddress().getAddressId().getType() );
+		assertEquals( "SHIPPING", cust.getShippingAddress().getAddressId().getType() );
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		s.saveOrUpdate(cust);
+		ship = cust.getShippingAddress();
+		cust.setShippingAddress(null);
+		s.delete("ShippingAddress", ship);
+		s.flush();
+		assertNull( s.get( "ShippingAddress", ship.getAddressId() ) );
+		s.delete( cust );
+		t.commit();
+		s.close();
+	}
+	
+	public void testCreateQueryNull() {
+		Customer cust = new Customer();
+		cust.setCustomerId("xyz123");
+		cust.setName("Matt");
+		
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(cust);
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		List results = s.createQuery("from Customer cust left join fetch cust.billingAddress where cust.customerId='xyz123'").list();
+		//List results = s.createQuery("from Customer cust left join fetch cust.billingAddress left join fetch cust.shippingAddress").list();
+		cust = (Customer) results.get(0);
+		assertNull( cust.getShippingAddress() );
+		assertNull( cust.getBillingAddress() );
+		s.delete( cust );
+		t.commit();
+		s.close();
+		
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedmanytoone/TypedManyToOneTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedonetoone/Address.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedonetoone/Address.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedonetoone/Address.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,55 @@
+//$Id: Address.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.typedonetoone;
+
+import java.io.Serializable;
+
+/**
+ * @author Gavin King
+ */
+public class Address implements Serializable {
+	
+	private AddressId addressId;
+	private String street;
+	private String city;
+	private String state;
+	private String zip;
+	private Customer customer;
+
+	public Customer getCustomer() {
+		return customer;
+	}
+	public void setCustomer(Customer customer) {
+		this.customer = customer;
+	}
+	
+	public String getCity() {
+		return city;
+	}
+	public void setCity(String city) {
+		this.city = city;
+	}
+	public String getState() {
+		return state;
+	}
+	public void setState(String state) {
+		this.state = state;
+	}
+	public String getStreet() {
+		return street;
+	}
+	public void setStreet(String street) {
+		this.street = street;
+	}
+	public String getZip() {
+		return zip;
+	}
+	public void setZip(String zip) {
+		this.zip = zip;
+	}
+	public AddressId getAddressId() {
+		return addressId;
+	}
+	public void setAddressId(AddressId addressId) {
+		this.addressId = addressId;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedonetoone/Address.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedonetoone/AddressId.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedonetoone/AddressId.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedonetoone/AddressId.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,41 @@
+//$Id: AddressId.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.typedonetoone;
+
+import java.io.Serializable;
+
+/**
+ * @author Gavin King
+ */
+public class AddressId implements Serializable {
+	private String type;
+	private String customerId;
+	
+	public AddressId(String type, String customerId) {
+		this.customerId = customerId;
+		this.type = type;
+	}
+	
+	public AddressId() {}
+	
+	public String getType() {
+		return type;
+	}
+	public void setType(String type) {
+		this.type = type;
+	}
+	public String getCustomerId() {
+		return customerId;
+	}
+	public void setCustomerId(String customerId) {
+		this.customerId = customerId;
+	}
+	public boolean equals(Object other) {
+		if ( !(other instanceof AddressId) ) return false;
+		AddressId add = (AddressId) other;
+		return type.equals(add.type) && customerId.equals(add.customerId);
+	}
+	public int hashCode() {
+		return customerId.hashCode() + type.hashCode();
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedonetoone/AddressId.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedonetoone/Customer.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedonetoone/Customer.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedonetoone/Customer.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,85 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+	Shows how to map a one-to-many relationship in the relational
+	schema to "typed" one-to-one associations in the object model.
+	We map the Address class twice, with different entity names,
+	specifying a filtering condition in each mapping. The typed
+	associations then reference the named entities.
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.typedonetoone">
+
+	<class name="Customer">
+	
+		<id name="customerId">
+			<generator class="assigned"/>
+		</id>
+	
+		<property name="name" not-null="true"/>
+		
+		<one-to-one name="billingAddress" 
+			entity-name="BillingAddress"
+			property-ref="customer"
+			cascade="persist, delete"
+			fetch="join"/>
+			
+		<one-to-one name="shippingAddress" 
+			entity-name="ShippingAddress"
+			property-ref="customer"
+			cascade="persist, delete"
+			fetch="join"/>
+			
+	</class>
+	
+	<class name="Address"
+		table="Address"
+		entity-name="BillingAddress" 
+		where="add_type='BILLING'" 
+		check="add_type in ('BILLING', 'SHIPPING')">
+	
+		<composite-id name="addressId">
+			<key-property name="customerId"/>
+			<key-property name="type" column="add_type"/>
+		</composite-id>
+		
+		<property name="street" not-null="true"/>
+		<property name="city" not-null="true"/>
+		<property name="state" not-null="true"/>
+		<property name="zip" not-null="true"/>
+		
+		<many-to-one name="customer" 
+			column="customerId" 
+			insert="false"
+			update="false"/>
+						
+	</class>
+
+	<class name="Address" 
+		table="Address"
+		entity-name="ShippingAddress"
+		where="add_type='SHIPPING'">
+	
+		<composite-id name="addressId">
+			<key-property name="customerId"/>
+			<key-property name="type" column="add_type"/>
+		</composite-id>
+		
+		<property name="street" not-null="true"/>
+		<property name="city" not-null="true"/>
+		<property name="state" not-null="true"/>
+		<property name="zip" not-null="true"/>
+		
+		<many-to-one name="customer" 
+			column="customerId" 
+			insert="false"
+			update="false"/>
+						
+	</class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedonetoone/Customer.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedonetoone/Customer.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedonetoone/Customer.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedonetoone/Customer.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,40 @@
+//$Id: Customer.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.typedonetoone;
+
+import java.io.Serializable;
+
+/**
+ * @author Gavin King
+ */
+public class Customer implements Serializable {
+
+	private String name;
+	private String customerId;
+	private Address billingAddress;
+	private Address shippingAddress;
+
+	public Address getBillingAddress() {
+		return billingAddress;
+	}
+	public void setBillingAddress(Address billingAddress) {
+		this.billingAddress = billingAddress;
+	}
+	public String getCustomerId() {
+		return customerId;
+	}
+	public void setCustomerId(String customerId) {
+		this.customerId = customerId;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public Address getShippingAddress() {
+		return shippingAddress;
+	}
+	public void setShippingAddress(Address shippingAddress) {
+		this.shippingAddress = shippingAddress;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedonetoone/Customer.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedonetoone/TypedOneToOneTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedonetoone/TypedOneToOneTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedonetoone/TypedOneToOneTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,103 @@
+//$Id: TypedOneToOneTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.typedonetoone;
+
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class TypedOneToOneTest extends FunctionalTestCase {
+	
+	public TypedOneToOneTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "typedonetoone/Customer.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( TypedOneToOneTest.class );
+	}
+	
+	public void testCreateQuery() {
+		Customer cust = new Customer();
+		cust.setCustomerId("abc123");
+		cust.setName("Matt");
+		
+		Address ship = new Address();
+		ship.setStreet("peachtree rd");
+		ship.setState("GA");
+		ship.setCity("ATL");
+		ship.setZip("30326");
+		ship.setAddressId( new AddressId("SHIPPING", "abc123") );
+		ship.setCustomer(cust);
+		
+		Address bill = new Address();
+		bill.setStreet("peachtree rd");
+		bill.setState("GA");
+		bill.setCity("ATL");
+		bill.setZip("30326");
+		bill.setAddressId( new AddressId("BILLING", "abc123") );
+		bill.setCustomer(cust);
+		
+		cust.setBillingAddress(bill);
+		cust.setShippingAddress(ship);
+		
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(cust);
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		List results = s.createQuery("from Customer cust left join fetch cust.billingAddress where cust.customerId='abc123'").list();
+		//List results = s.createQuery("from Customer cust left join fetch cust.billingAddress left join fetch cust.shippingAddress").list();
+		cust = (Customer) results.get(0);
+		assertTrue( Hibernate.isInitialized( cust.getShippingAddress() ) );
+		assertTrue( Hibernate.isInitialized( cust.getBillingAddress() ) );
+		assertEquals( "30326", cust.getBillingAddress().getZip() );
+		assertEquals( "30326", cust.getShippingAddress().getZip() );
+		assertEquals( "BILLING", cust.getBillingAddress().getAddressId().getType() );
+		assertEquals( "SHIPPING", cust.getShippingAddress().getAddressId().getType() );
+		s.delete( cust );
+		t.commit();
+		s.close();
+
+	}
+	
+	public void testCreateQueryNull() {
+		Customer cust = new Customer();
+		cust.setCustomerId("xyz123");
+		cust.setName("Matt");
+		
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.persist(cust);
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		List results = s.createQuery("from Customer cust left join fetch cust.billingAddress where cust.customerId='xyz123'").list();
+		//List results = s.createQuery("from Customer cust left join fetch cust.billingAddress left join fetch cust.shippingAddress").list();
+		cust = (Customer) results.get(0);
+		assertNull( cust.getShippingAddress() );
+		assertNull( cust.getBillingAddress() );
+		s.delete(cust);
+		t.commit();
+		s.close();
+		
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typedonetoone/TypedOneToOneTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typeparameters/DefaultValueIntegerType.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typeparameters/DefaultValueIntegerType.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typeparameters/DefaultValueIntegerType.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,82 @@
+package org.hibernate.test.typeparameters;
+
+import java.io.Serializable;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.Properties;
+
+import org.slf4j.LoggerFactory;
+import org.hibernate.HibernateException;
+import org.hibernate.usertype.ParameterizedType;
+import org.hibernate.usertype.UserType;
+
+
+/**
+ * @author Michi
+ */
+public class DefaultValueIntegerType implements UserType, ParameterizedType, Serializable {
+
+	private Integer defaultValue;
+
+	public int[] sqlTypes() {
+		return new int[] {Types.INTEGER};
+	}
+
+	public Class returnedClass() {
+		return int.class;
+	}
+
+	public boolean equals(Object x, Object y) throws HibernateException {
+		if (x==y) return true;
+		if (x==null || y==null) return false;
+		return x.equals(y);
+	}
+
+	public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
+		Number result = (Number) rs.getObject(names[0]);
+		return result==null ? defaultValue : new Integer(result.intValue());
+	}
+
+	public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
+		if (value == null || defaultValue.equals(value) ) {
+			LoggerFactory.getLogger( getClass() ).trace("binding null to parameter: " + index);
+			st.setNull(index, Types.INTEGER);
+		} else {
+			LoggerFactory.getLogger( getClass() ).trace("binding " + value + " to parameter: " + index);
+			st.setInt(index, ((Integer)value).intValue());
+		}
+	}
+
+	public Object deepCopy(Object value) throws HibernateException {
+		return new Integer(((Integer)value).intValue());
+	}
+
+	public boolean isMutable() {
+		return false;
+	}
+
+	public int hashCode(Object x) throws HibernateException {
+		return x.hashCode();
+	}
+
+	public Object assemble(Serializable cached, Object owner)
+	throws HibernateException {
+		return cached;
+	}
+
+	public Serializable disassemble(Object value) throws HibernateException {
+		return (Serializable) value;
+	}
+
+	public Object replace(Object original, Object target, Object owner)
+	throws HibernateException {
+		return original;
+	}
+
+	public void setParameterValues(Properties parameters) {
+		this.defaultValue = Integer.valueOf((String) parameters.get("default"));
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typeparameters/DefaultValueIntegerType.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typeparameters/TypeParameterTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typeparameters/TypeParameterTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typeparameters/TypeParameterTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,124 @@
+//$Id: TypeParameterTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.typeparameters;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+
+import junit.framework.Test;
+
+import org.hibernate.Transaction;
+import org.hibernate.classic.Session;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Test for parameterizable types.
+ * 
+ * @author Michael Gloegl
+ */
+public class TypeParameterTest extends FunctionalTestCase {
+
+	public TypeParameterTest(String name) {
+		super(name);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "typeparameters/Typedef.hbm.xml", "typeparameters/Widget.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( TypeParameterTest.class );
+	}
+
+	public void testSave() throws Exception {
+		deleteData();
+
+		Session s = openSession();
+
+		Transaction t = s.beginTransaction();
+
+		Widget obj = new Widget();
+		obj.setValueThree(5);
+
+		Integer id = (Integer) s.save(obj);
+
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+
+		Connection connection = s.connection();
+		PreparedStatement statement = connection.prepareStatement("SELECT * FROM STRANGE_TYPED_OBJECT WHERE ID=?");
+		statement.setInt(1, id.intValue());
+		ResultSet resultSet = statement.executeQuery();
+
+		assertTrue("A row should have been returned", resultSet.next());
+		assertTrue("Default value should have been mapped to null", resultSet.getObject("VALUE_ONE") == null);
+		assertTrue("Default value should have been mapped to null", resultSet.getObject("VALUE_TWO") == null);
+		assertEquals("Non-Default value should not be changed", resultSet.getInt("VALUE_THREE"), 5);
+		assertTrue("Default value should have been mapped to null", resultSet.getObject("VALUE_FOUR") == null);
+
+		
+		t.commit();
+		s.close();
+		deleteData();
+	}
+
+	public void testLoading() throws Exception {
+		initData();
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Widget obj = (Widget) s.createQuery("from Widget o where o.string = :string").setString("string", "all-normal").uniqueResult();
+		assertEquals("Non-Default value incorrectly loaded", obj.getValueOne(), 7);
+		assertEquals("Non-Default value incorrectly loaded", obj.getValueTwo(), 8);
+		assertEquals("Non-Default value incorrectly loaded", obj.getValueThree(), 9);
+		assertEquals("Non-Default value incorrectly loaded", obj.getValueFour(), 10);
+
+		obj = (Widget) s.createQuery("from Widget o where o.string = :string").setString("string", "all-default").uniqueResult();
+		assertEquals("Default value incorrectly loaded", obj.getValueOne(), 1);
+		assertEquals("Default value incorrectly loaded", obj.getValueTwo(), 2);
+		assertEquals("Default value incorrectly loaded", obj.getValueThree(), -1);
+		assertEquals("Default value incorrectly loaded", obj.getValueFour(), -5);
+
+		
+		t.commit();
+		s.close();
+		deleteData();
+	}
+
+	private void initData() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		Widget obj = new Widget();
+		obj.setValueOne(7);
+		obj.setValueTwo(8);
+		obj.setValueThree(9);
+		obj.setValueFour(10);
+		obj.setString("all-normal");
+		s.save(obj);
+
+		obj = new Widget();
+		obj.setValueOne(1);
+		obj.setValueTwo(2);
+		obj.setValueThree(-1);
+		obj.setValueFour(-5);
+		obj.setString("all-default");
+		s.save(obj);
+
+		t.commit();
+		s.close();
+	}
+
+	private void deleteData() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		s.delete("from Widget");
+		t.commit();
+		s.close();
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typeparameters/TypeParameterTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typeparameters/Typedef.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typeparameters/Typedef.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typeparameters/Typedef.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping>
+
+	<typedef name="nullToMinusOne"
+		class="org.hibernate.test.typeparameters.DefaultValueIntegerType">
+		<param name="default">-1</param>
+	</typedef>
+	
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typeparameters/Typedef.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typeparameters/Widget.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typeparameters/Widget.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typeparameters/Widget.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.typeparameters">
+
+	<typedef name="nullToTwo"
+		class="org.hibernate.test.typeparameters.DefaultValueIntegerType">
+		<param name="default">2</param>
+	</typedef>
+
+    <class name="Widget" table="STRANGE_TYPED_OBJECT">
+        <id name="id" column="ID">
+            <generator class="increment"/>
+        </id>
+        <property name="valueOne" column="VALUE_ONE">
+			<type name="org.hibernate.test.typeparameters.DefaultValueIntegerType">
+				<param name="default">1</param>
+			</type>
+		</property>
+        <property name="valueTwo" column="VALUE_TWO" type="nullToTwo"/>
+        <property name="valueThree" column="VALUE_THREE" type="nullToMinusOne"/>
+        <property name="valueFour" column="VALUE_FOUR">
+			<type name="nullToTwo">
+				<param name="default">-5</param>
+			</type>
+		</property>
+		<property name="string"/>
+    </class>
+    
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typeparameters/Widget.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typeparameters/Widget.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typeparameters/Widget.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typeparameters/Widget.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,62 @@
+package org.hibernate.test.typeparameters;
+
+/**
+ * @author Michael Gloegl
+ */
+public class Widget {
+
+	private int valueOne = 1;
+	private int valueTwo = 2;
+	private int valueThree = -1;
+	private int valueFour = -5;
+	private Integer id;
+	private String string;
+
+	public int getValueOne() {
+		return valueOne;
+	}
+
+	public void setValueOne(int valueOne) {
+		this.valueOne = valueOne;
+	}
+
+	public int getValueThree() {
+		return valueThree;
+	}
+
+	public void setValueThree(int valueThree) {
+		this.valueThree = valueThree;
+	}
+
+	public int getValueTwo() {
+		return valueTwo;
+	}
+
+	public void setValueTwo(int valueTwo) {
+		this.valueTwo = valueTwo;
+	}
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getString() {
+		return string;
+	}
+
+	public void setString(String string) {
+		this.string = string;
+	}
+
+	public int getValueFour() {
+		return valueFour;
+	}
+
+	public void setValueFour(int valueFour) {
+		this.valueFour = valueFour;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/typeparameters/Widget.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unconstrained/Employee.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unconstrained/Employee.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unconstrained/Employee.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,28 @@
+//$Id: Employee.java 6298 2005-04-03 03:56:22Z oneovthafew $
+package org.hibernate.test.unconstrained;
+
+/**
+ * @author Gavin King
+ */
+public class Employee {
+	
+	private String id;
+
+	public Employee() {
+	}
+
+	public Employee(String id) {
+		this.id = id;
+	}
+
+	public String getId() {
+		return id;
+	}
+	
+
+	public void setId(String id) {
+		this.id = id;
+	}
+	
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unconstrained/Employee.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unconstrained/Person.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unconstrained/Person.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unconstrained/Person.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping 
+		package="org.hibernate.test.unconstrained"
+		default-access="field">
+	
+	<class name="Person" 
+			dynamic-update="true">
+	
+		<id name="name"/>
+		
+		<property name="employeeId" 
+				unique="true"/>
+				
+		<many-to-one name="employee" 
+				formula="employeeId" 
+				not-found="ignore"
+				cascade="all"/>
+
+	</class>
+
+	<class name="Employee">
+	
+		<id name="id"/>
+
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unconstrained/Person.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unconstrained/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unconstrained/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unconstrained/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,43 @@
+//$Id: Person.java 6298 2005-04-03 03:56:22Z oneovthafew $
+package org.hibernate.test.unconstrained;
+
+/**
+ * @author Gavin King
+ */
+public class Person {
+	
+	private String name;
+	private String employeeId;
+	private Employee employee;
+
+	public Person() {}
+	public Person(String name) {
+		this.name = name;
+	}
+	
+	public Employee getEmployee() {
+		return employee;
+	}
+	
+	public void setEmployee(Employee employee) {
+		this.employee = employee;
+	}
+	
+	public String getEmployeeId() {
+		return employeeId;
+	}
+	
+	public void setEmployeeId(String employeeId) {
+		this.employeeId = employeeId;
+	}
+	
+	public String getName() {
+		return name;
+	}
+	
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unconstrained/Person.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unconstrained/UnconstrainedTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unconstrained/UnconstrainedTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unconstrained/UnconstrainedTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,127 @@
+//$Id: UnconstrainedTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.unconstrained;
+
+import junit.framework.Test;
+
+import org.hibernate.FetchMode;
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class UnconstrainedTest extends FunctionalTestCase {
+	
+	public UnconstrainedTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "unconstrained/Person.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( UnconstrainedTest.class );
+	}
+
+	public void testUnconstrainedNoCache() {
+		Session session = openSession();
+		Transaction tx = session.beginTransaction();
+		Person p = new Person("gavin");
+		p.setEmployeeId("123456");
+		session.persist(p);
+		tx.commit();
+		session.close();
+		
+		getSessions().evict(Person.class);
+		
+		session = openSession();
+		tx = session.beginTransaction();
+		p = (Person) session.get(Person.class, "gavin");
+		assertNull( p.getEmployee() );
+		p.setEmployee( new Employee("123456") );
+		tx.commit();
+		session.close();
+
+		getSessions().evict(Person.class);
+		
+		session = openSession();
+		tx = session.beginTransaction();
+		p = (Person) session.get(Person.class, "gavin");
+		assertTrue( Hibernate.isInitialized( p.getEmployee() ) );
+		assertNotNull( p.getEmployee() );
+		session.delete(p);
+		tx.commit();
+		session.close();
+	}
+
+	public void testUnconstrainedOuterJoinFetch() {
+		Session session = openSession();
+		Transaction tx = session.beginTransaction();
+		Person p = new Person("gavin");
+		p.setEmployeeId("123456");
+		session.persist(p);
+		tx.commit();
+		session.close();
+		
+		getSessions().evict(Person.class);
+		
+		session = openSession();
+		tx = session.beginTransaction();
+		p = (Person) session.createCriteria(Person.class)
+			.setFetchMode("employee", FetchMode.JOIN)
+			.add( Restrictions.idEq("gavin") )
+			.uniqueResult();
+		assertNull( p.getEmployee() );
+		p.setEmployee( new Employee("123456") );
+		tx.commit();
+		session.close();
+
+		getSessions().evict(Person.class);
+		
+		session = openSession();
+		tx = session.beginTransaction();
+		p = (Person) session.createCriteria(Person.class)
+			.setFetchMode("employee", FetchMode.JOIN)
+			.add( Restrictions.idEq("gavin") )
+			.uniqueResult();
+		assertTrue( Hibernate.isInitialized( p.getEmployee() ) );
+		assertNotNull( p.getEmployee() );
+		session.delete(p);
+		tx.commit();
+		session.close();
+	}
+
+	public void testUnconstrained() {
+		Session session = openSession();
+		Transaction tx = session.beginTransaction();
+		Person p = new Person("gavin");
+		p.setEmployeeId("123456");
+		session.persist(p);
+		tx.commit();
+		session.close();
+		
+		session = openSession();
+		tx = session.beginTransaction();
+		p = (Person) session.get(Person.class, "gavin");
+		assertNull( p.getEmployee() );
+		p.setEmployee( new Employee("123456") );
+		tx.commit();
+		session.close();
+
+		session = openSession();
+		tx = session.beginTransaction();
+		p = (Person) session.get(Person.class, "gavin");
+		assertTrue( Hibernate.isInitialized( p.getEmployee() ) );
+		assertNotNull( p.getEmployee() );
+		session.delete(p);
+		tx.commit();
+		session.close();
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unconstrained/UnconstrainedTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unidir/BackrefTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unidir/BackrefTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unidir/BackrefTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,121 @@
+//$Id: BackrefTest.java 10976 2006-12-12 23:22:26Z steve.ebersole at jboss.com $
+package org.hibernate.test.unidir;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class BackrefTest extends FunctionalTestCase {
+
+	public BackrefTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "unidir/ParentChild.hbm.xml" };
+	}
+
+	public String getCacheConcurrencyStrategy() {
+		return null;
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( BackrefTest.class );
+	}
+
+	public void testBackRef() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Parent p = new Parent("Marc");
+		Parent p2 = new Parent("Nathalie");
+		Child c = new Child("Elvira");
+		Child c2 = new Child("Blase");
+		p.getChildren().add(c);
+		p.getChildren().add(c2);
+		s.persist(p);
+		s.persist(p2);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		c = (Child) s.get(Child.class, "Elvira");
+		c.setAge(2);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		p = (Parent) s.get(Parent.class, "Marc");
+		c = (Child) s.get(Child.class, "Elvira");
+		c.setAge(18);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		p = (Parent) s.get(Parent.class, "Marc");
+		p2 = (Parent) s.get(Parent.class, "Nathalie");
+		c = (Child) s.get(Child.class, "Elvira");
+		assertEquals( p.getChildren().indexOf(c), 0 );
+		p.getChildren().remove(c);
+		p2.getChildren().add(c);
+		t.commit();
+
+		s.close();
+		s = openSession();
+		t = s.beginTransaction();
+		Parent p3 = new Parent("Marion");
+		p3.getChildren().add( new Child("Gavin") );
+		s.merge(p3);
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery( "delete from Child" ).executeUpdate();
+		s.createQuery( "delete from Parent" ).executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	public void testBackRefToProxiedEntityOnMerge() {
+		Session s = openSession();
+		s.beginTransaction();
+		Parent me = new Parent( "Steve" );
+		me.getChildren().add( new Child( "Joe" ) );
+  		s.persist( me );
+		s.getTransaction().commit();
+		s.close();
+
+		// while detached, add a new element
+		me.getChildren().add( new Child( "Cece" ) );
+		me.getChildren().add( new Child( "Austin" ) );
+
+		s = openSession();
+		s.beginTransaction();
+		// load 'me' to associate it with the new session as a proxy (this may have occurred as 'prior work'
+		// to the reattachment below)...
+		Object meProxy = s.load( Parent.class, me.getName() );
+		assertFalse( Hibernate.isInitialized( meProxy ) );
+		// now, do the reattchment...
+		s.merge( me );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		s.createQuery( "delete from Child" ).executeUpdate();
+		s.createQuery( "delete from Parent" ).executeUpdate();
+		s.getTransaction().commit();
+		s.close();
+	}
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unidir/BackrefTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unidir/Child.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unidir/Child.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unidir/Child.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,39 @@
+//$Id: Child.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.unidir;
+
+
+/**
+ * @author Gavin King
+ */
+public class Child {
+	private String name;
+	private int age;
+
+	Child() {
+	}
+
+	public Child(String name) {
+		this( name, 0 );
+	}
+
+	public Child(String name, int age) {
+		this.name = name;
+		this.age = age;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public int getAge() {
+		return age;
+	}
+
+	public void setAge(int age) {
+		this.age = age;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unidir/Child.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unidir/Parent.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unidir/Parent.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unidir/Parent.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,29 @@
+//$Id: Parent.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.unidir;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Gavin King
+ */
+public class Parent {
+	private String name;
+	private List children = new ArrayList();
+	Parent() {}
+	public Parent(String name) {
+		this.name = name;
+	}
+	public List getChildren() {
+		return children;
+	}
+	public void setChildren(List children) {
+		this.children = children;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unidir/Parent.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unidir/ParentChild.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unidir/ParentChild.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unidir/ParentChild.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping 
+	package="org.hibernate.test.unidir">
+
+	<class name="Parent">
+		<id name="name"/>
+		<list name="children" cascade="persist,merge">
+			<key column="parentName" not-null="true"/>
+			<list-index column="sibling"/>
+			<one-to-many class="Child"/>
+		</list>
+	</class>
+	
+	<class name="Child">
+		<id name="name"/>
+		<property name="age" not-null="true"/>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unidir/ParentChild.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Alien.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Alien.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Alien.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,38 @@
+//$Id: Alien.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.unionsubclass;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Gavin King
+ */
+public class Alien extends Being {
+	private String species;
+	private Hive hive;
+	private List hivemates = new ArrayList();
+	/**
+	 * @return Returns the species.
+	 */
+	public String getSpecies() {
+		return species;
+	}
+	/**
+	 * @param species The species to set.
+	 */
+	public void setSpecies(String species) {
+		this.species = species;
+	}
+	public Hive getHive() {
+		return hive;
+	}
+	public void setHive(Hive hive) {
+		this.hive = hive;
+	}
+	public List getHivemates() {
+		return hivemates;
+	}
+	public void setHivemates(List hivemates) {
+		this.hivemates = hivemates;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Alien.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Being.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Being.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Being.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,72 @@
+//$Id: Being.java 6007 2005-03-04 12:01:43Z oneovthafew $
+package org.hibernate.test.unionsubclass;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Gavin King
+ */
+public abstract class Being {
+	private long id;
+	private String identity;
+	private Location location;
+	private List things = new ArrayList();
+	private Map info = new HashMap();
+	/**
+	 * @return Returns the id.
+	 */
+	public long getId() {
+		return id;
+	}
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(long id) {
+		this.id = id;
+	}
+	/**
+	 * @return Returns the identity.
+	 */
+	public String getIdentity() {
+		return identity;
+	}
+	/**
+	 * @param identity The identity to set.
+	 */
+	public void setIdentity(String identity) {
+		this.identity = identity;
+	}
+	/**
+	 * @return Returns the location.
+	 */
+	public Location getLocation() {
+		return location;
+	}
+	/**
+	 * @param location The location to set.
+	 */
+	public void setLocation(Location location) {
+		this.location = location;
+	}
+	public String getSpecies() {
+		return null;
+	}
+
+	public List getThings() {
+		return things;
+	}
+	public void setThings(List things) {
+		this.things = things;
+	}
+	public Map getInfo() {
+		return info;
+	}
+	
+	public void setInfo(Map info) {
+		this.info = info;
+	}
+	
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Being.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Beings.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Beings.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Beings.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,113 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping 
+	package="org.hibernate.test.unionsubclass"
+	default-access="field">
+	
+	<class name="Being" abstract="true">
+	
+		<id name="id" unsaved-value="0" column="bid">
+			<generator class="increment"/>
+			<!--generator class="hilo">
+				<param name="table">being_id</param>
+				<param name="column">next_id</param>
+			</generator-->
+		</id>
+		
+		<property name="identity" not-null="true" column="ident"/>
+		<many-to-one name="location" not-null="true"/>
+		
+		<bag name="things" inverse="true">
+			<key column="owner"/>
+			<one-to-many class="Thing"/>
+		</bag>
+		
+		<map name="info">
+			<key column="bid"/>
+			<map-key type="string" column="attribute"/>
+			<element type="string" column="`value`"/>
+		</map>
+
+		<union-subclass name="Human" table="humans">
+			<property name="sex" 
+				not-null="true" 
+				update="false"/>
+			<union-subclass name="Employee" table="employees">
+				<property name="salary"/>
+			</union-subclass>
+		</union-subclass>
+		
+		<union-subclass name="Alien" table="aliens">
+			<property name="species" 
+				not-null="true" 
+				update="false"/>
+			<many-to-one name="hive" not-null="true"/>
+			<bag name="hivemates">
+				<key column="alien1"/>
+				<many-to-many column="alien2" class="Alien"/>
+			</bag>
+		</union-subclass>
+		
+	</class>
+	
+	<class name="Hive" table="hives">
+
+		<id name="id" unsaved-value="0">
+			<generator class="increment"/>
+			<!--generator class="hilo">
+				<param name="table">location_id</param>
+				<param name="column">next_id</param>
+			</generator-->
+		</id>
+
+		<many-to-one name="location" not-null="true"/>
+		
+		<bag name="members"
+			inverse="true"
+			cascade="all,delete-orphan">
+			<key column="hive"/>
+			<one-to-many class="Alien"/>
+		</bag>	
+		
+	</class>
+	
+	<class name="Location" table="locations">
+	
+		<id name="id" unsaved-value="0">
+			<generator class="increment"/>			
+			<!--generator class="hilo">
+				<param name="table">location_id</param>
+				<param name="column">next_id</param>
+			</generator-->
+		</id>
+		
+		<property name="name" not-null="true"/>
+		
+		<bag name="beings"
+			inverse="true"
+			cascade="all">
+			<key column="location"/>
+			<one-to-many class="Being"/>
+		</bag>
+		
+	</class>
+	
+	<class name="Thing" table="things">
+	
+		<id name="id" unsaved-value="0">
+			<generator class="increment"/>			
+			<!--generator class="hilo">
+				<param name="table">thing_id</param>
+				<param name="column">next_id</param>
+			</generator-->
+		</id>
+
+		<property name="description"/>
+		<many-to-one name="owner"/>
+		
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Beings.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Employee.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Employee.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Employee.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,17 @@
+//$Id: Employee.java 6673 2005-05-03 22:59:24Z epbernard $
+package org.hibernate.test.unionsubclass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Employee extends Human {
+	private Double salary;
+
+	public Double getSalary() {
+		return salary;
+	}
+
+	public void setSalary(Double salary) {
+		this.salary = salary;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Employee.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Hive.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Hive.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Hive.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,32 @@
+//$Id: Hive.java 5686 2005-02-12 07:27:32Z steveebersole $
+package org.hibernate.test.unionsubclass;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Gavin King
+ */
+public class Hive {
+	private long id;
+	private Location location;
+	private List members = new ArrayList();
+	public List getMembers() {
+		return members;
+	}
+	public void setMembers(List hives) {
+		this.members = hives;
+	}
+	public long getId() {
+		return id;
+	}
+	public void setId(long id) {
+		this.id = id;
+	}
+	public Location getLocation() {
+		return location;
+	}
+	public void setLocation(Location location) {
+		this.location = location;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Hive.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Human.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Human.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Human.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,26 @@
+//$Id: Human.java 4364 2004-08-17 12:10:32Z oneovthafew $
+package org.hibernate.test.unionsubclass;
+
+/**
+ * @author Gavin King
+ */
+public class Human extends Being {
+	private char sex;
+	
+	/**
+	 * @return Returns the sex.
+	 */
+	public char getSex() {
+		return sex;
+	}
+	/**
+	 * @param sex The sex to set.
+	 */
+	public void setSex(char sex) {
+		this.sex = sex;
+	}
+	public String getSpecies() {
+		return "human";
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Human.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Location.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Location.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Location.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,61 @@
+//$Id: Location.java 4357 2004-08-17 09:20:17Z oneovthafew $
+package org.hibernate.test.unionsubclass;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+/**
+ * @author Gavin King
+ */
+public class Location {
+	private long id;
+	private String name;
+	private Collection beings = new ArrayList();
+	
+	Location() {}
+	
+	public Location(String name) {
+		this.name = name;
+	}
+	
+	public void addBeing(Being b) {
+		b.setLocation(this);
+		beings.add(b);
+	}
+	/**
+	 * @return Returns the id.
+	 */
+	public long getId() {
+		return id;
+	}
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(long id) {
+		this.id = id;
+	}
+	/**
+	 * @return Returns the name.
+	 */
+	public String getName() {
+		return name;
+	}
+	/**
+	 * @param name The name to set.
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+	/**
+	 * @return Returns the beings.
+	 */
+	public Collection getBeings() {
+		return beings;
+	}
+	/**
+	 * @param beings The beings to set.
+	 */
+	public void setBeings(Collection beings) {
+		this.beings = beings;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Location.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Thing.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Thing.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Thing.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,47 @@
+//$Id: Thing.java 4418 2004-08-22 13:38:16Z oneovthafew $
+package org.hibernate.test.unionsubclass;
+
+/**
+ * @author Gavin King
+ */
+public class Thing {
+	private long id;
+	private String description;
+	private Being owner;
+	/**
+	 * @return Returns the description.
+	 */
+	public String getDescription() {
+		return description;
+	}
+	/**
+	 * @param description The description to set.
+	 */
+	public void setDescription(String description) {
+		this.description = description;
+	}
+	/**
+	 * @return Returns the id.
+	 */
+	public long getId() {
+		return id;
+	}
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(long id) {
+		this.id = id;
+	}
+	/**
+	 * @return Returns the owner.
+	 */
+	public Being getOwner() {
+		return owner;
+	}
+	/**
+	 * @param owner The owner to set.
+	 */
+	public void setOwner(Being owner) {
+		this.owner = owner;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/Thing.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/UnionSubclassTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/UnionSubclassTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/UnionSubclassTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,401 @@
+//$Id: UnionSubclassTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.unionsubclass;
+
+import java.util.Iterator;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.FetchMode;
+import org.hibernate.Hibernate;
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.criterion.Order;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class UnionSubclassTest extends FunctionalTestCase {
+	
+	public UnionSubclassTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "unionsubclass/Beings.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( UnionSubclassTest.class );
+	}
+	
+	public void testUnionSubclassCollection() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Location mel = new Location("Earth");
+		s.save(mel);
+		
+		Human gavin = new Human();
+		gavin.setIdentity("gavin");
+		gavin.setSex('M');
+		gavin.setLocation(mel);
+		mel.addBeing(gavin);
+		
+		gavin.getInfo().put("foo", "bar");
+		gavin.getInfo().put("x", "y");
+		
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		gavin = (Human) s.createCriteria(Human.class).uniqueResult();
+		assertEquals( gavin.getInfo().size(), 2 );
+		s.delete(gavin);
+		s.delete( gavin.getLocation() );
+		t.commit();
+		s.close();
+	}
+
+	public void testUnionSubclassFetchMode() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Location mel = new Location("Earth");
+		s.save(mel);
+		
+		Human gavin = new Human();
+		gavin.setIdentity("gavin");
+		gavin.setSex('M');
+		gavin.setLocation(mel);
+		mel.addBeing(gavin);
+		Human max = new Human();
+		max.setIdentity("max");
+		max.setSex('M');
+		max.setLocation(mel);
+		mel.addBeing(gavin);
+		
+		s.flush();
+		s.clear();
+		
+		List list = s.createCriteria(Human.class)
+			.setFetchMode("location", FetchMode.JOIN)
+			.setFetchMode("location.beings", FetchMode.JOIN)
+			.list();
+		
+		for (int i=0; i<list.size(); i++ ) {
+			Human h = (Human) list.get(i);
+			assertTrue( Hibernate.isInitialized( h.getLocation() ) );
+			assertTrue( Hibernate.isInitialized( h.getLocation().getBeings() ) );
+			s.delete(h);
+		}
+		s.delete( s.get( Location.class, new Long(mel.getId()) ) );
+		t.commit();
+		s.close();
+		
+		
+	}
+	
+	public void testUnionSubclassOneToMany() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Location mel = new Location("Melbourne, Australia");
+		Location mars = new Location("Mars");
+		s.save(mel);
+		s.save(mars);
+		
+		Human gavin = new Human();
+		gavin.setIdentity("gavin");
+		gavin.setSex('M');
+		gavin.setLocation(mel);
+		mel.addBeing(gavin);
+		
+		Alien x23y4 = new Alien();
+		x23y4.setIdentity("x23y4$$hu%3");
+		x23y4.setLocation(mars);
+		x23y4.setSpecies("martian");
+		mars.addBeing(x23y4);
+		
+		Alien yy3dk = new Alien();
+		yy3dk.setIdentity("yy3dk&*!!!");
+		yy3dk.setLocation(mars);
+		yy3dk.setSpecies("martian");
+		mars.addBeing(yy3dk);
+		
+		Hive hive = new Hive();
+		hive.setLocation(mars);
+		hive.getMembers().add(x23y4);
+		x23y4.setHive(hive);
+		hive.getMembers().add(yy3dk);
+		yy3dk.setHive(hive);
+		s.persist(hive);
+		
+		yy3dk.getHivemates().add(x23y4);
+		x23y4.getHivemates().add(yy3dk);
+		
+		s.flush();
+		s.clear();
+		
+		hive = (Hive) s.createQuery("from Hive h").uniqueResult();
+		assertFalse( Hibernate.isInitialized( hive.getMembers() ) );
+		assertEquals( hive.getMembers().size(), 2 );
+		
+		s.clear();
+		
+		hive = (Hive) s.createQuery("from Hive h left join fetch h.location left join fetch h.members").uniqueResult();
+		assertTrue( Hibernate.isInitialized( hive.getMembers() ) );
+		assertEquals( hive.getMembers().size(), 2 );
+		
+		s.clear();
+		
+		x23y4 = (Alien) s.createQuery("from Alien a left join fetch a.hivemates where a.identity like 'x%'").uniqueResult();
+		assertTrue( Hibernate.isInitialized( x23y4.getHivemates() ) );
+		assertEquals( x23y4.getHivemates().size(), 1 );
+		
+		s.clear();
+		
+		x23y4 = (Alien) s.createQuery("from Alien a where a.identity like 'x%'").uniqueResult();
+		assertFalse( Hibernate.isInitialized( x23y4.getHivemates() ) );
+		assertEquals( x23y4.getHivemates().size(), 1 );
+		
+		s.clear();
+		
+		x23y4 = (Alien) s.createCriteria(Alien.class).addOrder( Order.asc("identity") ).list().get(0);
+		s.delete( x23y4.getHive() );
+		s.delete( s.get(Location.class, new Long( mel.getId() ) ) );
+		s.delete( s.get(Location.class, new Long( mars.getId() ) ) );
+		assertTrue( s.createQuery("from Being").list().isEmpty() );
+		t.commit();
+		s.close();
+	}
+	
+	public void testUnionSubclassManyToOne() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Location mel = new Location("Melbourne, Australia");
+		Location mars = new Location("Mars");
+		s.save(mel);
+		s.save(mars);
+		
+		Human gavin = new Human();
+		gavin.setIdentity("gavin");
+		gavin.setSex('M');
+		gavin.setLocation(mel);
+		mel.addBeing(gavin);
+		
+		Alien x23y4 = new Alien();
+		x23y4.setIdentity("x23y4$$hu%3");
+		x23y4.setLocation(mars);
+		x23y4.setSpecies("martian");
+		mars.addBeing(x23y4);
+		
+		Hive hive = new Hive();
+		hive.setLocation(mars);
+		hive.getMembers().add(x23y4);
+		x23y4.setHive(hive);
+		s.persist(hive);
+		
+		Thing thing = new Thing();
+		thing.setDescription("some thing");
+		thing.setOwner(gavin);
+		gavin.getThings().add(thing);
+		s.save(thing);
+		s.flush();
+		
+		s.clear();
+		
+		thing = (Thing) s.createQuery("from Thing t left join fetch t.owner").uniqueResult();
+		assertTrue( Hibernate.isInitialized( thing.getOwner() ) );
+		assertEquals( thing.getOwner().getIdentity(), "gavin" );
+		s.clear();
+		
+		thing = (Thing) s.createQuery("select t from Thing t left join t.owner where t.owner.identity='gavin'").uniqueResult();
+		assertFalse( Hibernate.isInitialized( thing.getOwner() ) );
+		assertEquals( thing.getOwner().getIdentity(), "gavin" );
+		s.clear();
+		
+		gavin = (Human) s.createQuery("from Human h left join fetch h.things").uniqueResult();
+		assertTrue( Hibernate.isInitialized( gavin.getThings() ) );
+		assertEquals( ( (Thing) gavin.getThings().get(0) ).getDescription(), "some thing" );
+		s.clear();
+		
+		assertTrue( s.createQuery("from Being b left join fetch b.things").list().size()==2 );
+		s.clear();
+		
+		gavin = (Human) s.createQuery("from Being b join fetch b.things").uniqueResult();
+		assertTrue( Hibernate.isInitialized( gavin.getThings() ) );
+		assertEquals( ( (Thing) gavin.getThings().get(0) ).getDescription(), "some thing" );
+		s.clear();
+		
+		gavin = (Human) s.createQuery("select h from Human h join h.things t where t.description='some thing'").uniqueResult();
+		assertFalse( Hibernate.isInitialized( gavin.getThings() ) );
+		assertEquals( ( (Thing) gavin.getThings().get(0) ).getDescription(), "some thing" );
+		s.clear();
+		
+		gavin = (Human) s.createQuery("select b from Being b join b.things t where t.description='some thing'").uniqueResult();
+		assertFalse( Hibernate.isInitialized( gavin.getThings() ) );
+		assertEquals( ( (Thing) gavin.getThings().get(0) ).getDescription(), "some thing" );
+		s.clear();
+		
+		thing = (Thing) s.get( Thing.class, new Long( thing.getId() ) );
+		assertFalse( Hibernate.isInitialized( thing.getOwner() ) );
+		assertEquals( thing.getOwner().getIdentity(), "gavin" );
+		
+		thing.getOwner().getThings().remove(thing);
+		thing.setOwner(x23y4);
+		x23y4.getThings().add(thing);
+		
+		s.flush();
+		
+		s.clear();
+
+		thing = (Thing) s.get( Thing.class, new Long( thing.getId() ) );
+		assertFalse( Hibernate.isInitialized( thing.getOwner() ) );
+		assertEquals( thing.getOwner().getIdentity(), "x23y4$$hu%3" );
+		
+		s.delete(thing);
+		x23y4 = (Alien) s.createCriteria(Alien.class).uniqueResult();
+		s.delete( x23y4.getHive() );
+		s.delete( s.get(Location.class, new Long( mel.getId() ) ) );
+		s.delete( s.get(Location.class, new Long( mars.getId() ) ) );
+		assertTrue( s.createQuery("from Being").list().isEmpty() );
+		t.commit();
+		s.close();
+	}
+	
+	public void testUnionSubclass() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Location mel = new Location("Melbourne, Australia");
+		Location atl = new Location("Atlanta, GA");
+		Location mars = new Location("Mars");
+		s.save(mel); 
+		s.save(atl); 
+		s.save(mars);
+		
+		Human gavin = new Human();
+		gavin.setIdentity("gavin");
+		gavin.setSex('M');
+		gavin.setLocation(mel);
+		mel.addBeing(gavin);
+		
+		Alien x23y4 = new Alien();
+		x23y4.setIdentity("x23y4$$hu%3");
+		x23y4.setLocation(mars);
+		x23y4.setSpecies("martian");
+		mars.addBeing(x23y4);
+		
+		Hive hive = new Hive();
+		hive.setLocation(mars);
+		hive.getMembers().add(x23y4);
+		x23y4.setHive(hive);
+		s.persist(hive);
+		
+		assertEquals( s.createQuery("from Being").list().size(), 2 );
+		assertEquals( s.createQuery("from Being b where b.class = Alien").list().size(), 1 );
+		assertEquals( s.createQuery("from Alien").list().size(), 1 );
+		s.clear();
+
+		List beings = s.createQuery("from Being b left join fetch b.location").list();
+		for ( Iterator iter = beings.iterator(); iter.hasNext(); ) {
+			Being b = (Being) iter.next();
+			assertTrue( Hibernate.isInitialized( b.getLocation() ) );
+			assertNotNull( b.getLocation().getName() );
+			assertNotNull( b.getIdentity() );
+			assertNotNull( b.getSpecies() );
+		}
+		assertEquals( beings.size(), 2 );
+		s.clear();
+		
+		beings = s.createQuery("from Being").list();
+		for ( Iterator iter = beings.iterator(); iter.hasNext(); ) {
+			Being b = (Being) iter.next();
+			assertFalse( Hibernate.isInitialized( b.getLocation() ) );
+			assertNotNull( b.getLocation().getName() );
+			assertNotNull( b.getIdentity() );
+			assertNotNull( b.getSpecies() );
+		}
+		assertEquals( beings.size(), 2 );
+		s.clear();
+		
+		List locations = s.createQuery("from Location").list(); 
+		int count = 0;
+		for ( Iterator iter = locations.iterator(); iter.hasNext(); ) {
+			Location l = (Location) iter.next();
+			assertNotNull( l.getName() );
+			Iterator iter2 = l.getBeings().iterator();
+			while ( iter2.hasNext() ) {
+				count++;
+				assertSame( ( (Being) iter2.next() ).getLocation(), l );
+			}
+		}
+		assertEquals(count, 2);
+		assertEquals( locations.size(), 3 );
+		s.clear();
+
+		locations = s.createQuery("from Location loc left join fetch loc.beings").list(); 
+		count = 0;
+		for ( Iterator iter = locations.iterator(); iter.hasNext(); ) {
+			Location l = (Location) iter.next();
+			assertNotNull( l.getName() );
+			Iterator iter2 = l.getBeings().iterator();
+			while ( iter2.hasNext() ) {
+				count++;
+				assertSame( ( (Being) iter2.next() ).getLocation(), l );
+			}
+		}
+		assertEquals(count, 2);
+		assertEquals( locations.size(), 3 );
+		s.clear();
+
+		gavin = (Human) s.get( Human.class, new Long( gavin.getId() ) );
+		atl = (Location) s.get( Location.class, new Long( atl.getId() ) );
+		
+ 		atl.addBeing(gavin);
+		assertEquals( s.createQuery("from Human h where h.location.name like '%GA'").list().size(), 1 );
+		s.delete(gavin);
+		x23y4 = (Alien) s.createCriteria(Alien.class).uniqueResult();
+		s.delete( x23y4.getHive() );
+		assertTrue( s.createQuery("from Being").list().isEmpty() );
+		
+		s.createQuery("delete from Location").executeUpdate();
+		t.commit();
+		s.close();
+	}
+
+	public void testNestedUnionedSubclasses() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Location mel = new Location("Earth");
+		Human marcf = new Human();
+		marcf.setIdentity("marc");
+		marcf.setSex('M');
+		mel.addBeing(marcf);
+		Employee steve = new Employee();
+		steve.setIdentity("steve");
+		steve.setSex('M');
+		steve.setSalary( new Double(0) );
+		mel.addBeing(steve);
+		s.persist(mel);
+		tx.commit();
+		s.close();
+		s = openSession();
+		tx = s.beginTransaction();
+		Query q = s.createQuery( "from Being h where h.identity = :name1 or h.identity = :name2" );
+		q.setString("name1", "marc");
+		q.setString("name2", "steve");
+		final List result = q.list();
+		assertEquals( 2, result.size() );
+		s.delete( result.get(0) );
+		s.delete( result.get(1) );
+		s.delete( ( (Human) result.get(0) ).getLocation() );
+		tx.commit();
+		s.close();
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/UnionSubclassTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/alias/CarBuyer.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/alias/CarBuyer.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/alias/CarBuyer.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,59 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.unionsubclass.alias;
+
+/**
+ * 
+ * @author Strong Liu <stliu at redhat.com>
+ */
+public class CarBuyer extends Customer {
+    private String sellerName;
+    private String pid;
+    private Seller seller;
+
+    public String getSellerName() {
+        return sellerName;
+    }
+
+    public void setSellerName( String sellerName ) {
+        this.sellerName = sellerName;
+    }
+
+    public String getPid() {
+        return pid;
+    }
+
+    public void setPid( String pid ) {
+        this.pid = pid;
+    }
+
+    public Seller getSeller() {
+        return seller;
+    }
+
+    public void setSeller( Seller seller ) {
+        this.seller = seller;
+    }
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/alias/CarBuyer.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/alias/Customer.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/alias/Customer.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/alias/Customer.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,57 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.unionsubclass.alias;
+
+import java.io.Serializable;
+
+/**
+ * 
+ * @author Strong Liu <stliu at redhat.com>
+ */
+public abstract class Customer implements Serializable {
+    private PersonID id;
+
+    public PersonID getId() {
+        return id;
+    }
+
+    public void setId( PersonID id ) {
+        this.id = id;
+    }
+
+    public boolean equals( Object obj ) {
+        if ( obj == null )
+            return false;
+        if ( obj == this )
+            return true;
+        if ( !( obj instanceof Customer ) )
+            return false;
+        return ( (Customer) obj ).getId().equals( getId() );
+    }
+
+    public int hashCode() {
+        return id.hashCode();
+    }
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/alias/Customer.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/alias/PersonID.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/alias/PersonID.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/alias/PersonID.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,94 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.unionsubclass.alias;
+
+import java.io.Serializable;
+
+/**
+ * 
+ * @author Strong Liu <stliu at redhat.com>
+ */
+public class PersonID implements Serializable {
+    private Long num;
+    private String name;
+
+    public Long getNum() {
+        return num;
+    }
+
+    public void setNum( Long num ) {
+        this.num = num;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName( String name ) {
+        this.name = name;
+    }
+
+    public boolean equals( Object obj ) {
+        if ( this == obj )
+            return true;
+        if ( obj == null )
+            return false;
+        if ( getClass() != obj.getClass() )
+            return false;
+        final PersonID other = (PersonID) obj;
+        if ( name == null ) {
+            if ( other.name != null )
+                return false;
+
+        } else if ( !name.equals( other.name ) ) {
+            return false;
+        }
+        if ( num == null ) {
+            if ( other.num != null )
+                return false;
+
+        } else if ( !num.equals( other.num ) ) {
+            return false;
+        }
+        return true;
+    }
+
+    public int hashCode() {
+        final int PRIME = 31;
+        int result = 1;
+        if ( name != null ) {
+            result += name.hashCode();
+        }
+        result *= PRIME;
+        if ( num != null ) {
+            result += num.hashCode();
+        }
+        return result;
+    }
+
+    public String toString() {
+        return name + " | " + num;
+    }
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/alias/PersonID.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/alias/SellCarTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/alias/SellCarTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/alias/SellCarTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,82 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.unionsubclass.alias;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+
+/**
+ * http://opensource.atlassian.com/projects/hibernate/browse/HHH-4825
+ * @author Strong Liu <stliu at redhat.com>
+ */
+public class SellCarTest extends FunctionalTestCase {
+
+    public SellCarTest( String string ) {
+        super( string );
+    }
+
+    public String[] getMappings() {
+        return new String[] { "unionsubclass/alias/mapping.hbm.xml" };
+    }
+
+    public void testSellCar() throws Exception {
+        prepareData();
+        Session session = openSession();
+        Transaction tx = session.beginTransaction();
+        Query query = session.createQuery( "from Seller" );
+        Seller seller = (Seller) query.uniqueResult();
+        assertNotNull( seller );
+        assertEquals( 1, seller.getBuyers().size() );
+        tx.commit();
+        session.close();
+    }
+
+    private void prepareData() {
+        Session session = openSession();
+        Transaction tx = session.beginTransaction();
+        session.save( createData() );
+        tx.commit();
+        session.close();
+    }
+
+    private Object createData() {
+        Seller stliu = new Seller();
+        stliu.setId( createID( "stliu" ) );
+        CarBuyer zd = new CarBuyer();
+        zd.setId( createID( "zd" ) );
+        zd.setSeller( stliu );
+        zd.setSellerName( stliu.getId().getName() );
+        stliu.getBuyers().add( zd );
+        return stliu;
+    }
+
+    private PersonID createID( String name ) {
+        PersonID id = new PersonID();
+        id.setName( name );
+        id.setNum( new Long( 100 ) );
+        return id;
+    }
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/alias/SellCarTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/alias/Seller.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/alias/Seller.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/alias/Seller.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,69 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.test.unionsubclass.alias;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * 
+ * @author Strong Liu <stliu at redhat.com>
+ */
+public class Seller implements Serializable {
+    private PersonID id;
+    private Set buyers = new HashSet();
+
+    public PersonID getId() {
+        return id;
+    }
+
+    public void setId( PersonID id ) {
+        this.id = id;
+    }
+
+    public Set getBuyers() {
+        return buyers;
+    }
+
+    public void setBuyers( Set buyers ) {
+        this.buyers = buyers;
+    }
+
+    public boolean equals( Object obj ) {
+        if ( obj == null )
+            return false;
+        if ( obj == this )
+            return true;
+        if ( !( obj instanceof Seller ) )
+            return false;
+
+        return ( (Seller) obj ).getId().equals( getId() );
+    }
+
+    public int hashCode() {
+        return id.hashCode();
+    }
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/alias/Seller.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/alias/mapping.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/alias/mapping.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/alias/mapping.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping SYSTEM
+			"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping package="org.hibernate.test.unionsubclass.alias">
+
+	<class name="Seller">
+		<composite-id class="PersonID" name="id">
+			<key-property column="NR_RZBK" name="num" />
+			<key-property column="TXT_OID" name="name" />
+		</composite-id>
+		<set cascade="persist, merge, save-update" inverse="true" lazy="false"
+			name="buyers">
+			<key>
+				<column name="NR_RZBK" />
+				<column name="TXT_OID_TESTB" />
+			</key>
+			<one-to-many class="CarBuyer" />
+		</set>
+	</class>
+
+	<class abstract="true" name="Customer">
+		<composite-id class="PersonID" name="id">
+			<key-property column="NR_RZBK" name="num" />
+			<key-property column="TXT_OID" name="name" />
+		</composite-id>
+		<union-subclass name="CarBuyer">
+			<property column="PID" name="pid" update="false" />
+			<property column="TXT_OID_TESTB" name="sellerName" />
+			<many-to-one cascade="persist, merge, save-update" class="Seller"
+				insert="false" name="seller" update="false">
+				<column name="NR_RZBK" />
+				<column name="TXT_OID_TESTB" />
+			</many-to-one>
+		</union-subclass>
+	</class>
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass/alias/mapping.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass2/Address.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass2/Address.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass2/Address.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,11 @@
+//$Id: Address.java 7192 2005-06-18 14:40:15Z oneovthafew $
+package org.hibernate.test.unionsubclass2;
+
+/**
+ * @author Gavin King
+ */
+public class Address {
+	public String address;
+	public String zip;
+	public String country;
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass2/Address.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass2/Customer.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass2/Customer.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass2/Customer.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,35 @@
+//$Id: Customer.java 7192 2005-06-18 14:40:15Z oneovthafew $
+package org.hibernate.test.unionsubclass2;
+
+/**
+ * @author Gavin King
+ */
+public class Customer extends Person {
+	private Employee salesperson;
+	private String comments;
+
+	/**
+	 * @return Returns the salesperson.
+	 */
+	public Employee getSalesperson() {
+		return salesperson;
+	}
+	/**
+	 * @param salesperson The salesperson to set.
+	 */
+	public void setSalesperson(Employee salesperson) {
+		this.salesperson = salesperson;
+	}
+	/**
+	 * @return Returns the comments.
+	 */
+	public String getComments() {
+		return comments;
+	}
+	/**
+	 * @param comments The comments to set.
+	 */
+	public void setComments(String comments) {
+		this.comments = comments;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass2/Customer.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass2/Employee.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass2/Employee.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass2/Employee.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,62 @@
+//$Id: Employee.java 7192 2005-06-18 14:40:15Z oneovthafew $
+package org.hibernate.test.unionsubclass2;
+
+import java.math.BigDecimal;
+
+/**
+ * @author Gavin King
+ */
+public class Employee extends Person {
+	private String title;
+	private BigDecimal salary;
+	private double passwordExpiryDays;	
+	private Employee manager;
+	/**
+	 * @return Returns the title.
+	 */
+	public String getTitle() {
+		return title;
+	}
+	/**
+	 * @param title The title to set.
+	 */
+	public void setTitle(String title) {
+		this.title = title;
+	}
+	/**
+	 * @return Returns the manager.
+	 */
+	public Employee getManager() {
+		return manager;
+	}
+	/**
+	 * @param manager The manager to set.
+	 */
+	public void setManager(Employee manager) {
+		this.manager = manager;
+	}
+	/**
+	 * @return Returns the salary.
+	 */
+	public BigDecimal getSalary() {
+		return salary;
+	}
+	/**
+	 * @param salary The salary to set.
+	 */
+	public void setSalary(BigDecimal salary) {
+		this.salary = salary;
+	}
+	/**
+	 * @return The password expiry policy in days.
+	 */
+	public double getPasswordExpiryDays() {
+		return passwordExpiryDays;
+	}
+	/**
+	 * @param passwordExpiryDays The password expiry policy in days. 
+	 */
+	public void setPasswordExpiryDays(double passwordExpiryDays) {
+		this.passwordExpiryDays = passwordExpiryDays;
+	}	
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass2/Employee.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass2/Person.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass2/Person.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass2/Person.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,73 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+
+  This mapping demonstrates 
+
+     (1) a table-per-subclass mapping strategy
+         
+     (2) a simple component mapping
+     
+     (3) recursive associations withing an inheritance tree
+     
+-->
+
+<hibernate-mapping 
+	package="org.hibernate.test.unionsubclass2"
+	default-access="field">
+	
+	<class name="Person" table="UPerson">
+		
+		<id name="id" 
+			column="person_id" 
+			unsaved-value="0">
+			<generator class="increment"/>
+		</id>
+				
+		<property name="name" 
+			unique-key="NameUniqueKey"
+			not-null="true"
+			length="80"/>
+		<property name="sex" 
+			not-null="true"
+			update="false"/>
+		<property name="heightInches">
+			<column name="height_centimeters" 
+				not-null="true" 
+				read="height_centimeters / 2.54" 
+				write="? * 2.54"/>
+		</property>			
+		
+		<component name="address">
+			<property name="address" index="AddressIndex"/>
+			<property name="zip" index="AddressIndex"/>
+			<property name="country"/>
+		</component>
+		
+		<union-subclass name="Employee" table="UEmployee">
+				<property name="title" 
+					not-null="true" 
+					length="20"/>
+				<property name="salary" 
+					length="0"/>
+				<property name="passwordExpiryDays">
+					<column name="pwd_expiry_weeks" 
+						not-null="true" 
+						read="pwd_expiry_weeks * 7.0" 
+						write="? / 7.0"/>
+				</property>					
+				<many-to-one name="manager"/>
+		</union-subclass>
+		
+		<union-subclass name="Customer" table="UCustomer">
+				<property name="comments"/>
+				<many-to-one name="salesperson"/>
+		</union-subclass>
+		
+	</class>
+	
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass2/Person.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass2/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass2/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass2/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,82 @@
+//$Id: Person.java 7192 2005-06-18 14:40:15Z oneovthafew $
+package org.hibernate.test.unionsubclass2;
+
+
+/**
+ * @author Gavin King
+ */
+public class Person {
+	private long id;
+	private String name;
+	private char sex;
+	private double heightInches;
+	private Address address = new Address();
+	/**
+	 * @return Returns the address.
+	 */
+	public Address getAddress() {
+		return address;
+	}
+
+	public void setAddress(String string) {
+		this.address.address = string;
+	}
+
+	public void setZip(String string) {
+		this.address.zip = string;
+	}
+
+	public void setCountry(String string) {
+		this.address.country = string;
+	}
+
+	
+	/**
+	 * @return Returns the sex.
+	 */
+	public char getSex() {
+		return sex;
+	}
+	/**
+	 * @param sex The sex to set.
+	 */
+	public void setSex(char sex) {
+		this.sex = sex;
+	}
+	/**
+	 * @return Returns the id.
+	 */
+	public long getId() {
+		return id;
+	}
+	/**
+	 * @param id The id to set.
+	 */
+	public void setId(long id) {
+		this.id = id;
+	}
+	/**
+	 * @return Returns the identity.
+	 */
+	public String getName() {
+		return name;
+	}
+	/**
+	 * @param identity The identity to set.
+	 */
+	public void setName(String identity) {
+		this.name = identity;
+	}
+	/**
+	 * @return Returns the height in inches.
+	 */
+	public double getHeightInches() {
+		return heightInches;
+	}
+	/**
+	 * @param heightInches The height in inches to set.
+	 */
+	public void setHeightInches(double heightInches) {
+		this.heightInches = heightInches;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass2/Person.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass2/UnionSubclassTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass2/UnionSubclassTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass2/UnionSubclassTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,225 @@
+//$Id: UnionSubclassTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.unionsubclass2;
+
+import java.math.BigDecimal;
+import java.util.Iterator;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.criterion.Property;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.dialect.HSQLDialect;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Gavin King
+ */
+public class UnionSubclassTest extends FunctionalTestCase {
+	
+	public UnionSubclassTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "unionsubclass2/Person.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( UnionSubclassTest.class );
+	}
+
+	public void testUnionSubclass() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		
+		Employee mark = new Employee();
+		mark.setName("Mark");
+		mark.setTitle("internal sales");
+		mark.setSex('M');
+		mark.setAddress("buckhead");
+		mark.setZip("30305");
+		mark.setCountry("USA");
+		
+		Customer joe = new Customer();
+		joe.setName("Joe");
+		joe.setAddress("San Francisco");
+		joe.setZip("XXXXX");
+		joe.setCountry("USA");
+		joe.setComments("Very demanding");
+		joe.setSex('M');
+		joe.setSalesperson(mark);
+		
+		Person yomomma = new Person();
+		yomomma.setName("mum");
+		yomomma.setSex('F');
+		
+		s.save(yomomma);
+		s.save(mark);
+		s.save(joe);
+		
+		assertEquals( s.createQuery("from java.io.Serializable").list().size(), 0 );
+		
+		assertEquals( s.createQuery("from Person").list().size(), 3 );
+		assertEquals( s.createQuery("from Person p where p.class = Customer").list().size(), 1 );
+		assertEquals( s.createQuery("from Person p where p.class = Person").list().size(), 1 );
+		s.clear();
+
+		List customers = s.createQuery("from Customer c left join fetch c.salesperson").list();
+		for ( Iterator iter = customers.iterator(); iter.hasNext(); ) {
+			Customer c = (Customer) iter.next();
+			assertTrue( Hibernate.isInitialized( c.getSalesperson() ) );
+			assertEquals( c.getSalesperson().getName(), "Mark" );
+		}
+		assertEquals( customers.size(), 1 );
+		s.clear();
+		
+		customers = s.createQuery("from Customer").list();
+		for ( Iterator iter = customers.iterator(); iter.hasNext(); ) {
+			Customer c = (Customer) iter.next();
+			assertFalse( Hibernate.isInitialized( c.getSalesperson() ) );
+			assertEquals( c.getSalesperson().getName(), "Mark" );
+		}
+		assertEquals( customers.size(), 1 );
+		s.clear();
+		
+
+		mark = (Employee) s.get( Employee.class, new Long( mark.getId() ) );
+		joe = (Customer) s.get( Customer.class, new Long( joe.getId() ) );
+		
+ 		mark.setZip("30306");
+		assertEquals( s.createQuery("from Person p where p.address.zip = '30306'").list().size(), 1 );
+
+        s.createCriteria( Person.class ).add(
+                Restrictions.in( "address", new Address[] { mark.getAddress(),
+                        joe.getAddress() } ) ).list();
+		
+		s.delete(mark);
+		s.delete(joe);
+		s.delete(yomomma);
+		assertTrue( s.createQuery("from Person").list().isEmpty() );
+		t.commit();
+		s.close();
+	}
+	
+	public void testQuerySubclassAttribute() {
+		if ( getDialect() instanceof HSQLDialect ) {
+			return; // TODO : why??
+		}
+		
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Person p = new Person();
+		p.setName("Emmanuel");
+		p.setSex('M');
+		s.persist(p);
+		Employee q = new Employee();
+		q.setName("Steve");
+		q.setSex('M');
+		q.setTitle("Mr");
+		q.setSalary( new BigDecimal(1000) );
+		s.persist(q);
+
+		List result = s.createQuery("from Person where salary > 100").list();
+		assertEquals( result.size(), 1 );
+		assertSame( result.get(0), q );
+		
+		result = s.createQuery("from Person where salary > 100 or name like 'E%'").list();
+		assertEquals( result.size(), 2 );		
+
+		result = s.createCriteria(Person.class)
+			.add( Property.forName("salary").gt( new BigDecimal(100) ) )
+			.list();
+		assertEquals( result.size(), 1 );
+		assertSame( result.get(0), q );
+
+		result = s.createQuery("select salary from Person where salary > 100").list();
+		assertEquals( result.size(), 1 );
+		assertEquals( ( (BigDecimal) result.get(0) ).intValue(), 1000 );
+		
+		s.delete(p);
+		s.delete(q);
+		t.commit();
+		s.close();
+	}
+
+	public void testCustomColumnReadAndWrite() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		final double HEIGHT_INCHES = 73;
+		final double HEIGHT_CENTIMETERS = HEIGHT_INCHES * 2.54d;
+		Person p = new Person();
+		p.setName("Emmanuel");
+		p.setSex('M');
+		p.setHeightInches(HEIGHT_INCHES);
+		s.persist(p);
+		final double PASSWORD_EXPIRY_WEEKS = 4;
+		final double PASSWORD_EXPIRY_DAYS = PASSWORD_EXPIRY_WEEKS * 7d;
+		Employee e = new Employee();
+		e.setName("Steve");
+		e.setSex('M');
+		e.setTitle("Mr");		
+		e.setPasswordExpiryDays(PASSWORD_EXPIRY_DAYS);
+		s.persist(e);
+		s.flush();
+		
+		// Test value conversion during insert
+		Double heightViaSql = (Double)s.createSQLQuery("select height_centimeters from UPerson where name='Emmanuel'").uniqueResult();
+		assertEquals(HEIGHT_CENTIMETERS, heightViaSql, 0.01d);
+		Double expiryViaSql = (Double)s.createSQLQuery("select pwd_expiry_weeks from UEmployee where person_id=?")
+			.setLong(0, e.getId())
+			.uniqueResult();
+		assertEquals(PASSWORD_EXPIRY_WEEKS, expiryViaSql, 0.01d);
+		
+		// Test projection
+		Double heightViaHql = (Double)s.createQuery("select p.heightInches from Person p where p.name = 'Emmanuel'").uniqueResult();
+		assertEquals(HEIGHT_INCHES, heightViaHql, 0.01d);
+		Double expiryViaHql = (Double)s.createQuery("select e.passwordExpiryDays from Employee e where e.name = 'Steve'").uniqueResult();
+		assertEquals(PASSWORD_EXPIRY_DAYS, expiryViaHql, 0.01d);
+		
+		// Test restriction and entity load via criteria
+		p = (Person)s.createCriteria(Person.class)
+			.add(Restrictions.between("heightInches", HEIGHT_INCHES - 0.01d, HEIGHT_INCHES + 0.01d))
+			.uniqueResult();
+		assertEquals(HEIGHT_INCHES, p.getHeightInches(), 0.01d);
+		e = (Employee)s.createCriteria(Employee.class)
+			.add(Restrictions.between("passwordExpiryDays", PASSWORD_EXPIRY_DAYS - 0.01d, PASSWORD_EXPIRY_DAYS + 0.01d))
+			.uniqueResult();
+		assertEquals(PASSWORD_EXPIRY_DAYS, e.getPasswordExpiryDays(), 0.01d);
+		
+		// Test predicate and entity load via HQL
+		p = (Person)s.createQuery("from Person p where p.heightInches between ? and ?")
+			.setDouble(0, HEIGHT_INCHES - 0.01d)
+			.setDouble(1, HEIGHT_INCHES + 0.01d)
+			.uniqueResult();
+		assertEquals(HEIGHT_INCHES, p.getHeightInches(), 0.01d);
+		e = (Employee)s.createQuery("from Employee e where e.passwordExpiryDays between ? and ?")
+			.setDouble(0, PASSWORD_EXPIRY_DAYS - 0.01d)
+			.setDouble(1, PASSWORD_EXPIRY_DAYS + 0.01d)
+			.uniqueResult();
+		assertEquals(PASSWORD_EXPIRY_DAYS, e.getPasswordExpiryDays(), 0.01d);
+		
+		// Test update
+		p.setHeightInches(1);
+		e.setPasswordExpiryDays(7);
+		s.flush();
+		heightViaSql = (Double)s.createSQLQuery("select height_centimeters from UPerson where name='Emmanuel'").uniqueResult();
+		assertEquals(2.54d, heightViaSql, 0.01d);
+		expiryViaSql = (Double)s.createSQLQuery("select pwd_expiry_weeks from UEmployee where person_id=?")
+			.setLong(0, e.getId())
+			.uniqueResult();
+		assertEquals(1d, expiryViaSql, 0.01d);
+		s.delete(p);
+		s.delete(e);
+		t.commit();
+		s.close();
+		
+	}
+	
+	
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/unionsubclass2/UnionSubclassTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/Email.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/Email.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/Email.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,39 @@
+//$Id$
+package org.hibernate.test.usercollection.basic;
+
+/**
+ * @author Gavin King
+ */
+public class Email {
+	
+	private Long id;
+	private String address;
+	
+	Email() {}
+	
+	public String getAddress() {
+		return address;
+	}
+	public void setAddress(String type) {
+		this.address = type;
+	}
+	public Email(String type) {
+		this.address = type;
+	}
+	public boolean equals(Object that) {
+		if ( !(that instanceof Email) ) return false;
+		Email p = (Email) that;
+		return this.address.equals(p.address);
+	}
+	public int hashCode() {
+		return address.hashCode();
+	}
+	
+	public Long getId() {
+		return id;
+	}
+	
+	private void setId(Long id) {
+		this.id = id;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/Email.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/IMyList.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/IMyList.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/IMyList.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,7 @@
+package org.hibernate.test.usercollection.basic;
+
+import java.util.List;
+
+public interface IMyList extends List {
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/IMyList.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/MyList.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/MyList.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/MyList.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,14 @@
+package org.hibernate.test.usercollection.basic;
+
+import java.util.ArrayList;
+
+/**
+ * A custom collection class. We extend a java.util.Collection class, but that is not required. 
+ * It could be totally non-java-collection type, but then we would need to implement all the PersistentCollection methods.
+ * 
+ * @author max
+ *
+ */
+public class MyList extends ArrayList implements IMyList {
+	
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/MyList.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/MyListType.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/MyListType.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/MyListType.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,60 @@
+package org.hibernate.test.usercollection.basic;
+
+import java.util.Iterator;
+import java.util.Map;
+
+import org.hibernate.EntityMode;
+import org.hibernate.HibernateException;
+import org.hibernate.collection.PersistentCollection;
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.persister.collection.CollectionPersister;
+import org.hibernate.usertype.UserCollectionType;
+
+public class MyListType implements UserCollectionType {
+
+	static int lastInstantiationRequest = -2;
+
+	public PersistentCollection instantiate(SessionImplementor session, CollectionPersister persister) throws HibernateException {
+		return new PersistentMyList(session);
+	}
+
+	public PersistentCollection wrap(SessionImplementor session, Object collection) {
+		if ( session.getEntityMode()==EntityMode.DOM4J ) {
+			throw new IllegalStateException("dom4j not supported");
+		}
+		else {
+			return new PersistentMyList( session, (IMyList) collection );
+		}
+	}
+
+	public Iterator getElementsIterator(Object collection) {
+		return ( (IMyList) collection ).iterator();
+	}
+
+	public boolean contains(Object collection, Object entity) {
+		return ( (IMyList) collection ).contains(entity);
+	}
+
+	public Object indexOf(Object collection, Object entity) {
+		int l = ( (IMyList) collection ).indexOf(entity);
+		if(l<0) {
+			return null;
+		} else {
+			return new Integer(l);
+		}
+	}
+
+	public Object replaceElements(Object original, Object target, CollectionPersister persister, Object owner, Map copyCache, SessionImplementor session) throws HibernateException {
+		IMyList result = (IMyList) target;
+		result.clear();
+		result.addAll((MyList)original);
+		return result;
+	}
+
+	public Object instantiate(int anticipatedSize) {
+		lastInstantiationRequest = anticipatedSize;
+		return new MyList();
+	}
+
+	
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/MyListType.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/PersistentMyList.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/PersistentMyList.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/PersistentMyList.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,18 @@
+package org.hibernate.test.usercollection.basic;
+
+import org.hibernate.collection.PersistentList;
+import org.hibernate.engine.SessionImplementor;
+
+public class PersistentMyList extends PersistentList implements IMyList {
+
+	public PersistentMyList(SessionImplementor session) {
+		super(session);
+	}
+
+	public PersistentMyList(SessionImplementor session, IMyList list) {
+		super(session, list);
+	}
+
+	
+	
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/PersistentMyList.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/User.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/User.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/User.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,39 @@
+//$Id$
+package org.hibernate.test.usercollection.basic;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Gavin King
+ */
+public class User {
+	private String userName;
+	private IMyList emailAddresses = new MyList();
+	private Map sessionData = new HashMap();
+
+	User() {}
+	public User(String name) {
+		userName = name;
+	}
+	
+	public String getUserName() {
+		return userName;
+	}
+	public void setUserName(String userName) {
+		this.userName = userName;
+	}
+	public List getEmailAddresses() {
+		return emailAddresses;
+	}
+	public void setEmailAddresses(IMyList emailAddresses) {
+		this.emailAddresses = emailAddresses;
+	}
+	public Map getSessionData() {
+		return sessionData;
+	}
+	public void setSessionData(Map sessionData) {
+		this.sessionData = sessionData;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/User.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/UserCollectionTypeTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/UserCollectionTypeTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/UserCollectionTypeTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,63 @@
+//$Id $
+package org.hibernate.test.usercollection.basic;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Max Rydahl Andersen
+ */
+public class UserCollectionTypeTest extends FunctionalTestCase {
+	
+	public UserCollectionTypeTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "usercollection/basic/UserPermissions.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( UserCollectionTypeTest.class );
+	}
+
+	public void testBasicOperation() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		User u = new User("max");
+		u.getEmailAddresses().add( new Email("max at hibernate.org") );
+		u.getEmailAddresses().add( new Email("max.andersen at jboss.com") );
+		s.persist(u);
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		User u2 = (User) s.createCriteria(User.class).uniqueResult();
+		assertTrue( Hibernate.isInitialized( u2.getEmailAddresses() ) );
+		assertEquals( u2.getEmailAddresses().size(), 2 );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		u2 = ( User ) s.get( User.class, u.getUserName() );
+		u2.getEmailAddresses().size();
+		assertEquals( 2, MyListType.lastInstantiationRequest );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete( u );
+		t.commit();
+		s.close();
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/UserCollectionTypeTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/UserPermissions.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/UserPermissions.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/UserPermissions.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+    This mapping is a basic example of how to write a UserCollectionType.
+-->
+
+<hibernate-mapping package="org.hibernate.test.usercollection.basic">
+	
+	<import class="Permission"/>
+
+	<class name="User" table="UC_BSC_USER">
+		<id name="userName"/>
+		<list name="emailAddresses" fetch="join" cascade="all, delete-orphan" collection-type="org.hibernate.test.usercollection.basic.MyListType">
+			<key column="userName"/>
+			<list-index column="displayOrder" base="1"/>
+			<one-to-many class="Email"/>
+		</list>		
+	</class>
+
+    <class name="Email">
+    	<id name="id">
+    	 <generator class="native"/>
+    	</id>
+    	<property name="address"/>
+    </class>	
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/basic/UserPermissions.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/parameterized/DefaultableList.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/parameterized/DefaultableList.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/parameterized/DefaultableList.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,13 @@
+package org.hibernate.test.usercollection.parameterized;
+
+import java.util.List;
+
+/**
+ * Our specialized collection contract
+ *
+ * @author Holger Brands
+ * @author Steve Ebersole
+ */
+public interface DefaultableList extends List {
+    public String getDefaultValue();
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/parameterized/DefaultableList.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/parameterized/DefaultableListImpl.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/parameterized/DefaultableListImpl.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/parameterized/DefaultableListImpl.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,28 @@
+package org.hibernate.test.usercollection.parameterized;
+
+import java.util.ArrayList;
+
+/**
+ * Implementation of our specialized collection contract
+ *
+ * @author Holger Brands
+ * @author Steve Ebersole
+ */
+public class DefaultableListImpl extends ArrayList implements DefaultableList {
+    private String defaultValue;
+
+	public DefaultableListImpl() {
+	}
+
+	public DefaultableListImpl(int anticipatedSize) {
+		super( anticipatedSize + ( int ) Math.ceil( anticipatedSize * .75f ) );
+	}
+
+	public String getDefaultValue() {
+        return defaultValue;
+    }
+
+    public void setDefaultValue(String defaultValue) {
+        this.defaultValue = defaultValue;
+    }
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/parameterized/DefaultableListImpl.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/parameterized/DefaultableListType.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/parameterized/DefaultableListType.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/parameterized/DefaultableListType.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,75 @@
+package org.hibernate.test.usercollection.parameterized;
+
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Properties;
+import java.util.List;
+
+import org.hibernate.usertype.UserCollectionType;
+import org.hibernate.usertype.ParameterizedType;
+import org.hibernate.collection.PersistentCollection;
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.persister.collection.CollectionPersister;
+import org.hibernate.EntityMode;
+
+/**
+ * Our Hibernate type-system extension for defining our specialized collection
+ * contract.
+ *
+ * @author Holger Brands
+ * @author Steve Ebersole
+ */
+public class DefaultableListType implements UserCollectionType, ParameterizedType {
+    private String defaultValue;
+
+	public Object instantiate(int anticipatedSize) {
+		DefaultableListImpl list = anticipatedSize < 0 ? new DefaultableListImpl() : new DefaultableListImpl( anticipatedSize );
+		list.setDefaultValue( defaultValue );
+		return list;
+	}
+
+	public PersistentCollection instantiate(
+			SessionImplementor session,
+			CollectionPersister persister) {
+		return new PersistentDefaultableList( session );
+	}
+
+	public PersistentCollection wrap(SessionImplementor session, Object collection) {
+		if ( session.getEntityMode() == EntityMode.DOM4J ) {
+			throw new IllegalStateException( "dom4j not supported" );
+		}
+		else {
+			return new PersistentDefaultableList( session, ( List ) collection );
+		}
+	}
+
+	public Iterator getElementsIterator(Object collection) {
+		return ( ( DefaultableList ) collection ).iterator();
+	}
+
+	public boolean contains(Object collection, Object entity) {
+		return ( ( DefaultableList ) collection ).contains( entity );
+	}
+
+	public Object indexOf(Object collection, Object entity) {
+		int index = ( ( DefaultableList ) collection ).indexOf( entity );
+		return index >= 0 ? new Integer( index ) : null;
+	}
+
+	public Object replaceElements(
+			Object original,
+			Object target,
+			CollectionPersister persister,
+			Object owner,
+			Map copyCache,
+			SessionImplementor session) {
+		DefaultableList result = ( DefaultableList ) target;
+		result.clear();
+		result.addAll( ( DefaultableList ) original );
+		return result;
+	}
+
+	public void setParameterValues(Properties parameters) {
+        defaultValue = parameters.getProperty( "default" );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/parameterized/DefaultableListType.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/parameterized/Entity.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/parameterized/Entity.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/parameterized/Entity.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,33 @@
+package org.hibernate.test.usercollection.parameterized;
+
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * Our test entity
+ *
+ * @author Steve Ebersole
+ */
+public class Entity {
+	private String name;
+	private List values = new ArrayList();
+
+	public Entity() {
+	}
+
+	public Entity(String name) {
+		this.name = name;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public List getValues() {
+		return values;
+	}
+
+	public void setValues(List values) {
+		this.values = values;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/parameterized/Entity.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/parameterized/Mapping.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/parameterized/Mapping.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/parameterized/Mapping.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.usercollection.parameterized" default-access="field">
+
+    <typedef name="DefaultableList" class="org.hibernate.test.usercollection.parameterized.DefaultableListType">
+        <param name="default">Hello</param>
+    </typedef>
+
+    <class name="Entity">
+        <id name="name" type="string"/>
+        <list name="values" fetch="join" table="ENT_VAL" collection-type="DefaultableList">
+            <key column="ENT_ID"/>
+            <list-index column="POS"/>
+            <element type="string" column="VAL"/>
+        </list>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/parameterized/Mapping.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/parameterized/ParameterizedUserCollectionTypeTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/parameterized/ParameterizedUserCollectionTypeTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/parameterized/ParameterizedUserCollectionTypeTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,49 @@
+package org.hibernate.test.usercollection.parameterized;
+
+import junit.framework.Test;
+
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.Hibernate;
+
+/**
+ * Tes for parameterized user collection types.
+ *
+ * @author Holger Brands
+ * @author Steve Ebersole
+ */
+public class ParameterizedUserCollectionTypeTest extends FunctionalTestCase {
+	public ParameterizedUserCollectionTypeTest(String string) {
+		super( string );
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( ParameterizedUserCollectionTypeTest.class );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "usercollection/parameterized/Mapping.hbm.xml" };
+	}
+
+	public void testBasicOperation() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Entity entity = new Entity( "tester" );
+		entity.getValues().add( "value-1" );
+		s.persist( entity );
+		t.commit();
+		s.close();
+
+		s = openSession();
+		t = s.beginTransaction();
+		entity = ( Entity ) s.get( Entity.class, "tester" );
+		assertTrue( Hibernate.isInitialized( entity.getValues() ) );
+		assertEquals( 1, entity.getValues().size() );
+        assertEquals( "Hello", ( ( DefaultableList ) entity.getValues() ).getDefaultValue() );
+		s.delete( entity );
+		t.commit();
+		s.close();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/parameterized/ParameterizedUserCollectionTypeTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/parameterized/PersistentDefaultableList.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/parameterized/PersistentDefaultableList.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/parameterized/PersistentDefaultableList.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,29 @@
+package org.hibernate.test.usercollection.parameterized;
+
+import java.util.List;
+
+import org.hibernate.collection.PersistentList;
+import org.hibernate.engine.SessionImplementor;
+
+/**
+ * The "persistent wrapper" around our specialized collection contract
+ *
+ * @author Holger Brands
+ * @author Steve Ebersole
+ */
+public class PersistentDefaultableList extends PersistentList implements DefaultableList {
+	public PersistentDefaultableList(SessionImplementor session) {
+		super( session );
+	}
+
+	public PersistentDefaultableList(SessionImplementor session, List list) {
+		super( session, list );
+	}
+
+	public PersistentDefaultableList() {
+	}
+
+	public String getDefaultValue() {
+		return ( ( DefaultableList ) this.list ).getDefaultValue();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/usercollection/parameterized/PersistentDefaultableList.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/PropertiesHelperTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/PropertiesHelperTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/PropertiesHelperTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,109 @@
+package org.hibernate.test.util;
+
+import java.util.Properties;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.hibernate.testing.junit.UnitTestCase;
+import org.hibernate.util.PropertiesHelper;
+
+/**
+ * @author Steve Ebersole
+ */
+public class PropertiesHelperTest extends UnitTestCase {
+
+	private Properties props;
+
+	public PropertiesHelperTest(String string) {
+		super( string );
+	}
+
+	public static Test suite() {
+		return new TestSuite( PropertiesHelperTest.class );
+	}
+
+	protected void setUp() throws Exception {
+		props = new Properties();
+
+		props.setProperty( "my.nonexistent.prop", "${}" );
+
+		props.setProperty( "my.string.prop", "${test.my.sys.string.prop}" );
+		System.setProperty( "test.my.sys.string.prop", "string" );
+
+		props.setProperty( "my.boolean.prop", "${test.my.sys.boolean.prop}" );
+		System.setProperty( "test.my.sys.boolean.prop", "true" );
+
+		props.setProperty( "my.int.prop", "${test.my.sys.int.prop}" );
+		System.setProperty( "test.my.sys.int.prop", "1" );
+
+		props.setProperty( "my.integer.prop", "${test.my.sys.integer.prop}" );
+		System.setProperty( "test.my.sys.integer.prop", "1" );
+
+		props.setProperty( "partial.prop1", "${somedir}/middle/dir/${somefile}" );
+		props.setProperty( "partial.prop2", "basedir/${somedir}/myfile.txt" );
+		System.setProperty( "somedir", "tmp" );
+		System.setProperty( "somefile", "tmp.txt" );
+
+		props.setProperty( "parse.error", "steve" );
+	}
+
+	public void testPlaceholderReplacement() {
+		PropertiesHelper.resolvePlaceHolders( props );
+
+		String str = PropertiesHelper.getString( "my.nonexistent.prop", props, "did.not.exist" );
+		assertEquals( "did.not.exist", str );
+		str = PropertiesHelper.getString( "my.nonexistent.prop", props, null );
+		assertNull( str );
+		str = PropertiesHelper.getString( "my.string.prop", props, "na" );
+		assertEquals( "replacement did not occur", "string", str );
+		str = PropertiesHelper.getString( "my.string.prop", props, "did.not.exist" );
+		assertEquals( "replacement did not occur", "string", str );
+
+		boolean bool = PropertiesHelper.getBoolean( "my.nonexistent.prop", props );
+		assertFalse( "non-exists as boolean", bool );
+		bool = PropertiesHelper.getBoolean( "my.nonexistent.prop", props, false );
+		assertFalse( "non-exists as boolean", bool );
+		bool = PropertiesHelper.getBoolean( "my.nonexistent.prop", props, true );
+		assertTrue( "non-exists as boolean", bool );
+		bool = PropertiesHelper.getBoolean( "my.boolean.prop", props );
+		assertTrue( "boolean replacement did not occur", bool );
+		bool = PropertiesHelper.getBoolean( "my.boolean.prop", props, false );
+		assertTrue( "boolean replacement did not occur", bool );
+
+		int i = PropertiesHelper.getInt( "my.nonexistent.prop", props, -1 );
+		assertEquals( -1, i );
+		i = PropertiesHelper.getInt( "my.int.prop", props, 100 );
+		assertEquals( 1, i );
+
+		Integer I = PropertiesHelper.getInteger( "my.nonexistent.prop", props );
+		assertNull( I );
+		I = PropertiesHelper.getInteger( "my.integer.prop", props );
+		assertEquals( I, new Integer( 1 ) );
+
+		str = props.getProperty( "partial.prop1" );
+		assertEquals( "partial replacement (ends)", "tmp/middle/dir/tmp.txt", str );
+
+		str = props.getProperty( "partial.prop2" );
+		assertEquals( "partial replacement (midst)", "basedir/tmp/myfile.txt", str );
+	}
+
+	public void testParseExceptions() {
+		boolean b = PropertiesHelper.getBoolean( "parse.error", props );
+		assertFalse( "parse exception case - boolean", b );
+
+		try {
+			PropertiesHelper.getInt( "parse.error", props, 20 );
+			fail( "parse exception case - int" );
+		}
+		catch( NumberFormatException expected ) {
+		}
+
+		try {
+			PropertiesHelper.getInteger( "parse.error", props );
+			fail( "parse exception case - Integer" );
+		}
+		catch( NumberFormatException expected ) {
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/PropertiesHelperTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/StringHelperTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/StringHelperTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/StringHelperTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,32 @@
+package org.hibernate.test.util;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.hibernate.testing.junit.UnitTestCase;
+import org.hibernate.util.StringHelper;
+
+/**
+ * @author Steve Ebersole
+ */
+public class StringHelperTest extends UnitTestCase {
+
+	public StringHelperTest(String string) {
+		super( string );
+	}
+
+	public static Test suite() {
+		return new TestSuite( StringHelperTest.class );
+	}
+
+	public void testAliasGeneration() {
+		assertSimpleAlias( "xyz", "xyz_" );
+		assertSimpleAlias( "_xyz", "xyz_" );
+		assertSimpleAlias( "!xyz", "xyz_" );
+		assertSimpleAlias( "abcdefghijklmnopqrstuvwxyz", "abcdefghij_" );
+	}
+
+	private void assertSimpleAlias(String source, String expected) {
+		assertEquals( expected, StringHelper.generateAlias( source ) );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/StringHelperTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/dtd/Child.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/dtd/Child.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/dtd/Child.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,36 @@
+package org.hibernate.test.util.dtd;
+
+/**
+ * The Child class.
+ *
+ * @author Steve Ebersole
+ */
+public class Child {
+	private Long id;
+	private int age;
+	private Parent parent;
+
+	public Child() {
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public Parent getParent() {
+		return parent;
+	}
+
+	public int getAge() {
+		return age;
+	}
+
+	public void setAge(int age) {
+		this.age = age;
+	}
+
+
+	/*package*/ void injectParent(Parent parent) {
+		this.parent = parent;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/dtd/Child.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/dtd/EntityResolverTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/dtd/EntityResolverTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/dtd/EntityResolverTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,32 @@
+package org.hibernate.test.util.dtd;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.hibernate.cfg.Configuration;
+import org.hibernate.testing.junit.UnitTestCase;
+
+
+/**
+ * @author Steve Ebersole
+ */
+public class EntityResolverTest extends UnitTestCase {
+
+	public EntityResolverTest(String name) {
+		super( name );
+	}
+
+	public static Test suite() {
+		return new TestSuite( EntityResolverTest.class );
+	}
+
+	public void testEntityIncludeResolution() {
+		// Parent.hbm.xml contains the following entity include:
+		//		<!ENTITY child SYSTEM "classpath://org/hibernate/test/util/dtd/child.xml">
+		// which we are expecting the Hibernate custom entity resolver to be able to resolve
+		// locally via classpath lookup.
+		Configuration cfg = new Configuration();
+		cfg.addResource( "org/hibernate/test/util/dtd/Parent.hbm.xml" );
+		cfg.buildMappings();
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/dtd/EntityResolverTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/dtd/Parent.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/dtd/Parent.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/dtd/Parent.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" [
+        <!ENTITY child SYSTEM "classpath://org/hibernate/test/util/dtd/child.xml">
+]>
+
+
+<hibernate-mapping package="org.hibernate.test.util.dtd" default-access="field">
+
+	<class name="Parent">
+		<id name="id" column="ID">
+            <generator class="increment"/>
+        </id>
+		<list name="children" inverse="true" cascade="persist,merge">
+			<key column="PRNT_ID" not-null="true"/>
+			<list-index column="SIBLING_ORD"/>
+			<one-to-many class="Child"/>
+		</list>
+	</class>
+
+    &child;
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/dtd/Parent.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/dtd/Parent.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/dtd/Parent.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/dtd/Parent.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,33 @@
+package org.hibernate.test.util.dtd;
+
+import java.util.Set;
+import java.util.HashSet;
+import java.util.Iterator;
+
+/**
+ * The Parent class.
+ *
+ * @author Steve Ebersole
+ */
+public class Parent {
+	private Long id;
+	private Set children = new HashSet();
+
+	public Long getId() {
+		return id;
+	}
+
+	public Iterator getChildren() {
+		return children.iterator();
+	}
+
+	public Child newChild() {
+		Child child = new Child();
+		child.setAge( 0 );
+
+		child.injectParent( this );
+		this.children.add( child );
+
+		return child;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/dtd/Parent.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/dtd/child.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/dtd/child.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/dtd/child.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,9 @@
+
+
+    <class name="Child">
+		<id name="id" column="ID">
+            <generator class="increment"/>
+        </id>
+		<property name="age" column="AGE" not-null="true"/>
+        <many-to-one name="parent" class="Parent" column="PRNT_ID"/>
+    </class>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/util/dtd/child.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/Person.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/Person.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/Person.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,43 @@
+//$Id: Person.java 7676 2005-07-29 06:27:10Z oneovthafew $
+package org.hibernate.test.version;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Person {
+	private String name;
+	private List things;
+	private List tasks;
+	private int version;
+	
+	Person() {}
+	public Person(String name) {
+		this.name = name;
+		this.things = new ArrayList();
+		this.tasks = new ArrayList();
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public List getThings() {
+		return things;
+	}
+	public void setThings(List things) {
+		this.things = things;
+	}
+	public int getVersion() {
+		return version;
+	}
+	public void setVersion(int version) {
+		this.version = version;
+	}
+	public List getTasks() {
+		return tasks;
+	}
+	public void setTasks(List tasks) {
+		this.tasks = tasks;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/Person.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/PersonThing.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/PersonThing.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/PersonThing.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,45 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!-- 
+    Demonstrates how to control the optimistic locking behavior
+    of a collection (do changes to the collection result in
+    a version increment on the owning instance)
+ -->
+<hibernate-mapping 
+		package="org.hibernate.test.version">
+
+	<class name="Person">
+		<id name="name"/>
+		<version name="version"/>
+		<bag name="things" 
+				inverse="true"
+				cascade="all,delete-orphan"> 
+			<key column="person"/>
+			<one-to-many class="Thing"/>	
+		</bag>
+		<bag name="tasks"
+				inverse="true"
+				cascade="all,delete-orphan"
+				optimistic-lock="false"> 
+			<key column="person"/>
+			<one-to-many class="Task"/>	
+		</bag>
+	</class>
+
+    <class name="Thing">
+    	<id name="description"/>
+    	<version name="version"/>
+    	<property name="longDescription"/>
+    	<many-to-one name="person"/>
+    </class>	
+
+    <class name="Task">
+    	<id name="description"/>
+    	<version name="version"/>
+    	<many-to-one name="person"/>
+    </class>	
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/PersonThing.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/Task.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/Task.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/Task.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,33 @@
+//$Id: Task.java 7676 2005-07-29 06:27:10Z oneovthafew $
+package org.hibernate.test.version;
+
+public class Task {
+	private String description;
+	private Person person;
+	private int version;
+	
+	public int getVersion() {
+		return version;
+	}
+	public void setVersion(int version) {
+		this.version = version;
+	}
+	Task() {}
+	public Task(String description, Person person) {
+		this.description = description;
+		this.person = person;
+		person.getTasks().add(this);
+	}
+	public String getDescription() {
+		return description;
+	}
+	public void setDescription(String description) {
+		this.description = description;
+	}
+	public Person getPerson() {
+		return person;
+	}
+	public void setPerson(Person person) {
+		this.person = person;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/Task.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/Thing.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/Thing.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/Thing.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,40 @@
+//$Id: Thing.java 7715 2005-08-01 16:46:57Z oneovthafew $
+package org.hibernate.test.version;
+
+public class Thing {
+	private String description;
+	private Person person;
+	private int version;
+	private String longDescription;
+	
+	public int getVersion() {
+		return version;
+	}
+	public void setVersion(int version) {
+		this.version = version;
+	}
+	Thing() {}
+	public Thing(String description, Person person) {
+		this.description = description;
+		this.person = person;
+		person.getThings().add(this);
+	}
+	public String getDescription() {
+		return description;
+	}
+	public void setDescription(String description) {
+		this.description = description;
+	}
+	public Person getPerson() {
+		return person;
+	}
+	public void setPerson(Person person) {
+		this.person = person;
+	}
+	public String getLongDescription() {
+		return longDescription;
+	}
+	public void setLongDescription(String longDescription) {
+		this.longDescription = longDescription;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/Thing.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/VersionTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/VersionTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/VersionTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,135 @@
+//$Id: VersionTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.version;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Max Rydahl Andersen
+ */
+public class VersionTest extends FunctionalTestCase {
+	
+	public VersionTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "version/PersonThing.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( VersionTest.class );
+	}
+
+	public void testVersionShortCircuitFlush() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Person gavin = new Person("Gavin");
+		new Thing("Passport", gavin);
+		s.persist(gavin);
+		t.commit();
+		s.close();
+		
+		s = openSession();
+		t = s.beginTransaction();
+		Thing passp = (Thing) s.get(Thing.class, "Passport");
+		passp.setLongDescription("blah blah blah");
+		s.createQuery("from Person").list();
+		s.createQuery("from Person").list();
+		s.createQuery("from Person").list();
+		t.commit();
+		s.close();
+		
+		assertEquals( passp.getVersion(), 1 );
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.createQuery("delete from Thing").executeUpdate();
+		s.createQuery("delete from Person").executeUpdate();
+		t.commit();
+		s.close();
+	}
+	
+	public void testCollectionVersion() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Person gavin = new Person("Gavin");
+		new Thing("Passport", gavin);
+		s.persist(gavin);
+		t.commit();
+		s.close();
+		
+		assertEquals(0, gavin.getVersion());
+		
+		s = openSession();
+		t = s.beginTransaction();
+		gavin = (Person) s.createCriteria(Person.class).uniqueResult();
+		new Thing("Laptop", gavin);
+		t.commit();
+		s.close();
+		
+		assertEquals(1, gavin.getVersion());
+		assertFalse( Hibernate.isInitialized( gavin.getThings() ) );
+
+		s = openSession();
+		t = s.beginTransaction();
+		gavin = (Person) s.createCriteria(Person.class).uniqueResult();
+		gavin.getThings().clear();
+		t.commit();
+		s.close();
+		
+		assertEquals(2, gavin.getVersion());
+		assertTrue( Hibernate.isInitialized( gavin.getThings() ) );
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete(gavin);
+		t.commit();
+		s.close();
+	}
+	
+	public void testCollectionNoVersion() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Person gavin = new Person("Gavin");
+		new Task("Code", gavin);
+		s.persist(gavin);
+		t.commit();
+		s.close();
+		
+		assertEquals(0, gavin.getVersion());
+		
+		s = openSession();
+		t = s.beginTransaction();
+		gavin = (Person) s.createCriteria(Person.class).uniqueResult();
+		new Task("Document", gavin);
+		t.commit();
+		s.close();
+		
+		assertEquals(0, gavin.getVersion());
+		assertFalse( Hibernate.isInitialized( gavin.getTasks() ) );
+
+		s = openSession();
+		t = s.beginTransaction();
+		gavin = (Person) s.createCriteria(Person.class).uniqueResult();
+		gavin.getTasks().clear();
+		t.commit();
+		s.close();
+		
+		assertEquals(0, gavin.getVersion());
+		assertTrue( Hibernate.isInitialized( gavin.getTasks() ) );
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete(gavin);
+		t.commit();
+		s.close();
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/VersionTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/db/DbVersionTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/db/DbVersionTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/db/DbVersionTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,119 @@
+// $Id: DbVersionTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.version.db;
+
+import java.sql.Timestamp;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Implementation of DbVersionTest.
+ *
+ * @author Steve Ebersole
+ */
+public class DbVersionTest extends FunctionalTestCase {
+	public DbVersionTest(String x) {
+		super( x );
+	}
+
+	
+	public String[] getMappings() {
+		return new String[] { "version/db/User.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( DbVersionTest.class );
+	}
+
+	public void testCollectionVersion() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		User steve = new User( "steve" );
+		s.persist( steve );
+		Group admin = new Group( "admin" );
+		s.persist( admin );
+		t.commit();
+		s.close();
+
+		Timestamp steveTimestamp = steve.getTimestamp();
+
+		// For dialects (Oracle8 for example) which do not return "true
+		// timestamps" sleep for a bit to allow the db date-time increment...
+		Thread.sleep( 1500 );
+
+		s = openSession();
+		t = s.beginTransaction();
+		steve = ( User ) s.get( User.class, steve.getId() );
+		admin = ( Group ) s.get( Group.class, admin.getId() );
+		steve.getGroups().add( admin );
+		admin.getUsers().add( steve );
+		t.commit();
+		s.close();
+
+		assertFalse( "owner version not incremented", Hibernate.TIMESTAMP.isEqual( steveTimestamp, steve.getTimestamp() ) );
+
+		steveTimestamp = steve.getTimestamp();
+		Thread.sleep( 1500 );
+
+		s = openSession();
+		t = s.beginTransaction();
+		steve = ( User ) s.get( User.class, steve.getId() );
+		steve.getGroups().clear();
+		t.commit();
+		s.close();
+
+		assertFalse( "owner version not incremented", Hibernate.TIMESTAMP.isEqual( steveTimestamp, steve.getTimestamp() ) );
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete( s.load( User.class, steve.getId() ) );
+		s.delete( s.load( Group.class, admin.getId() ) );
+		t.commit();
+		s.close();
+	}
+
+
+	public void testCollectionNoVersion() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		User steve = new User( "steve" );
+		s.persist( steve );
+		Permission perm = new Permission( "silly", "user", "rw" );
+		s.persist( perm );
+		t.commit();
+		s.close();
+
+		Timestamp steveTimestamp = ( Timestamp ) steve.getTimestamp();
+
+		s = openSession();
+		t = s.beginTransaction();
+		steve = ( User ) s.get( User.class, steve.getId() );
+		perm = ( Permission ) s.get( Permission.class, perm.getId() );
+		steve.getPermissions().add( perm );
+		t.commit();
+		s.close();
+
+		assertTrue( "owner version was incremented", Hibernate.TIMESTAMP.isEqual( steveTimestamp, steve.getTimestamp() ) );
+
+		s = openSession();
+		t = s.beginTransaction();
+		steve = ( User ) s.get( User.class, steve.getId() );
+		steve.getPermissions().clear();
+		t.commit();
+		s.close();
+
+		assertTrue( "owner version was incremented", Hibernate.TIMESTAMP.isEqual( steveTimestamp, steve.getTimestamp() ) );
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete( s.load( User.class, steve.getId() ) );
+		s.delete( s.load( Permission.class, perm.getId() ) );
+		t.commit();
+		s.close();
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/db/DbVersionTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/db/Group.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/db/Group.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/db/Group.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,56 @@
+// $Id: Group.java 7736 2005-08-03 20:03:34Z steveebersole $
+package org.hibernate.test.version.db;
+
+import java.util.Date;
+import java.util.Set;
+
+/**
+ * Implementation of Group.
+ *
+ * @author Steve Ebersole
+ */
+public class Group {
+	private Long id;
+	private Date timestamp;
+	private String name;
+	private Set users;
+
+	public Group() {
+	}
+
+	public Group(String name) {
+		this.name = name;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Date getTimestamp() {
+		return timestamp;
+	}
+
+	public void setTimestamp(Date timestamp) {
+		this.timestamp = timestamp;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Set getUsers() {
+		return users;
+	}
+
+	public void setUsers(Set users) {
+		this.users = users;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/db/Group.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/db/Permission.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/db/Permission.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/db/Permission.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,66 @@
+// $Id: Permission.java 7736 2005-08-03 20:03:34Z steveebersole $
+package org.hibernate.test.version.db;
+
+import java.util.Date;
+
+/**
+ * Implementation of Permission.
+ *
+ * @author Steve Ebersole
+ */
+public class Permission {
+	private Long id;
+	private Date timestamp;
+	private String name;
+	private String context;
+	private String access;
+
+	public Permission() {
+	}
+
+	public Permission(String name, String context, String access) {
+		this.name = name;
+		this.context = context;
+		this.access = access;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Date getTimestamp() {
+		return timestamp;
+	}
+
+	public void setTimestamp(Date timestamp) {
+		this.timestamp = timestamp;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getContext() {
+		return context;
+	}
+
+	public void setContext(String context) {
+		this.context = context;
+	}
+
+	public String getAccess() {
+		return access;
+	}
+
+	public void setAccess(String access) {
+		this.access = access;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/db/Permission.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/db/User.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/db/User.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/db/User.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,55 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+    Demonstrates how to control the optimistic locking behavior
+    of a collection (do changes to the collection result in
+    a version increment on the owning instance)
+ -->
+<hibernate-mapping
+		package="org.hibernate.test.version.db">
+
+	<class name="User" table="db_vers_user">
+        <id name="id" column="user_id" type="long">
+            <generator class="native"/>
+        </id>
+        <timestamp name="timestamp" column="ts" source="db"/>
+        <!--<version name="timestamp" column="ts" type="org.hibernate.type.DbTimestampType"/>-->
+        <property name="username" column="user_name" type="string" unique="true"/>
+        <set name="groups" table="db_vers_user_group" batch-size="9" inverse="true" optimistic-lock="true" lazy="true" cascade="none" >
+            <key column="user_id"/>
+            <many-to-many column="group_id" class="Group" lazy="false" fetch="join" />
+        </set>
+        <set name="permissions" table="db_vers_user_perm" batch-size="9" inverse="false" optimistic-lock="false" lazy="true" cascade="none">
+            <key column="user_id"/>
+            <many-to-many column="perm_id" class="Permission" lazy="false" fetch="join"/>
+        </set>
+	</class>
+
+	<class name="Group" table="db_vers_group">
+        <id name="id" column="group_id" type="long">
+            <generator class="native"/>
+        </id>
+        <timestamp name="timestamp" column="ts" source="db"/>
+        <!--<version name="timestamp" column="ts" type="org.hibernate.type.DbTimestampType"/>-->
+        <property name="name" column="name" type="string" unique="true"/>
+        <set name="users" table="db_vers_user_group" batch-size="9" inverse="false" lazy="true" cascade="none" >
+            <key column="group_id"/>
+            <many-to-many column="user_id" class="User" lazy="false" fetch="join" />
+        </set>
+	</class>
+
+	<class name="Permission" table="db_vers_permission">
+        <id name="id" column="perm_id" type="long">
+            <generator class="native"/>
+        </id>
+        <timestamp name="timestamp" column="ts" source="db"/>
+        <!--<version name="timestamp" column="ts" type="org.hibernate.type.DbTimestampType"/>-->
+        <property name="name" column="name" type="string" unique="true"/>
+        <property name="context" column="ctx" type="string"/>
+        <property name="access" column="priv" type="string"/>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/db/User.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/db/User.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/db/User.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/db/User.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,65 @@
+// $Id: User.java 7736 2005-08-03 20:03:34Z steveebersole $
+package org.hibernate.test.version.db;
+
+import java.util.Set;
+import java.sql.Timestamp;
+
+/**
+ * Implementation of User.
+ *
+ * @author Steve Ebersole
+ */
+public class User {
+	private Long id;
+	private Timestamp timestamp;
+	private String username;
+	private Set groups;
+	private Set permissions;
+
+	public User() {
+	}
+
+	public User(String username) {
+		this.username = username;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Timestamp getTimestamp() {
+		return timestamp;
+	}
+
+	public void setTimestamp(Timestamp timestamp) {
+		this.timestamp = timestamp;
+	}
+
+	public String getUsername() {
+		return username;
+	}
+
+	public void setUsername(String username) {
+		this.username = username;
+	}
+
+	public Set getGroups() {
+		return groups;
+	}
+
+	public void setGroups(Set groups) {
+		this.groups = groups;
+	}
+
+	public Set getPermissions() {
+		return permissions;
+	}
+
+	public void setPermissions(Set permissions) {
+		this.permissions = permissions;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/db/User.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/sybase/Permission.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/sybase/Permission.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/sybase/Permission.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,66 @@
+// $Id: Permission.java 7805 2005-08-10 16:25:11Z steveebersole $
+package org.hibernate.test.version.sybase;
+
+import java.util.Date;
+
+/**
+ * Implementation of Permission.
+ *
+ * @author Steve Ebersole
+ */
+public class Permission {
+	private Long id;
+	private Date timestamp;
+	private String name;
+	private String context;
+	private String access;
+
+	public Permission() {
+	}
+
+	public Permission(String name, String context, String access) {
+		this.name = name;
+		this.context = context;
+		this.access = access;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Date getTimestamp() {
+		return timestamp;
+	}
+
+	public void setTimestamp(Date timestamp) {
+		this.timestamp = timestamp;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getContext() {
+		return context;
+	}
+
+	public void setContext(String context) {
+		this.context = context;
+	}
+
+	public String getAccess() {
+		return access;
+	}
+
+	public void setAccess(String access) {
+		this.access = access;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/sybase/Permission.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/sybase/SybaseTimestampVersioningTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/sybase/SybaseTimestampVersioningTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/sybase/SybaseTimestampVersioningTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,202 @@
+// $Id: SybaseTimestampVersioningTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.version.sybase;
+
+import junit.framework.Test;
+
+import org.hibernate.Hibernate;
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.dialect.SybaseDialect;
+import org.hibernate.testing.junit.functional.DatabaseSpecificFunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * Implementation of VersionTest.
+ *
+ * @author Steve Ebersole
+ */
+public class SybaseTimestampVersioningTest extends DatabaseSpecificFunctionalTestCase {
+
+	public SybaseTimestampVersioningTest(String x) {
+		super( x );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "version/sybase/User.hbm.xml" };
+	}
+
+	public boolean appliesTo(Dialect dialect) {
+		return dialect instanceof SybaseDialect;
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( SybaseTimestampVersioningTest.class );
+	}
+
+	public void testLocking() throws Throwable {
+		// First, create the needed row...
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		User steve = new User( "steve" );
+		s.persist( steve );
+		t.commit();
+		s.close();
+
+		// next open two sessions, and try to update from each "simultaneously"...
+		Session s1 = null;
+		Session s2 = null;
+		Transaction t1 = null;
+		Transaction t2 = null;
+		try {
+			s1 = getSessions().openSession();
+			t1 = s1.beginTransaction();
+			s2 = getSessions().openSession();
+			t2 = s2.beginTransaction();
+
+			User user1 = ( User ) s1.get( User.class, steve.getId() );
+			User user2 = ( User ) s2.get( User.class, steve.getId() );
+
+			user1.setUsername( "se" );
+			t1.commit();
+			t1 = null;
+
+			user2.setUsername( "steve-e" );
+			try {
+				t2.commit();
+				fail( "optimistic lock check did not fail" );
+			}
+			catch( HibernateException e ) {
+				// expected...
+				try {
+					t2.rollback();
+				}
+				catch( Throwable ignore ) {
+				}
+			}
+		}
+		catch( Throwable error ) {
+			if ( t1 != null ) {
+				try {
+					t1.rollback();
+				}
+				catch( Throwable ignore ) {
+				}
+			}
+			if ( t2 != null ) {
+				try {
+					t2.rollback();
+				}
+				catch( Throwable ignore ) {
+				}
+			}
+			throw error;
+		}
+		finally {
+			if ( s1 != null ) {
+				try {
+					s1.close();
+				}
+				catch( Throwable ignore ) {
+				}
+			}
+			if ( s2 != null ) {
+				try {
+					s2.close();
+				}
+				catch( Throwable ignore ) {
+				}
+			}
+		}
+
+		// lastly, clean up...
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete( s.load( User.class, steve.getId() ) );
+		t.commit();
+		s.close();
+	}
+
+	public void testCollectionVersion() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		User steve = new User( "steve" );
+		s.persist( steve );
+		Group admin = new Group( "admin" );
+		s.persist( admin );
+		t.commit();
+		s.close();
+
+		byte[] steveTimestamp = steve.getTimestamp();
+
+		s = openSession();
+		t = s.beginTransaction();
+		steve = ( User ) s.get( User.class, steve.getId() );
+		admin = ( Group ) s.get( Group.class, admin.getId() );
+		steve.getGroups().add( admin );
+		admin.getUsers().add( steve );
+		t.commit();
+		s.close();
+
+		assertFalse( "owner version not incremented", Hibernate.BINARY.isEqual( steveTimestamp, steve.getTimestamp() ) );
+
+		steveTimestamp = steve.getTimestamp();
+
+		s = openSession();
+		t = s.beginTransaction();
+		steve = ( User ) s.get( User.class, steve.getId() );
+		steve.getGroups().clear();
+		t.commit();
+		s.close();
+
+		assertFalse( "owner version not incremented", Hibernate.BINARY.isEqual( steveTimestamp, steve.getTimestamp() ) );
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete( s.load( User.class, steve.getId() ) );
+		s.delete( s.load( Group.class, admin.getId() ) );
+		t.commit();
+		s.close();
+	}
+
+
+	public void testCollectionNoVersion() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		User steve = new User( "steve" );
+		s.persist( steve );
+		Permission perm = new Permission( "silly", "user", "rw" );
+		s.persist( perm );
+		t.commit();
+		s.close();
+
+		byte[] steveTimestamp = steve.getTimestamp();
+
+		s = openSession();
+		t = s.beginTransaction();
+		steve = ( User ) s.get( User.class, steve.getId() );
+		perm = ( Permission ) s.get( Permission.class, perm.getId() );
+		steve.getPermissions().add( perm );
+		t.commit();
+		s.close();
+
+		assertTrue( "owner version was incremented", Hibernate.BINARY.isEqual( steveTimestamp, steve.getTimestamp() ) );
+
+		s = openSession();
+		t = s.beginTransaction();
+		steve = ( User ) s.get( User.class, steve.getId() );
+		steve.getPermissions().clear();
+		t.commit();
+		s.close();
+
+		assertTrue( "owner version was incremented", Hibernate.BINARY.isEqual( steveTimestamp, steve.getTimestamp() ) );
+
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete( s.load( User.class, steve.getId() ) );
+		s.delete( s.load( Permission.class, perm.getId() ) );
+		t.commit();
+		s.close();
+	}
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/sybase/SybaseTimestampVersioningTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/sybase/User.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/sybase/User.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/sybase/User.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,52 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+    Demonstrates use of the TIMESTAMP datatype available in Sybase
+    and SQL Server for optimistic locking value.
+ -->
+<hibernate-mapping package="org.hibernate.test.version.sybase">
+
+	<class name="User" table="syb_ts_user">
+        <id name="id" column="user_id" type="long">
+            <generator class="native"/>
+        </id>
+        <version name="timestamp" type="binary" generated="always">
+            <column name="ts" sql-type="timestamp"/>
+        </version>
+        <property name="username" column="user_name" type="string" unique="true"/>
+        <set name="groups" table="syb_ts_user_group" batch-size="9" inverse="true" optimistic-lock="true" lazy="true" cascade="none" >
+            <key column="user_id"/>
+            <many-to-many column="group_id" class="Group" lazy="false" fetch="join" />
+        </set>
+        <set name="permissions" table="syb_ts_user_perm" batch-size="9" inverse="false" optimistic-lock="false" lazy="true" cascade="none">
+            <key column="user_id"/>
+            <many-to-many column="perm_id" class="Permission" lazy="false" fetch="join"/>
+        </set>
+	</class>
+
+	<class name="Group" table="syb_ts_group">
+        <id name="id" column="group_id" type="long">
+            <generator class="native"/>
+        </id>
+        <timestamp name="timestamp" column="ts" source="db"/>
+        <property name="name" column="name" type="string" unique="true"/>
+        <set name="users" table="syb_ts_user_group" batch-size="9" inverse="false" lazy="true" cascade="none" >
+            <key column="group_id"/>
+            <many-to-many column="user_id" class="User" lazy="false" fetch="join" />
+        </set>
+	</class>
+
+	<class name="Permission" table="syb_ts_permission">
+        <id name="id" column="perm_id" type="long">
+            <generator class="native"/>
+        </id>
+        <timestamp name="timestamp" column="ts" source="db"/>
+        <property name="name" column="name" type="string" unique="true"/>
+        <property name="context" column="ctx" type="string"/>
+        <property name="access" column="priv" type="string"/>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/sybase/User.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/sybase/User.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/sybase/User.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/sybase/User.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,65 @@
+// $Id: User.java 7805 2005-08-10 16:25:11Z steveebersole $
+package org.hibernate.test.version.sybase;
+
+import java.util.Set;
+import java.sql.Timestamp;
+
+/**
+ * Implementation of User.
+ *
+ * @author Steve Ebersole
+ */
+public class User {
+	private Long id;
+	private byte[] timestamp;
+	private String username;
+	private Set groups;
+	private Set permissions;
+
+	public User() {
+	}
+
+	public User(String username) {
+		this.username = username;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public byte[] getTimestamp() {
+		return timestamp;
+	}
+
+	public void setTimestamp(byte[] timestamp) {
+		this.timestamp = timestamp;
+	}
+
+	public String getUsername() {
+		return username;
+	}
+
+	public void setUsername(String username) {
+		this.username = username;
+	}
+
+	public Set getGroups() {
+		return groups;
+	}
+
+	public void setGroups(Set groups) {
+		this.groups = groups;
+	}
+
+	public Set getPermissions() {
+		return permissions;
+	}
+
+	public void setPermissions(Set permissions) {
+		this.permissions = permissions;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/version/sybase/User.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/where/File.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/where/File.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/where/File.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+    Demonstrates use of a class-level where restriction
+ -->
+<hibernate-mapping package="org.hibernate.test.where">
+
+    <class name="File" where="deleted=0" table="T_FILE">
+    	<id name="id">
+    		<generator class="increment"/>
+    	</id>
+    	<property name="name"/>
+    	<property name="deleted" type="numeric_boolean"/>
+    	<many-to-one name="parent"/>
+    	<set name="children" inverse="true" where="deleted=0">
+    		<key column="parent"/>
+    		<one-to-many class="File"/>
+    	</set>
+    </class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/where/File.hbm.xml
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/where/File.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/where/File.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/where/File.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,52 @@
+//$Id: File.java 8043 2005-08-30 15:20:42Z oneovthafew $
+package org.hibernate.test.where;
+
+import java.util.Set;
+
+public class File {
+	private long id;
+	private String name;
+	private File parent;
+	private boolean deleted;
+	private Set children;
+	
+	public Set getChildren() {
+		return children;
+	}
+	public void setChildren(Set children) {
+		this.children = children;
+	}
+
+	public File(String name, File parent) {
+		this.name = name;
+		this.parent = parent;
+	}
+	
+	File() {}
+	
+	public boolean isDeleted() {
+		return deleted;
+	}
+	public void setDeleted(boolean deleted) {
+		this.deleted = deleted;
+	}
+	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 File getParent() {
+		return parent;
+	}
+	public void setParent(File parent) {
+		this.parent = parent;
+	}
+	
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/where/File.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/where/WhereTest.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/where/WhereTest.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/where/WhereTest.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,57 @@
+//$Id: WhereTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
+package org.hibernate.test.where;
+
+import junit.framework.Test;
+
+import org.hibernate.FetchMode;
+import org.hibernate.Session;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestClassTestSuite;
+
+/**
+ * @author Max Rydahl Andersen
+ */
+public class WhereTest extends FunctionalTestCase {
+
+	public WhereTest(String str) {
+		super(str);
+	}
+
+	public String[] getMappings() {
+		return new String[] { "where/File.hbm.xml" };
+	}
+
+	public static Test suite() {
+		return new FunctionalTestClassTestSuite( WhereTest.class );
+	}
+	
+	public void testWhere() {
+		Session s = openSession();
+		s.getTransaction().begin();
+		File parent = new File("parent", null);
+		s.persist( parent );
+		s.persist( new File("child", parent) );
+		File deletedChild = new File("deleted child", parent);
+		deletedChild.setDeleted(true);
+		s.persist( deletedChild );
+		File deletedParent = new File("deleted parent", null);
+		deletedParent.setDeleted(true);
+		s.persist( deletedParent );
+		s.flush();
+		s.clear();
+		parent = (File) s.createCriteria(File.class)
+				.setFetchMode("children", FetchMode.JOIN)
+				.add( Restrictions.isNull("parent") )
+				.uniqueResult();
+		assertEquals( parent.getChildren().size(), 1 );
+		s.clear();
+		parent = (File) s.createQuery("from File f left join fetch f.children where f.parent is null")
+			.uniqueResult();
+		assertEquals( parent.getChildren().size(), 1 );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+}
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/test/where/WhereTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/cache/BaseCacheProviderTestCase.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/cache/BaseCacheProviderTestCase.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/cache/BaseCacheProviderTestCase.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,238 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.testing.cache;
+
+import java.util.Map;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cache.ReadWriteCache;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
+import org.hibernate.stat.SecondLevelCacheStatistics;
+import org.hibernate.stat.Statistics;
+import org.hibernate.testing.tm.ConnectionProviderImpl;
+import org.hibernate.testing.tm.TransactionManagerLookupImpl;
+import org.hibernate.transaction.JDBCTransactionFactory;
+
+/**
+ * Common requirement testing for each {@link org.hibernate.cache.CacheProvider} impl.
+ *
+ * @author Steve Ebersole
+ */
+public abstract class BaseCacheProviderTestCase extends FunctionalTestCase {
+
+	// note that a lot of the fucntionality here is intended to be used
+	// in creating specific tests for each CacheProvider that would extend
+	// from a base test case (this) for common requirement testing...
+
+	public BaseCacheProviderTestCase(String x) {
+		super( x );
+	}
+
+	public String[] getMappings() {
+		return new String[] { "cache/Item.hbm.xml" };
+	}
+
+	public void configure(Configuration cfg) {
+		super.configure( cfg );
+		cfg.setProperty( Environment.CACHE_REGION_PREFIX, "" );
+		cfg.setProperty( Environment.USE_SECOND_LEVEL_CACHE, "true" );
+		cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
+		cfg.setProperty( Environment.USE_STRUCTURED_CACHE, "true" );
+		cfg.setProperty( Environment.CACHE_PROVIDER, getCacheProvider().getName() );
+
+		if ( getConfigResourceKey() != null ) {
+			cfg.setProperty( getConfigResourceKey(), getConfigResourceLocation() );
+		}
+
+		if ( useTransactionManager() ) {
+			cfg.setProperty( Environment.CONNECTION_PROVIDER, ConnectionProviderImpl.class.getName() );
+			cfg.setProperty( Environment.TRANSACTION_MANAGER_STRATEGY, TransactionManagerLookupImpl.class.getName() );
+		}
+		else {
+			cfg.setProperty( Environment.TRANSACTION_STRATEGY, JDBCTransactionFactory.class.getName() );
+		}
+	}
+
+	/**
+	 * The cache provider to be tested.
+	 *
+	 * @return The cache provider.
+	 */
+	protected abstract Class getCacheProvider();
+
+	/**
+	 * For provider-specific configuration, the name of the property key the
+	 * provider expects.
+	 *
+	 * @return The provider-specific config key.
+	 */
+	protected abstract String getConfigResourceKey();
+
+	/**
+	 * For provider-specific configuration, the resource location of that
+	 * config resource.
+	 *
+	 * @return The config resource location.
+	 */
+	protected abstract String getConfigResourceLocation();
+
+	/**
+	 * Should we use a transaction manager for transaction management.
+	 *
+	 * @return True if we should use a RM; false otherwise.
+	 */
+	protected abstract boolean useTransactionManager();
+
+
+	public void testQueryCacheInvalidation() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+		Item i = new Item();
+		i.setName("widget");
+		i.setDescription("A really top-quality, full-featured widget.");
+		s.persist(i);
+		t.commit();
+		s.close();
+
+		SecondLevelCacheStatistics slcs = s.getSessionFactory().getStatistics()
+				.getSecondLevelCacheStatistics( Item.class.getName() );
+
+		assertEquals( slcs.getPutCount(), 1 );
+		assertEquals( slcs.getElementCountInMemory(), 1 );
+		assertEquals( slcs.getEntries().size(), 1 );
+
+		s = openSession();
+		t = s.beginTransaction();
+		i = (Item) s.get( Item.class, i.getId() );
+
+		assertEquals( slcs.getHitCount(), 1 );
+		assertEquals( slcs.getMissCount(), 0 );
+
+		i.setDescription("A bog standard item");
+
+		t.commit();
+		s.close();
+
+		assertEquals( slcs.getPutCount(), 2 );
+
+		Object entry = slcs.getEntries().get( i.getId() );
+		Map map;
+		if ( entry instanceof ReadWriteCache.Item ) {
+			map = (Map) ( (ReadWriteCache.Item) entry ).getValue();
+		}
+		else {
+			map = (Map) entry;
+		}
+		assertTrue( map.get("description").equals("A bog standard item") );
+		assertTrue( map.get("name").equals("widget") );
+
+		// cleanup
+		s = openSession();
+		t = s.beginTransaction();
+		s.delete( i );
+		t.commit();
+		s.close();
+	}
+
+	public void testEmptySecondLevelCacheEntry() throws Exception {
+		getSessions().evictEntity( Item.class.getName() );
+		Statistics stats = getSessions().getStatistics();
+		stats.clear();
+		SecondLevelCacheStatistics statistics = stats.getSecondLevelCacheStatistics( Item.class.getName() );
+        Map cacheEntries = statistics.getEntries();
+		assertEquals( 0, cacheEntries.size() );
+	}
+
+	public void testStaleWritesLeaveCacheConsistent() {
+		Session s = openSession();
+		Transaction txn = s.beginTransaction();
+		VersionedItem item = new VersionedItem();
+		item.setName( "steve" );
+		item.setDescription( "steve's item" );
+		s.save( item );
+		txn.commit();
+		s.close();
+
+		Long initialVersion = item.getVersion();
+
+		// manually revert the version property
+		item.setVersion( new Long( item.getVersion().longValue() - 1 ) );
+
+		try {
+			s = openSession();
+			txn = s.beginTransaction();
+			s.update( item );
+			txn.commit();
+			s.close();
+			fail( "expected stale write to fail" );
+		}
+		catch( Throwable expected ) {
+			// expected behavior here
+			if ( txn != null ) {
+				try {
+					txn.rollback();
+				}
+				catch( Throwable ignore ) {
+				}
+			}
+		}
+		finally {
+			if ( s != null && s.isOpen() ) {
+				try {
+					s.close();
+				}
+				catch( Throwable ignore ) {
+				}
+			}
+		}
+
+		// check the version value in the cache...
+		SecondLevelCacheStatistics slcs = sfi().getStatistics()
+				.getSecondLevelCacheStatistics( VersionedItem.class.getName() );
+
+		Object entry = slcs.getEntries().get( item.getId() );
+		Long cachedVersionValue;
+		if ( entry instanceof ReadWriteCache.Lock ) {
+			//FIXME don't know what to test here
+			cachedVersionValue = new Long( ( (ReadWriteCache.Lock) entry).getUnlockTimestamp() );
+		}
+		else {
+			cachedVersionValue = ( Long ) ( (Map) entry ).get( "_version" );
+			assertEquals( initialVersion.longValue(), cachedVersionValue.longValue() );
+		}
+
+
+		// cleanup
+		s = openSession();
+		txn = s.beginTransaction();
+		item = ( VersionedItem ) s.load( VersionedItem.class, item.getId() );
+		s.delete( item );
+		txn.commit();
+		s.close();
+
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/cache/BaseCacheProviderTestCase.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/cache/Item.hbm.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/cache/Item.hbm.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/cache/Item.hbm.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,49 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC 
+	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+  ~ Hibernate, Relational Persistence for Idiomatic Java
+  ~
+  ~ Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+  ~ indicated by the @author tags or express copyright attribution
+  ~ statements applied by the authors.  All third-party contributions are
+  ~ distributed under license by Red Hat Middleware LLC.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, as published by the Free Software Foundation.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  ~ or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+  ~ for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public License
+  ~ along with this distribution; if not, write to:
+  ~ Free Software Foundation, Inc.
+  ~ 51 Franklin Street, Fifth Floor
+  ~ Boston, MA  02110-1301  USA
+  -->
+<hibernate-mapping
+	package="org.hibernate.testing.cache">
+
+	<class name="Item" table="Items">
+		<id name="id">
+			<generator class="increment"/>
+		</id>
+		<property name="name" not-null="true"/>
+		<property name="description" not-null="true"/>
+	</class>
+
+	<class name="VersionedItem" table="VersionedItems">
+		<id name="id">
+			<generator class="increment"/>
+		</id>
+        <version name="version" type="long"/>
+        <property name="name" not-null="true"/>
+		<property name="description" not-null="true"/>
+	</class>
+
+</hibernate-mapping>


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/cache/Item.hbm.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/cache/Item.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/cache/Item.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/cache/Item.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,53 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+
+package org.hibernate.testing.cache;
+
+/**
+ * @author Gavin King
+ */
+public class Item {
+	private Long id;
+	private String name;
+	private String description;
+	
+	public String getDescription() {
+		return description;
+	}
+	public void setDescription(String description) {
+		this.description = description;
+	}
+	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;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/cache/Item.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/cache/VersionedItem.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/cache/VersionedItem.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/cache/VersionedItem.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,39 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.testing.cache;
+
+/**
+ * @author Steve Ebersole
+ */
+public class VersionedItem extends Item {
+	private Long version;
+
+	public Long getVersion() {
+		return version;
+	}
+
+	public void setVersion(Long version) {
+		this.version = version;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/cache/VersionedItem.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/AbstractClassLoaderIsolatedTestCase.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/AbstractClassLoaderIsolatedTestCase.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/AbstractClassLoaderIsolatedTestCase.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,57 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.testing.junit;
+
+/**
+ * A specialized TestCase for running tests in an isolated class-loader
+ *
+ * @author Steve Ebersole
+ */
+public abstract class AbstractClassLoaderIsolatedTestCase extends UnitTestCase {
+	private ClassLoader parentLoader;
+	private ClassLoader isolatedLoader;
+
+	public AbstractClassLoaderIsolatedTestCase(String string) {
+		super( string );
+	}
+
+	protected void setUp() throws Exception {
+		parentLoader = Thread.currentThread().getContextClassLoader();
+		isolatedLoader = buildIsolatedClassLoader( parentLoader );
+		Thread.currentThread().setContextClassLoader( isolatedLoader );
+		super.setUp();
+	}
+
+	protected void tearDown() throws Exception {
+		super.tearDown();
+		Thread.currentThread().setContextClassLoader( parentLoader );
+		releaseIsolatedClassLoader( isolatedLoader );
+		parentLoader = null;
+		isolatedLoader = null;
+	}
+
+	protected abstract ClassLoader buildIsolatedClassLoader(ClassLoader parent);
+
+	protected abstract void releaseIsolatedClassLoader(ClassLoader isolatedLoader);
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/AbstractClassLoaderIsolatedTestCase.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/DialectChecks.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/DialectChecks.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/DialectChecks.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,59 @@
+// $Id: DialectChecks.java 19678 2010-06-02 21:27:11Z steve.ebersole at jboss.com $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.testing.junit;
+
+import org.hibernate.dialect.Dialect;
+
+/**
+ * Container class for different implementation of the {@code DialectCheck} interface.
+ *
+ * @author Hardy Ferentschik
+ */
+abstract public class DialectChecks {
+
+	abstract public boolean include(Dialect dialect);
+
+	public static class SupportsSequences extends DialectChecks {
+		public boolean include(Dialect dialect) {
+			return dialect.supportsSequences();
+		}
+	}
+
+	public static class SupportsExpectedLobUsagePattern extends DialectChecks {
+		public boolean include(Dialect dialect) {
+			return dialect.supportsExpectedLobUsagePattern();
+		}
+	}
+
+	public static class SupportsIdentityColumns extends DialectChecks {
+		public boolean include(Dialect dialect) {
+			return dialect.supportsIdentityColumns();
+		}
+	}
+
+
+}
+
+


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/DialectChecks.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/FailureExpected.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/FailureExpected.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/FailureExpected.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,51 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.testing.junit;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Annotations used to mark a test as an expected failure.
+ *
+ * @author Hardy Ferentschik
+ * @author Steve Ebersole
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target({ ElementType.METHOD, ElementType.TYPE })
+public @interface FailureExpected {
+	/**
+	 * The key of a JIRA issue which covers this expected failure.
+	 * @return The jira issue key
+	 */
+	String jiraKey();
+
+	/**
+	 * A message explaining the reason for the expected failure.  Optional.
+	 * @return The reason
+	 */
+	String message() default "";
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/FailureExpected.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/RequiresDialect.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/RequiresDialect.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/RequiresDialect.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,70 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.testing.junit;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.hibernate.dialect.Dialect;
+
+/**
+ * Annotation used to indicate that a test should be run only when run against the
+ * indicated dialects.
+ *
+ * @author Hardy Ferentschik
+ */
+ at Target({ ElementType.METHOD, ElementType.TYPE })
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface RequiresDialect {
+	/**
+	 * The dialects against which to run the test
+	 *
+	 * @return The dialects
+	 */
+	Class<? extends Dialect>[] value();
+
+	/**
+	 * Used to indicate if the dialects should be matched strictly (classes equal) or
+	 * non-strictly (instanceof).
+	 *
+	 * @return Should strict matching be used?
+	 */
+	boolean strictMatching() default false;
+
+	/**
+	 * Comment describing the reason why the dialect is required.
+	 *
+	 * @return The comment
+	 */
+	String comment() default "";
+
+	/**
+	 * The key of a JIRA issue which relates this this restriction
+	 *
+	 * @return The jira issue key
+	 */
+	String jiraKey() default "";
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/RequiresDialect.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/RequiresDialectFeature.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/RequiresDialectFeature.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/RequiresDialectFeature.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,59 @@
+// $Id: RequiresDialectFeature.java 19678 2010-06-02 21:27:11Z steve.ebersole at jboss.com $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.testing.junit;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Annotation used to indicate that a test should be run only when the current dialect suppports the
+ * specified feature.
+ *
+ * @author Hardy Ferentschik
+ */
+ at Target({ ElementType.METHOD, ElementType.TYPE })
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface RequiresDialectFeature {
+	/**
+	 * @return The name of the dialect feature.
+	 */
+	Class<? extends DialectChecks> value();
+
+	/**
+	 * Comment describing the reason why the feature is required.
+	 *
+	 * @return The comment
+	 */
+	String comment() default "";
+
+	/**
+	 * The key of a JIRA issue which relates this this feature requirement.
+	 *
+	 * @return The jira issue key
+	 */
+	String jiraKey() default "";
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/RequiresDialectFeature.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/SkipForDialect.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/SkipForDialect.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/SkipForDialect.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,68 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.testing.junit;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.hibernate.dialect.Dialect;
+
+/**
+ * Annotation used to indicate that a test should be skipped when run against the
+ * indicated dialects.
+ *
+ * @author Hardy Ferentschik
+ * @author Steve Ebersole
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target({ ElementType.METHOD, ElementType.TYPE })
+public @interface SkipForDialect {
+	/**
+	 * The dialects against which to skip the test
+	 * @return The dialects
+	 */
+	Class<? extends Dialect>[] value();
+
+	/**
+	 * Used to indicate if the dialects should be matched strictly (classes equal) or
+	 * non-strictly (instanceof).
+	 * @return Should strict matching be used?
+	 */
+	boolean strictMatching() default false;
+
+	/**
+	 * Comment describing the reason for the skip.
+	 * @return The comment
+	 */
+	String comment() default "";
+
+	/**
+	 * The key of a JIRA issue which covers the reason for this skip.  Eventually we should make this
+	 * a requirement.
+	 * @return The jira issue key
+	 */
+	String jiraKey() default "";
+}
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/SkipForDialect.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/SkipLog.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/SkipLog.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/SkipLog.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,36 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.testing.junit;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Well-known-location lookup for the test-skip log...
+ *
+ * @author Steve Ebersole
+ */
+public class SkipLog {
+	public static final Logger LOG = LoggerFactory.getLogger( "org.hibernate.test.SKIPPED" );
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/SkipLog.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/TestSuiteVisitor.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/TestSuiteVisitor.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/TestSuiteVisitor.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,65 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.testing.junit;
+
+import java.util.Enumeration;
+
+import junit.framework.TestSuite;
+import junit.framework.Test;
+
+/**
+ * Handles walking a TestSuite hierarchy for recognition of individual tests.
+ *
+ * @author Steve Ebersole
+ */
+public class TestSuiteVisitor {
+
+	private final TestSuiteVisitor.Handler handler;
+
+	public TestSuiteVisitor(TestSuiteVisitor.Handler handler) {
+		this.handler = handler;
+	}
+
+	public void visit(TestSuite testSuite) {
+		handler.startingTestSuite( testSuite );
+		Enumeration tests = testSuite.tests();
+		while ( tests.hasMoreElements() ) {
+			Test test = ( Test ) tests.nextElement();
+			if ( test instanceof TestSuite ) {
+				visit( ( TestSuite ) test );
+			}
+			else {
+				handler.handleTestCase( test );
+			}
+		}
+		handler.completedTestSuite( testSuite );
+	}
+
+	public static interface Handler {
+		public void handleTestCase(Test test);
+		public void startingTestSuite(TestSuite suite);
+		public void completedTestSuite(TestSuite suite);
+	}
+
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/TestSuiteVisitor.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/UnitTestCase.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/UnitTestCase.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/UnitTestCase.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,161 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.testing.junit;
+
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import junit.framework.AssertionFailedError;
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+
+/**
+ * A basic JUnit {@link junit.framework.TestCase} subclass for
+ * adding some Hibernate specific behavior and functionality.
+ *
+ * @author Steve Ebersole
+ */
+public abstract class UnitTestCase extends junit.framework.TestCase {
+
+	private static final Logger log = LoggerFactory.getLogger( UnitTestCase.class );
+
+	public UnitTestCase(String string) {
+		super( string );
+	}
+
+	/**
+	 * runBare overridden in order to apply FailureExpected validations
+	 * as well as start/complete logging
+	 *
+	 * @throws Throwable
+	 */
+	public void runBare() throws Throwable {
+		final boolean doValidate = getName().endsWith( "FailureExpected" ) && Boolean.getBoolean( "hibernate.test.validatefailureexpected" );
+		try {
+			log.info( "Starting test [" + fullTestName() + "]" );
+			super.runBare();
+			if ( doValidate ) {
+				throw new FailureExpectedTestPassedException();
+			}
+		}
+		catch ( FailureExpectedTestPassedException t ) {
+			throw t;
+		}
+		catch( Throwable t ) {
+			if ( doValidate ) {
+				skipExpectedFailure( t );
+			}
+			else {
+				throw t;
+			}
+		}
+		finally {
+			log.info( "Completed test [" + fullTestName() + "]" );
+		}
+	}
+
+	private static class FailureExpectedTestPassedException extends Exception {
+		public FailureExpectedTestPassedException() {
+			super( "Test marked as FailureExpected, but did not fail!" );
+		}
+	}
+
+	protected void skipExpectedFailure(Throwable error) {
+		reportSkip( "ignoring *FailuredExpected methods", "Failed with: " + error.toString() );
+	}
+
+	// additional assertions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+	public static void assertElementTypeAssignability(java.util.Collection collection, Class clazz) throws AssertionFailedError {
+		Iterator itr = collection.iterator();
+		while ( itr.hasNext() ) {
+			assertClassAssignability( itr.next().getClass(), clazz );
+		}
+	}
+
+	public static void assertClassAssignability(Class source, Class target) throws AssertionFailedError {
+		if ( !target.isAssignableFrom( source ) ) {
+			throw new AssertionFailedError(
+			        "Classes were not assignment-compatible : source<" + source.getName() +
+			        "> target<" + target.getName() + ">"
+			);
+		}
+	}
+
+
+	// test skipping ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+	public String fullTestName() {
+		return this.getClass().getName() + "#" + this.getName();
+	}
+
+	protected void reportSkip(String reason, String testDescription) {
+		SkipLog.LOG.warn( "*** skipping [" + fullTestName() + "] - " + testDescription + " : " + reason, new Exception()  );
+	}
+	
+	// testsuite utitities ---------------------------------------------------
+	
+	/**
+	 * Supports easy creation of TestSuites where a subclass' "FailureExpected"
+	 * version of a base test is included in the suite, while the base test
+	 * is excluded.  E.g. test class FooTestCase includes method testBar(), while test
+	 * class SubFooTestCase extends FooTestCase includes method testBarFailureExcluded().
+	 * Passing SubFooTestCase.class to this method will return a suite that
+	 * does not include testBar().
+	 */
+	public static TestSuite createFailureExpectedSuite(Class testClass) {
+	   
+	   TestSuite allTests = new TestSuite(testClass);
+       Set failureExpected = new HashSet();
+	   Enumeration tests = allTests.tests();
+	   while (tests.hasMoreElements()) {
+	      Test t = (Test) tests.nextElement();
+	      if (t instanceof TestCase) {
+	         String name = ((TestCase) t).getName();
+	         if (name.endsWith("FailureExpected"))
+	            failureExpected.add(name);
+	      }	      
+	   }
+	   
+	   TestSuite result = new TestSuite();
+       tests = allTests.tests();
+       while (tests.hasMoreElements()) {
+          Test t = (Test) tests.nextElement();
+          if (t instanceof TestCase) {
+             String name = ((TestCase) t).getName();
+             if (!failureExpected.contains(name + "FailureExpected")) {
+                result.addTest(t);
+             }
+          }       
+       }
+	   
+	   return result;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/UnitTestCase.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/functional/DatabaseSpecificFunctionalTestCase.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/functional/DatabaseSpecificFunctionalTestCase.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/functional/DatabaseSpecificFunctionalTestCase.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,50 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.testing.junit.functional;
+
+import org.hibernate.testing.junit.SkipLog;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public abstract class DatabaseSpecificFunctionalTestCase extends FunctionalTestCase {
+	public DatabaseSpecificFunctionalTestCase(String string) {
+		super( string );
+	}
+
+	protected void runTest() throws Throwable {
+		// Note: this protection comes into play when running
+		// tests individually.  The suite as a whole is already
+		// "protected" by the fact that these tests are actually
+		// filtered out of the suite
+		if ( appliesTo( getDialect() ) ) {
+			super.runTest();
+		}
+		else {
+			SkipLog.LOG.warn( "skipping database-specific test [" + fullTestName() + "] for dialect [" + getDialect().getClass().getName() + "]" );
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/functional/DatabaseSpecificFunctionalTestCase.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/functional/ExecutionEnvironment.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/functional/ExecutionEnvironment.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/functional/ExecutionEnvironment.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,184 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.testing.junit.functional;
+
+import java.util.Iterator;
+import java.sql.Blob;
+import java.sql.Clob;
+
+import org.hibernate.dialect.Dialect;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.cfg.Mappings;
+import org.hibernate.SessionFactory;
+import org.hibernate.engine.SessionFactoryImplementor;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.Property;
+import org.hibernate.mapping.SimpleValue;
+import org.hibernate.mapping.Collection;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Steve Ebersole
+ */
+public class ExecutionEnvironment {
+
+	public static final Dialect DIALECT = Dialect.getDialect();
+
+	private final ExecutionEnvironment.Settings settings;
+
+	private Configuration configuration;
+	private SessionFactory sessionFactory;
+	private boolean allowRebuild;
+
+	public ExecutionEnvironment(ExecutionEnvironment.Settings settings) {
+		this.settings = settings;
+	}
+
+	public boolean isAllowRebuild() {
+		return allowRebuild;
+	}
+
+	public void setAllowRebuild(boolean allowRebuild) {
+		this.allowRebuild = allowRebuild;
+	}
+
+	public Dialect getDialect() {
+		return DIALECT;
+	}
+
+	public Configuration getConfiguration() {
+		return configuration;
+	}
+
+	public SessionFactory getSessionFactory() {
+		return sessionFactory;
+	}
+
+	public void initialize() {
+		if ( sessionFactory != null ) {
+			throw new IllegalStateException( "attempt to initialize already initialized ExecutionEnvironment" );
+		}
+		if ( ! settings.appliesTo( getDialect() ) ) {
+			return;
+		}
+
+		Configuration configuration = new Configuration();
+		configuration.setProperty( Environment.CACHE_PROVIDER, "org.hibernate.cache.HashtableCacheProvider" );
+
+		settings.configure( configuration );
+
+		applyMappings( configuration );
+		applyCacheSettings( configuration );
+
+
+		if ( settings.createSchema() ) {
+			configuration.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
+		}
+
+		// make sure we use the same dialect...
+		configuration.setProperty( Environment.DIALECT, getDialect().getClass().getName() );
+
+		configuration.buildMappings();
+		settings.afterConfigurationBuilt( configuration.createMappings(), getDialect() );
+
+		SessionFactory sessionFactory = configuration.buildSessionFactory();
+		this.configuration = configuration;
+		this.sessionFactory = sessionFactory;
+
+		settings.afterSessionFactoryBuilt( ( SessionFactoryImplementor ) sessionFactory );
+	}
+
+	private void applyMappings(Configuration configuration) {
+		String[] mappings = settings.getMappings();
+		for ( int i = 0; i < mappings.length; i++ ) {
+			configuration.addResource( settings.getBaseForMappings() + mappings[i], ExecutionEnvironment.class.getClassLoader() );
+		}
+	}
+
+	private void applyCacheSettings(Configuration configuration) {
+		if ( settings.getCacheConcurrencyStrategy() != null ) {
+			Iterator iter = configuration.getClassMappings();
+			while ( iter.hasNext() ) {
+				PersistentClass clazz = (PersistentClass) iter.next();
+				Iterator props = clazz.getPropertyClosureIterator();
+				boolean hasLob = false;
+				while ( props.hasNext() ) {
+					Property prop = (Property) props.next();
+					if ( prop.getValue().isSimpleValue() ) {
+						String type = ( ( SimpleValue ) prop.getValue() ).getTypeName();
+						if ( "blob".equals(type) || "clob".equals(type) ) {
+							hasLob = true;
+						}
+						if ( Blob.class.getName().equals(type) || Clob.class.getName().equals(type) ) {
+							hasLob = true;
+						}
+					}
+				}
+				if ( !hasLob && !clazz.isInherited() && settings.overrideCacheStrategy() ) {
+					configuration.setCacheConcurrencyStrategy( clazz.getEntityName(), settings.getCacheConcurrencyStrategy() );
+				}
+			}
+			iter = configuration.getCollectionMappings();
+			while ( iter.hasNext() ) {
+				Collection coll = (Collection) iter.next();
+				configuration.setCollectionCacheConcurrencyStrategy( coll.getRole(), settings.getCacheConcurrencyStrategy() );
+			}
+		}
+	}
+
+	public void rebuild() {
+		if ( !allowRebuild ) {
+			return;
+		}
+		if ( sessionFactory != null ) {
+			sessionFactory.close();
+			sessionFactory = null;
+		}
+		sessionFactory = configuration.buildSessionFactory();
+		settings.afterSessionFactoryBuilt( ( SessionFactoryImplementor ) sessionFactory );
+	}
+
+	public void complete() {
+		if ( sessionFactory != null ) {
+			sessionFactory.close();
+			sessionFactory = null;
+		}
+		configuration = null;
+	}
+
+	public static interface Settings {
+		public String[] getMappings();
+		public String getBaseForMappings();
+		public boolean createSchema();
+		public boolean recreateSchemaAfterFailure();
+		public void configure(Configuration cfg);
+		public boolean overrideCacheStrategy();
+		public String getCacheConcurrencyStrategy();
+		public void afterSessionFactoryBuilt(SessionFactoryImplementor sfi);
+		public void afterConfigurationBuilt(Mappings mappings, Dialect dialect);
+		public boolean appliesTo(Dialect dialect);
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/functional/ExecutionEnvironment.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/functional/FunctionalTestCase.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/functional/FunctionalTestCase.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/functional/FunctionalTestCase.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,544 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.testing.junit.functional;
+
+import java.util.List;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.sql.Connection;
+
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Mappings;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.dialect.DB2Dialect;
+import org.hibernate.dialect.DerbyDialect;
+import org.hibernate.SessionFactory;
+import org.hibernate.HibernateException;
+import org.hibernate.Interceptor;
+import org.hibernate.Session;
+import org.hibernate.testing.junit.UnitTestCase;
+import org.hibernate.engine.SessionFactoryImplementor;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Most of the Hibernate test suite in fact is a series of functional tests, not
+ * unit tests.  Here is a base class for these functional tests.
+ *
+ * @author Steve Ebersole
+ */
+public abstract class FunctionalTestCase extends UnitTestCase implements ExecutionEnvironment.Settings {
+
+	private static final Logger log = LoggerFactory.getLogger( FunctionalTestCase.class );
+
+	private ExecutionEnvironment environment;
+	private boolean isEnvironmentLocallyManaged;
+
+	private org.hibernate.classic.Session session;
+
+	public FunctionalTestCase(String string) {
+		super( string );
+	}
+
+	public ExecutionEnvironment getEnvironment() {
+		return environment;
+	}
+
+	public void setEnvironment(ExecutionEnvironment environment) {
+		this.environment = environment;
+	}
+
+	protected void prepareTest() throws Exception {
+	}
+
+	protected void cleanupTest() throws Exception {
+	}
+
+	// JUnit hooks ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+	/**
+	 * Override {@link junit.framework.TestCase#setUp()} to check if we need
+	 * to build a locally managed execution environment.
+	 *
+	 * @throws Exception
+	 */
+	protected final void setUp() throws Exception {
+		if ( environment == null ) {
+			log.info( "Building locally managed execution env" );
+			isEnvironmentLocallyManaged = true;
+			environment = new ExecutionEnvironment( this );
+			environment.initialize();
+		}
+		prepareTest();
+	}
+
+	/**
+	 * Override {@link junit.framework.TestCase#tearDown()} to tear down
+	 * the execution environment if it is locally managed.
+	 *
+	 * @throws Exception
+	 */
+	protected final void tearDown() throws Exception {
+		cleanupTest();
+		if ( isEnvironmentLocallyManaged ) {
+			log.info( "Destroying locally managed execution env" );
+			environment.complete();
+			environment = null;
+		}
+	}
+
+	/**
+	 * runTest is overridden in order to apply session closure assertions.
+	 *
+	 * @throws Throwable
+	 */
+	protected void runTest() throws Throwable {
+		final boolean stats = sfi().getStatistics().isStatisticsEnabled();
+		try {
+			if ( stats ) {
+				sfi().getStatistics().clear();
+			}
+
+			super.runTest();
+
+			if ( stats ) {
+				sfi().getStatistics().logSummary();
+			}
+
+			if ( session != null && session.isOpen() ) {
+				if ( session.isConnected() ) {
+					session.connection().rollback();
+				}
+				session.close();
+				session = null;
+				fail( "unclosed session" );
+			}
+			else {
+				session = null;
+			}
+			assertAllDataRemoved();
+		}
+		catch ( Throwable e ) {
+			log.trace( "test run resulted in error; attempting to cleanup", e );
+			try {
+				if ( session != null && session.isOpen() ) {
+					if ( session.isConnected() ) {
+						session.connection().rollback();
+					}
+					session.close();
+				}
+			}
+			catch ( Exception ignore ) {
+			}
+			try {
+				if ( recreateSchemaAfterFailure() && environment != null ) {
+					environment.rebuild();
+				}
+			}
+			catch ( Exception ignore ) {
+			}
+			throw e;
+		}
+	}
+
+	protected void assertAllDataRemoved() {
+		if ( !createSchema() ) {
+			return; // no tables were created...
+		}
+		if ( !Boolean.getBoolean( "hibernate.test.validateDataCleanup" ) ) {
+			return;
+		}
+
+		Session tmpSession = getSessions().openSession();
+		try {
+			List list = tmpSession.createQuery( "select o from java.lang.Object o" ).list();
+
+			Map items = new HashMap();
+			if ( !list.isEmpty() ) {
+				for ( Iterator iter = list.iterator(); iter.hasNext(); ) {
+					Object element = iter.next();
+					Integer l = ( Integer ) items.get( tmpSession.getEntityName( element ) );
+					if ( l == null ) {
+						l = new Integer( 0 );
+					}
+					l = new Integer( l.intValue() + 1 );
+					items.put( tmpSession.getEntityName( element ), l );
+					System.out.println( "Data left: " + element );
+				}
+				fail( "Data is left in the database: " + items.toString() );
+			}
+		}
+		finally {
+			try {
+				tmpSession.close();
+			}
+			catch( Throwable t ) {
+				// intentionally empty
+			}
+		}
+	}
+
+	protected void skipExpectedFailure(Throwable error) {
+		super.skipExpectedFailure( error );
+		try {
+			if ( recreateSchemaAfterFailure() && environment != null ) {
+				environment.rebuild();
+			}
+		}
+		catch ( Exception ignore ) {
+		}
+	}
+
+	// ExecutionEnvironment.Settings implementation ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+	public String getBaseForMappings() {
+		return "org/hibernate/test/";
+	}
+
+	public boolean createSchema() {
+		return true;
+	}
+
+	public boolean recreateSchemaAfterFailure() {
+		return true;
+	}
+
+	public void configure(Configuration cfg) {
+	}
+
+	public boolean overrideCacheStrategy() {
+		return true;
+	}
+
+	public String getCacheConcurrencyStrategy() {
+		return "nonstrict-read-write";
+	}
+
+	public void afterSessionFactoryBuilt(SessionFactoryImplementor sfi) {
+	}
+
+	public void afterConfigurationBuilt(Mappings mappings, Dialect dialect) {
+	}
+
+	/**
+	 * Intended to indicate that this test class as a whole is intended for
+	 * a dialect or series of dialects.  Skips here (appliesTo = false) therefore
+	 * simply indicate that the given tests target a particular feature of the
+	 * checked database and none of the tests on this class should be run for the
+	 * checked dialect.
+	 *
+	 * @param dialect The dialect to be checked.
+	 * @return False if the test class as a whole is specifically targetting
+	 * a dialect (or series of dialects) other than the indicated dialect
+	 * and the test should therefore be skipped in its entirety;
+	 * true otherwise.
+	 */
+	public boolean appliesTo(Dialect dialect) {
+		return true;
+	}
+
+
+	// methods for subclasses to access environment ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+	/**
+	 * Get the factory for this test environment.
+	 *
+	 * @return The factory.
+	 */
+	protected SessionFactory getSessions() {
+		return environment.getSessionFactory();
+	}
+
+	/**
+	 * Get the factory for this test environment, casted to {@link org.hibernate.engine.SessionFactoryImplementor}.
+	 * <p/>
+	 * Shorthand for ( {@link org.hibernate.engine.SessionFactoryImplementor} ) {@link #getSessions()}...
+	 *
+	 * @return The factory
+	 */
+	protected SessionFactoryImplementor sfi() {
+		return ( SessionFactoryImplementor ) getSessions();
+	}
+
+	protected Dialect getDialect() {
+		return ExecutionEnvironment.DIALECT;
+	}
+
+	protected Configuration getCfg() {
+		return environment.getConfiguration();
+	}
+
+	public org.hibernate.classic.Session openSession() throws HibernateException {
+		session = getSessions().openSession();
+		return session;
+	}
+
+	public org.hibernate.classic.Session openSession(Interceptor interceptor) throws HibernateException {
+		session = getSessions().openSession(interceptor);
+		return session;
+	}
+
+
+
+	/**
+	 * Do connections enforce SERIALIZABLE isolation...
+	 *
+	 * @return
+	 * @throws Exception
+	 */
+	protected boolean isSerializableIsolationEnforced() throws Exception {
+		Connection conn = null;
+		try {
+			conn = sfi().getConnectionProvider().getConnection();
+			return conn.getTransactionIsolation() >= Connection.TRANSACTION_SERIALIZABLE;
+		}
+		finally {
+			if ( conn != null ) {
+				try {
+					sfi().getConnectionProvider().closeConnection( conn );
+				}
+				catch ( Throwable ignore ) {
+					// ignore...
+				}
+			}
+		}
+	}
+
+	/**
+	 * Is connection at least read committed?
+	 * <p/>
+	 * Not, that this skip check relies on the JDBC driver reporting
+	 * the true isolation level correctly.  HSQLDB, for example, will
+	 * report whatever you specify as the isolation
+	 * (Connection.setTransationIsolation()), even though it only supports
+	 * read-uncommitted.
+	 *
+	 * @param scenario text description of the scenario being tested.
+	 * @return true if read-committed isolation is maintained.
+	 */
+	protected boolean readCommittedIsolationMaintained(String scenario) {
+		int isolation = java.sql.Connection.TRANSACTION_READ_UNCOMMITTED;
+		Session testSession = null;
+		try {
+			testSession = openSession();
+			isolation = testSession.connection().getTransactionIsolation();
+		}
+		catch( Throwable ignore ) {
+		}
+		finally {
+			if ( testSession != null ) {
+				try {
+					testSession.close();
+				}
+				catch( Throwable ignore ) {
+				}
+			}
+		}
+		if ( isolation < java.sql.Connection.TRANSACTION_READ_COMMITTED ) {
+			reportSkip( "environment does not support at least read committed isolation", scenario );
+			return false;
+		}
+		else {
+			return true;
+		}
+	}
+
+	/**
+	 * Does the db/dialect support using a column's physical name in the order-by clause
+	 * even after it has been aliased in the select clause.  This is not actually
+	 * required by the SQL spec, although virtually ever DB in the world supports this
+	 * (the most glaring omission here being IBM-variant DBs ala DB2 and Derby).
+	 *
+	 * @param testDescription description of the scenario being tested.
+	 * @return true if is allowed
+	 */
+	protected boolean allowsPhysicalColumnNameInOrderby(String testDescription) {
+		if ( DB2Dialect.class.isInstance( getDialect() ) ) {
+			// https://issues.apache.org/jira/browse/DERBY-1624
+			reportSkip( "Dialect does not support physical column name in order-by clause after it is aliased", testDescription );
+			return false;
+		}
+		return true;
+	}
+
+	/**
+	 * Does the db/dialect support using a column's physical name in the having clause
+	 * even after it has been aliased in the select/group-by clause.  This is not actually
+	 * required by the SQL spec, although virtually ever DB in the world supports this.
+	 *
+	 * @param testDescription description of the scenario being tested.
+	 * @return true if is allowed
+	 */
+	protected boolean allowsPhysicalColumnNameInHaving(String testDescription) {
+		// I only *know* of this being a limitation on Derby, although I highly suspect
+		// it is a limitation on any IBM/DB2 variant
+		if ( DerbyDialect.class.isInstance( getDialect() ) ) {
+			// https://issues.apache.org/jira/browse/DERBY-1624
+			reportSkip( "Dialect does not support physical column name in having clause after it is aliased", testDescription );
+			return false;
+		}
+		return true;
+	}
+
+	/**
+	 * Does the db/dialect support empty lists in the IN operator?
+	 * <p/>
+	 * For example, is "... a.b IN () ..." supported?
+	 *
+	 * @param testDescription description of the scenario being tested.
+	 * @return true if is allowed
+	 */
+	protected boolean dialectSupportsEmptyInList(String testDescription) {
+		if ( ! getDialect().supportsEmptyInList() ) {
+			reportSkip( "Dialect does not support SQL empty in list : x in ()", testDescription );
+			return false;
+		}
+		return true;
+	}
+
+	/**
+	 * Is the db/dialect sensitive in terms of string comparisons?
+	 * @param testDescription description of the scenario being tested.
+	 * @return true if sensitive
+	 */
+	protected boolean dialectIsCaseSensitive(String testDescription) {
+		if ( ! getDialect().areStringComparisonsCaseInsensitive() ) {
+			reportSkip( "Dialect is case sensitive. ", testDescription );
+			return true;
+		}
+		return false;
+	}
+
+	protected boolean supportsResultSetPositionQueryMethodsOnForwardOnlyCursor() {
+		if ( ! getDialect().supportsResultSetPositionQueryMethodsOnForwardOnlyCursor() ) {
+			reportSkip( "Driver does not support 'position query' methods on forward-only cursors", "query support" );
+			return false;
+		}
+		return true;
+	}
+
+	protected boolean supportsCircularCascadeDelete() {
+		if ( ! getDialect().supportsCircularCascadeDeleteConstraints() ) {
+			reportSkip( "db/dialect does not support 'circular' cascade delete constraints", "cascade delete constraint support" );
+			return false;
+		}
+		return true;
+	}
+
+	protected boolean supportsSubselectOnLeftSideIn() {
+		if ( ! getDialect().supportsSubselectAsInPredicateLHS() ) {
+			reportSkip( "Database does not support (<subselect>) in ( ... ) ", "query support" );
+			return false;
+		}
+		return true;
+	}
+
+	/**
+	 * Expected LOB usage pattern is such that I can perform an insert
+	 * via prepared statement with a parameter binding for a LOB value
+	 * without crazy casting to JDBC driver implementation-specific classes...
+	 * <p/>
+	 * Part of the trickiness here is the fact that this is largely
+	 * driver dependent.  For Oracle, which is notoriously bad with
+	 * LOB support in their drivers actually does a pretty good job with
+	 * LOB support as of the 10.2.x versions of their drivers...
+	 *
+	 * @return True if expected usage pattern is support; false otherwise.
+	 */
+	protected boolean supportsExpectedLobUsagePattern() {
+		if ( ! getDialect().supportsExpectedLobUsagePattern() ) {
+			reportSkip( "database/driver does not support expected LOB usage pattern", "LOB support" );
+			return false;
+		}
+		return true;
+	}
+
+	/**
+	 * Does the current dialect support propogating changes to LOB
+	 * values back to the database?  Talking about mutating the
+	 * underlying value as opposed to supplying a new
+	 * LOB instance...
+	 *
+	 * @return True if the changes are propogated back to the
+	 * database; false otherwise.
+	 */
+	protected boolean supportsLobValueChangePropogation() {
+		if ( ! getDialect().supportsLobValueChangePropogation() ) {
+			reportSkip( "database/driver does not support propogating LOB value change back to database", "LOB support" );
+			return false;
+		}
+		return true;
+	}
+
+	/**
+	 * Is it supported to materialize a LOB locator outside the transaction in
+	 * which it was created?
+	 * <p/>
+	 * Again, part of the trickiness here is the fact that this is largely
+	 * driver dependent.
+	 * <p/>
+	 * NOTE: all database I have tested which {@link #supportsExpectedLobUsagePattern()}
+	 * also support the ability to materialize a LOB outside the owning transaction...
+	 *
+	 * @return True if unbounded materialization is supported; false otherwise.
+	 */
+	protected boolean supportsUnboundedLobLocatorMaterialization() {
+		if ( !getDialect().supportsUnboundedLobLocatorMaterialization() ) {
+			reportSkip( "database/driver does not support materializing a LOB locator outside the 'owning' transaction", "LOB support" );
+			return false;
+		}
+		return true;
+	}
+
+	protected boolean supportsSubqueryOnMutatingTable() {
+		if ( !getDialect().supportsSubqueryOnMutatingTable() ) {
+			reportSkip( "database/driver does not support referencing mutating table in subquery", "bulk DML support" );
+			return false;
+		}
+		return true;
+	}
+
+	protected boolean dialectIs(Class dialectClass) {
+		return dialectClass.isInstance( getDialect() );
+	}
+
+	protected boolean dialectIsOneOf(Class[] dialectClasses) {
+		for ( int i = 0; i < dialectClasses.length; i++ ) {
+			if ( dialectClasses[i].isInstance( getDialect() ) ) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	protected boolean dialectIsNot(Class dialectClass) {
+		return ! dialectIs( dialectClass );
+	}
+
+	protected boolean dialectIsNot(Class[] dialectClasses) {
+		return ! dialectIsOneOf( dialectClasses );
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/functional/FunctionalTestCase.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/functional/FunctionalTestClassTestSuite.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/functional/FunctionalTestClassTestSuite.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/functional/FunctionalTestClassTestSuite.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,144 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.testing.junit.functional;
+
+import junit.framework.TestSuite;
+import junit.framework.Test;
+import junit.framework.TestResult;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * A specialized {@link junit.framework.TestSuite} implementation intended
+ * for use as an aggregate for a single test class specifically for the purpose
+ * of maintaing a single {@link org.hibernate.SessionFactory} for executings all
+ * tests defined as part of the given functional test class.
+ *
+ * @author Steve Ebersole
+ */
+public class FunctionalTestClassTestSuite extends TestSuite {
+
+	private static final Logger log = LoggerFactory.getLogger( FunctionalTestClassTestSuite.class );
+
+	private ExecutionEnvironment.Settings settings;
+	private ExecutionEnvironment environment;
+	private Throwable environmentSetupError;
+	private int testCount;
+	private int testPosition;
+
+	public FunctionalTestClassTestSuite(Class testClass, String name) {
+		super( testClass, name );
+	}
+
+	public FunctionalTestClassTestSuite(Class testClass) {
+		this( testClass, testClass.getName() );
+	}
+
+
+	public void addTest(Test test) {
+		log.trace( "adding test [" + test + "]" );
+		if ( settings == null ) {
+			if ( test instanceof ExecutionEnvironment.Settings ) {
+				settings = ( ExecutionEnvironment.Settings ) test;
+				// todo : we could also centralize the skipping of "database specific" tests here
+				// instead of duplicating this notion in AllTests and DatabaseSpecificFunctionalTestCase.
+				// as a test gets added, simply check to see if we should really add it via
+				// DatabaseSpecificFunctionalTestCase.appliesTo( ExecutionEnvironment.DIALECT )...
+			}
+		}
+		testCount++;
+		super.addTest( test );
+	}
+
+	public void run(TestResult testResult) {
+		if ( testCount == 0 ) {
+			// might be zero if database-specific...
+			return;
+		}
+		try {
+			log.info( "Starting test-suite [" + getName() + "]" );
+			setUp();
+			testPosition = 0;
+			super.run( testResult );
+		}
+		finally {
+			try {
+				tearDown();
+			}
+			catch( Throwable ignore ) {
+			}
+			log.info( "Completed test-suite [" + getName() + "]" );
+		}
+	}
+
+	public void runTest(Test test, TestResult testResult) {
+		testPosition++;
+		if ( environmentSetupError != null ) {
+			testResult.startTest( test );
+			testResult.addError( test, environmentSetupError );
+			testResult.endTest( test );
+			return;
+		}
+		if ( ! ( test instanceof FunctionalTestCase ) ) {
+			super.runTest( test, testResult );
+		}
+		else {
+			FunctionalTestCase functionalTest = ( ( FunctionalTestCase ) test );
+			try {
+				// disallow rebuilding the schema because this is the last test
+				// in this suite, thus it is about to get dropped immediately
+				// afterwards anyway...
+				environment.setAllowRebuild( testPosition < testCount );
+				functionalTest.setEnvironment( environment );
+				super.runTest( functionalTest, testResult );
+			}
+			finally {
+				functionalTest.setEnvironment( null );
+			}
+		}
+	}
+
+	protected void setUp() {
+		if ( settings == null ) {
+			return;
+		}
+		log.info( "Building aggregated execution environment" );
+		try {
+			environment = new ExecutionEnvironment( settings );
+			environment.initialize();
+		}
+		catch( Throwable t ) {
+			environmentSetupError = t;
+		}
+	}
+
+	protected void tearDown() {
+		if ( environment != null ) {
+			log.info( "Destroying aggregated execution environment" );
+			environment.complete();
+			this.environment = null;
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/functional/FunctionalTestClassTestSuite.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/functional/annotations/HibernateTestCase.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/functional/annotations/HibernateTestCase.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/functional/annotations/HibernateTestCase.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,332 @@
+// $Id: HibernateTestCase.java 19678 2010-06-02 21:27:11Z steve.ebersole at jboss.com $
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.testing.junit.functional.annotations;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.sql.Connection;
+import java.sql.SQLException;
+
+import junit.framework.TestCase;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.hibernate.cfg.Configuration;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.jdbc.Work;
+import org.hibernate.testing.junit.DialectChecks;
+import org.hibernate.testing.junit.FailureExpected;
+import org.hibernate.testing.junit.RequiresDialect;
+import org.hibernate.testing.junit.RequiresDialectFeature;
+import org.hibernate.testing.junit.SkipForDialect;
+import org.hibernate.testing.junit.SkipLog;
+import org.hibernate.tool.hbm2ddl.SchemaExport;
+import org.hibernate.util.StringHelper;
+
+/**
+ * A base class for all tests.
+ *
+ * @author Emmnauel Bernand
+ * @author Hardy Ferentschik
+ */
+public abstract class HibernateTestCase extends TestCase {
+
+	public static final Logger log = LoggerFactory.getLogger( HibernateTestCase.class );
+
+	protected static Configuration cfg;
+	private static Class<?> lastTestClass;
+
+	public HibernateTestCase() {
+		super();
+	}
+
+	public HibernateTestCase(String x) {
+		super( x );
+	}
+
+	@Override
+	public void runBare() throws Throwable {
+		Method runMethod = findTestMethod();
+
+		final Skip skip = determineSkipByDialect( Dialect.getDialect(), runMethod );
+		if ( skip != null ) {
+			reportSkip( skip );
+			return;
+		}
+
+		setUp();
+		try {
+			runTest();
+		}
+		finally {
+			tearDown();
+		}
+	}
+
+	@Override
+	protected void runTest() throws Throwable {
+		Method runMethod = findTestMethod();
+		FailureExpected failureExpected = locateAnnotation( FailureExpected.class, runMethod );
+		try {
+			super.runTest();
+			if ( failureExpected != null ) {
+				throw new FailureExpectedTestPassedException();
+			}
+		}
+		catch ( FailureExpectedTestPassedException t ) {
+			closeResources();
+			throw t;
+		}
+		catch ( Throwable t ) {
+			if ( t instanceof InvocationTargetException ) {
+				t = ( ( InvocationTargetException ) t ).getTargetException();
+			}
+			if ( t instanceof IllegalAccessException ) {
+				t.fillInStackTrace();
+			}
+			closeResources();
+			if ( failureExpected != null ) {
+				StringBuilder builder = new StringBuilder();
+				if ( StringHelper.isNotEmpty( failureExpected.message() ) ) {
+					builder.append( failureExpected.message() );
+				}
+				else {
+					builder.append( "ignoring @FailureExpected test" );
+				}
+				builder.append( " (" )
+						.append( failureExpected.jiraKey() )
+						.append( ")" );
+				SkipLog.LOG.warn( builder.toString(), t );
+			}
+			else {
+				throw t;
+			}
+		}
+	}
+
+	@Override
+	protected void setUp() throws Exception {
+		if ( cfg == null || lastTestClass != getClass() ) {
+			buildConfiguration();
+			lastTestClass = getClass();
+		}
+		else {
+			runSchemaGeneration();
+		}
+	}
+
+	@Override
+	protected void tearDown() throws Exception {
+		runSchemaDrop();
+		handleUnclosedResources();
+	}
+
+	protected static class Skip {
+		private final String reason;
+		private final String testDescription;
+
+		public Skip(String reason, String testDescription) {
+			this.reason = reason;
+			this.testDescription = testDescription;
+		}
+	}
+
+	protected final Skip determineSkipByDialect(Dialect dialect, Method runMethod) throws Exception {
+		// skips have precedence, so check them first
+		SkipForDialect skipForDialectAnn = locateAnnotation( SkipForDialect.class, runMethod );
+		if ( skipForDialectAnn != null ) {
+			for ( Class<? extends Dialect> dialectClass : skipForDialectAnn.value() ) {
+				if ( skipForDialectAnn.strictMatching() ) {
+					if ( dialectClass.equals( dialect.getClass() ) ) {
+						return buildSkip( dialect, skipForDialectAnn.comment(), skipForDialectAnn.jiraKey() );
+					}
+				}
+				else {
+					if ( dialectClass.isInstance( dialect ) ) {
+						return buildSkip( dialect, skipForDialectAnn.comment(), skipForDialectAnn.jiraKey() );
+					}
+				}
+			}
+		}
+
+		// then check against the requires
+		RequiresDialect requiresDialectAnn = locateAnnotation( RequiresDialect.class, runMethod );
+		if ( requiresDialectAnn != null ) {
+			for ( Class<? extends Dialect> dialectClass : requiresDialectAnn.value() ) {
+				if ( requiresDialectAnn.strictMatching() ) {
+					if ( !dialectClass.equals( dialect.getClass() ) ) {
+						return buildSkip( dialect, null, null );
+					}
+				}
+				else {
+					if ( !dialectClass.isInstance( dialect ) ) {
+						return buildSkip( dialect, requiresDialectAnn.comment(), requiresDialectAnn.jiraKey() );
+					}
+				}
+			}
+		}
+
+		// then check against a dialect feature
+		RequiresDialectFeature requiresDialectFeatureAnn = locateAnnotation( RequiresDialectFeature.class, runMethod );
+		if ( requiresDialectFeatureAnn != null ) {
+			Class<? extends DialectChecks> checkClass = requiresDialectFeatureAnn.value();
+			DialectChecks check = checkClass.newInstance();
+			boolean skip = check.include( dialect );
+			if ( skip ) {
+				return buildSkip( dialect, requiresDialectFeatureAnn.comment(), requiresDialectFeatureAnn.jiraKey() );
+			}
+		}
+		return null;
+	}
+
+	protected <T extends Annotation> T locateAnnotation(Class<T> annotationClass, Method runMethod) {
+		T annotation = runMethod.getAnnotation( annotationClass );
+		if ( annotation == null ) {
+			annotation = getClass().getAnnotation( annotationClass );
+		}
+		if ( annotation == null ) {
+			annotation = runMethod.getDeclaringClass().getAnnotation( annotationClass );
+		}
+		return annotation;
+	}
+
+	protected Skip buildSkip(Dialect dialect, String comment, String jiraKey) {
+		StringBuilder buffer = new StringBuilder();
+		buffer.append( "skipping database-specific test [" );
+		buffer.append( fullTestName() );
+		buffer.append( "] for dialect [" );
+		buffer.append( dialect.getClass().getName() );
+		buffer.append( ']' );
+
+		if ( StringHelper.isNotEmpty( comment ) ) {
+			buffer.append( "; " ).append( comment );
+		}
+
+		if ( StringHelper.isNotEmpty( jiraKey ) ) {
+			buffer.append( " (" ).append( jiraKey ).append( ')' );
+		}
+
+		return new Skip( buffer.toString(), null );
+	}
+
+	public String fullTestName() {
+		return this.getClass().getName() + "#" + this.getName();
+	}
+
+	private Method findTestMethod() {
+		String fName = getName();
+		assertNotNull( fName );
+		Method runMethod = null;
+		try {
+			runMethod = getClass().getMethod( fName );
+		}
+		catch ( NoSuchMethodException e ) {
+			fail( "Method \"" + fName + "\" not found" );
+		}
+		if ( !Modifier.isPublic( runMethod.getModifiers() ) ) {
+			fail( "Method \"" + fName + "\" should be public" );
+		}
+		return runMethod;
+	}
+
+	protected abstract void buildConfiguration() throws Exception;
+
+	protected abstract Class<?>[] getAnnotatedClasses();
+
+	protected String[] getMappings() {
+		return new String[] { };
+	}
+
+	protected abstract void handleUnclosedResources();
+
+	protected abstract void closeResources();
+
+	protected String[] getAnnotatedPackages() {
+		return new String[] { };
+	}
+
+	protected String[] getXmlFiles() {
+		return new String[] { };
+	}
+
+	protected Dialect getDialect() {
+		return Dialect.getDialect();
+	}
+
+	protected static void setCfg(Configuration cfg) {
+		HibernateTestCase.cfg = cfg;
+	}
+
+	protected static Configuration getCfg() {
+		return cfg;
+	}
+
+	protected void configure(Configuration cfg) {
+	}
+
+	protected boolean recreateSchema() {
+		return true;
+	}
+
+	protected void runSchemaGeneration() {
+		SchemaExport export = new SchemaExport( cfg );
+		export.create( true, true );
+	}
+
+	protected void runSchemaDrop() {
+		SchemaExport export = new SchemaExport( cfg );
+		export.drop( true, true );
+	}
+
+	private void reportSkip(Skip skip) {
+		reportSkip( skip.reason, skip.testDescription );
+	}
+
+	protected void reportSkip(String reason, String testDescription) {
+		StringBuilder builder = new StringBuilder();
+		builder.append( "*** skipping test [" );
+		builder.append( fullTestName() );
+		builder.append( "] - " );
+		builder.append( testDescription );
+		builder.append( " : " );
+		builder.append( reason );
+		SkipLog.LOG.warn( builder.toString() );
+	}
+
+	public class RollbackWork implements Work {
+
+		public void execute(Connection connection) throws SQLException {
+			connection.rollback();
+		}
+	}
+
+	private static class FailureExpectedTestPassedException extends Exception {
+		public FailureExpectedTestPassedException() {
+			super( "Test marked as @FailureExpected, but did not fail!" );
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/junit/functional/annotations/HibernateTestCase.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/tm/ConnectionProviderImpl.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/tm/ConnectionProviderImpl.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/tm/ConnectionProviderImpl.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,83 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.testing.tm;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.Properties;
+
+import org.hibernate.HibernateException;
+import org.hibernate.connection.ConnectionProvider;
+import org.hibernate.connection.ConnectionProviderFactory;
+
+/**
+ * A {@link ConnectionProvider} implementation adding JTA-style transactionality
+ * around the returned connections using the {@link SimpleJtaTransactionManagerImpl}.
+ *
+ * @author Gavin King
+ * @author Steve Ebersole
+ */
+public class ConnectionProviderImpl implements ConnectionProvider {
+	private static ConnectionProvider actualConnectionProvider = ConnectionProviderFactory.newConnectionProvider();
+
+	private boolean isTransactional;
+
+	public static ConnectionProvider getActualConnectionProvider() {
+		return actualConnectionProvider;
+	}
+
+	public void configure(Properties props) throws HibernateException {
+	}
+
+	public Connection getConnection() throws SQLException {
+		SimpleJtaTransactionImpl currentTransaction = SimpleJtaTransactionManagerImpl.getInstance().getCurrentTransaction();
+		if ( currentTransaction == null ) {
+			isTransactional = false;
+			return actualConnectionProvider.getConnection();
+		}
+		else {
+			isTransactional = true;
+			Connection connection = currentTransaction.getEnlistedConnection();
+			if ( connection == null ) {
+				connection = actualConnectionProvider.getConnection();
+				currentTransaction.enlistConnection( connection );
+			}
+			return connection;
+		}
+	}
+
+	public void closeConnection(Connection conn) throws SQLException {
+		if ( !isTransactional ) {
+			conn.close();
+		}
+	}
+
+	public void close() throws HibernateException {
+		actualConnectionProvider.close();
+	}
+
+	public boolean supportsAggressiveRelease() {
+		return true;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/tm/ConnectionProviderImpl.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/tm/SimpleJtaTransactionImpl.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/tm/SimpleJtaTransactionImpl.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/tm/SimpleJtaTransactionImpl.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,159 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.testing.tm;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.LinkedList;
+import javax.transaction.HeuristicMixedException;
+import javax.transaction.HeuristicRollbackException;
+import javax.transaction.RollbackException;
+import javax.transaction.Status;
+import javax.transaction.Synchronization;
+import javax.transaction.SystemException;
+import javax.transaction.Transaction;
+import javax.transaction.xa.XAResource;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * SimpleJtaTransactionImpl implementation
+ *
+ * @author Steve Ebersole
+ */
+public class SimpleJtaTransactionImpl implements Transaction {
+	private static final Logger log = LoggerFactory.getLogger( SimpleJtaTransactionImpl.class );
+
+	private int status;
+	private LinkedList synchronizations;
+	private Connection connection; // the only resource we care about is jdbc connection
+	private final SimpleJtaTransactionManagerImpl jtaTransactionManager;
+
+	public SimpleJtaTransactionImpl(SimpleJtaTransactionManagerImpl jtaTransactionManager) {
+		this.jtaTransactionManager = jtaTransactionManager;
+		this.status = Status.STATUS_ACTIVE;
+	}
+
+	public int getStatus() {
+		return status;
+	}
+
+	public void commit()
+			throws RollbackException, HeuristicMixedException, HeuristicRollbackException, IllegalStateException, SystemException {
+
+		if ( status == Status.STATUS_MARKED_ROLLBACK ) {
+			log.trace( "on commit, status was marked for rollback-only" );
+			rollback();
+		}
+		else {
+			status = Status.STATUS_PREPARING;
+
+			for ( int i = 0; i < synchronizations.size(); i++ ) {
+				Synchronization s = ( Synchronization ) synchronizations.get( i );
+				s.beforeCompletion();
+			}
+
+			status = Status.STATUS_COMMITTING;
+
+			if ( connection != null ) {
+				try {
+					connection.commit();
+					connection.close();
+				}
+				catch ( SQLException sqle ) {
+					status = Status.STATUS_UNKNOWN;
+					throw new SystemException();
+				}
+			}
+
+			status = Status.STATUS_COMMITTED;
+
+			for ( int i = 0; i < synchronizations.size(); i++ ) {
+				Synchronization s = ( Synchronization ) synchronizations.get( i );
+				s.afterCompletion( status );
+			}
+
+			//status = Status.STATUS_NO_TRANSACTION;
+			jtaTransactionManager.endCurrent( this );
+		}
+	}
+
+	public void rollback() throws IllegalStateException, SystemException {
+		status = Status.STATUS_ROLLEDBACK;
+
+		if ( connection != null ) {
+			try {
+				connection.rollback();
+				connection.close();
+			}
+			catch ( SQLException sqle ) {
+				status = Status.STATUS_UNKNOWN;
+				throw new SystemException();
+			}
+		}
+
+		for ( int i = 0; i < synchronizations.size(); i++ ) {
+			Synchronization s = ( Synchronization ) synchronizations.get( i );
+			s.afterCompletion( status );
+		}
+
+		//status = Status.STATUS_NO_TRANSACTION;
+		jtaTransactionManager.endCurrent( this );
+	}
+
+	public void setRollbackOnly() throws IllegalStateException, SystemException {
+		status = Status.STATUS_MARKED_ROLLBACK;
+	}
+
+	public void registerSynchronization(Synchronization synchronization)
+			throws RollbackException, IllegalStateException, SystemException {
+		// todo : find the spec-allowable statuses during which synch can be registered...
+		if ( synchronizations == null ) {
+			synchronizations = new LinkedList();
+		}
+		synchronizations.add( synchronization );
+	}
+
+	public void enlistConnection(Connection connection) {
+		if ( this.connection != null ) {
+			throw new IllegalStateException( "Connection already registered" );
+		}
+		this.connection = connection;
+	}
+
+	public Connection getEnlistedConnection() {
+		return connection;
+	}
+
+
+	public boolean enlistResource(XAResource xaResource)
+			throws RollbackException, IllegalStateException, SystemException {
+		return false;
+	}
+
+	public boolean delistResource(XAResource xaResource, int i) throws IllegalStateException, SystemException {
+		return false;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/tm/SimpleJtaTransactionImpl.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/tm/SimpleJtaTransactionManagerImpl.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/tm/SimpleJtaTransactionManagerImpl.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/tm/SimpleJtaTransactionManagerImpl.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,110 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.testing.tm;
+
+import javax.transaction.HeuristicMixedException;
+import javax.transaction.HeuristicRollbackException;
+import javax.transaction.InvalidTransactionException;
+import javax.transaction.NotSupportedException;
+import javax.transaction.RollbackException;
+import javax.transaction.Status;
+import javax.transaction.SystemException;
+import javax.transaction.Transaction;
+import javax.transaction.TransactionManager;
+
+/**
+ * TransactionManager implementation specifically designed for use in test suite and simple usage
+ * scenarios.  For example, it assumes that there is only ever a single transaction active at a
+ * given time.
+ *
+ * @author Gavin King
+ * @author Steve Ebersole
+ */
+public class SimpleJtaTransactionManagerImpl implements TransactionManager {
+	private static final SimpleJtaTransactionManagerImpl INSTANCE = new SimpleJtaTransactionManagerImpl();
+
+	private SimpleJtaTransactionImpl currentTransaction;
+
+	public static SimpleJtaTransactionManagerImpl getInstance() {
+		return INSTANCE;
+	}
+
+	public int getStatus() throws SystemException {
+		return currentTransaction == null ? Status.STATUS_NO_TRANSACTION : currentTransaction.getStatus();
+	}
+
+	public Transaction getTransaction() throws SystemException {
+		return currentTransaction;
+	}
+
+	public SimpleJtaTransactionImpl getCurrentTransaction() {
+		return currentTransaction;
+	}
+
+	public void begin() throws NotSupportedException, SystemException {
+		currentTransaction = new SimpleJtaTransactionImpl( this );
+	}
+
+	public Transaction suspend() throws SystemException {
+		SimpleJtaTransactionImpl suspended = currentTransaction;
+		currentTransaction = null;
+		return suspended;
+	}
+
+	public void resume(Transaction transaction)
+			throws InvalidTransactionException, IllegalStateException, SystemException {
+		currentTransaction = ( SimpleJtaTransactionImpl ) transaction;
+	}
+
+	public void commit()
+			throws RollbackException, HeuristicMixedException, HeuristicRollbackException, SecurityException, IllegalStateException, SystemException {
+		if ( currentTransaction == null ) {
+			throw new IllegalStateException( "no current transaction to commit" );
+		}
+		currentTransaction.commit();
+	}
+
+	public void rollback() throws IllegalStateException, SecurityException, SystemException {
+		if ( currentTransaction == null ) {
+			throw new IllegalStateException( "no current transaction" );
+		}
+		currentTransaction.rollback();
+	}
+
+	public void setRollbackOnly() throws IllegalStateException, SystemException {
+		if ( currentTransaction == null ) {
+			throw new IllegalStateException( "no current transaction" );
+		}
+		currentTransaction.setRollbackOnly();
+	}
+
+	public void setTransactionTimeout(int i) throws SystemException {
+	}
+
+	void endCurrent(SimpleJtaTransactionImpl transaction) {
+		if ( transaction == currentTransaction ) {
+			currentTransaction = null;
+		}
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/tm/SimpleJtaTransactionManagerImpl.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/tm/TransactionManagerLookupImpl.java
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/tm/TransactionManagerLookupImpl.java	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/tm/TransactionManagerLookupImpl.java	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,50 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.testing.tm;
+
+import java.util.Properties;
+import javax.transaction.TransactionManager;
+import javax.transaction.Transaction;
+
+import org.hibernate.transaction.TransactionManagerLookup;
+import org.hibernate.HibernateException;
+
+/**
+ * TransactionManagerLookupImpl implementation
+ *
+ * @author Steve Ebersole
+ */
+public class TransactionManagerLookupImpl implements TransactionManagerLookup {
+	public TransactionManager getTransactionManager(Properties props) throws HibernateException {
+		return SimpleJtaTransactionManagerImpl.getInstance();
+	}
+
+	public String getUserTransactionName() {
+		throw new UnsupportedOperationException( "jndi currently not implemented for these tests" );
+	}
+
+	public Object getTransactionIdentifier(Transaction transaction) {
+		return transaction;
+	}
+}


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/tm/TransactionManagerLookupImpl.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/tm/package.html
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/tm/package.html	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/tm/package.html	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+
+<!--
+  ~ Hibernate, Relational Persistence for Idiomatic Java
+  ~
+  ~ Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
+  ~ indicated by the @author tags or express copyright attribution
+  ~ statements applied by the authors.  All third-party contributions are
+  ~ distributed under license by Red Hat Middleware LLC.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, as published by the Free Software Foundation.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  ~ or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+  ~ for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public License
+  ~ along with this distribution; if not, write to:
+  ~ Free Software Foundation, Inc.
+  ~ 51 Franklin Street, Fifth Floor
+  ~ Boston, MA  02110-1301  USA
+  -->
+<HTML>
+<HEAD>
+    <TITLE>Package Information - org.hibernate.test.tm</TITLE>
+</HEAD>
+<BODY>
+<p>
+    Defines a simplified JTA TransactionManager and transactional connection pool
+    designed for use in test suite and simple usage scenarios. For example, it
+    is assumed that there is only ever a single transaction active at a given time.
+    Also, the only 'resource' that the transaction tracks is a single JDBC connection.
+</p>
+</BODY>
+</HTML>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/java/org/hibernate/testing/tm/package.html
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/resources/hibernate.cfg.xml
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/resources/hibernate.cfg.xml	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/resources/hibernate.cfg.xml	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,8 @@
+<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
+<hibernate-configuration>
+	<session-factory name="foo">
+		<property name="show_sql">true</property>
+		<mapping resource="org/hibernate/test/legacy/Simple.hbm.xml"/>
+		<class-cache class="org.hibernate.test.legacy.Simple" region="Simple" usage="read-write"/>
+	</session-factory>
+</hibernate-configuration>
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/resources/hibernate.cfg.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: core/branches/gradle2/hibernate-core/src/intgTest/resources/log4j.properties
===================================================================
--- core/branches/gradle2/hibernate-core/src/intgTest/resources/log4j.properties	                        (rev 0)
+++ core/branches/gradle2/hibernate-core/src/intgTest/resources/log4j.properties	2010-06-23 07:19:32 UTC (rev 19788)
@@ -0,0 +1,36 @@
+#
+# Hibernate, Relational Persistence for Idiomatic Java
+#
+# Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+# indicated by the @author tags or express copyright attribution
+# statements applied by the authors.  All third-party contributions are
+# distributed under license by Red Hat Middleware LLC.
+#
+# This copyrighted material is made available to anyone wishing to use, modify,
+# copy, or redistribute it subject to the terms and conditions of the GNU
+# Lesser General Public License, as published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+# for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this distribution; if not, write to:
+# Free Software Foundation, Inc.
+# 51 Franklin Street, Fifth Floor
+# Boston, MA  02110-1301  USA
+#
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.Target=System.out
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
+
+log4j.rootLogger=info, stdout
+
+log4j.logger.org.hibernate.test=info
+log4j.logger.org.hibernate.tool.hbm2ddl=debug
+log4j.logger.org.hibernate.hql.ast.QueryTranslatorImpl=trace
+log4j.logger.org.hibernate.hql.ast.HqlSqlWalker=trace
+log4j.logger.org.hibernate.hql.ast.SqlGenerator=trace
+log4j.logger.org.hibernate.hql.ast.AST=trace
\ No newline at end of file


Property changes on: core/branches/gradle2/hibernate-core/src/intgTest/resources/log4j.properties
___________________________________________________________________
Name: svn:eol-style
   + native



More information about the hibernate-commits mailing list