[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 < 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<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<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 > '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