[hibernate-commits] Hibernate SVN: r18049 - in annotations/branches/v3_4_0_GA_CP/src/test: java and 66 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Tue Nov 24 16:03:23 EST 2009


Author: stliu
Date: 2009-11-24 16:03:15 -0500 (Tue, 24 Nov 2009)
New Revision: 18049

Added:
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/A320.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/A320b.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/AlternativeNamingStrategy.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/AmericaCupClass.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Boat.hbm.xml
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Boat.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Company.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/ConfigurationTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Country.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Customer.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Discount.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/EntityTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Ferry.hbm.xml
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Ferry.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Flight.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/FlyingObject.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/IncorrectEntity.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/JoinedSubclassTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Passport.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Plane.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Port.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/RequiresDialect.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/SafeMappingTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/SecuredBindingTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Sky.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/TestCase.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Thing.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Ticket.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/TicketComparator.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/access/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/access/AccessTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/access/Bed.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/access/BigBed.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/access/Chair.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/access/Furniture.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/access/Gardenshed.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/access/Thingy.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/access/Woody.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/AnyTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/CharProperty.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/IntegerProperty.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/LongProperty.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/Property.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/PropertyList.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/PropertyMap.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/PropertySet.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/StringProperty.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/package-info.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/array/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/array/ArrayTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/array/Competitor.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/array/Contest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/backquotes/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/backquotes/BackquoteTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/backquotes/Bug.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/backquotes/Category.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/bytecode/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/bytecode/Hammer.hbm.xml
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/bytecode/Hammer.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/bytecode/ProxyBreakingTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/bytecode/Tool.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cascade/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cascade/CascadeTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cascade/Mouth.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cascade/Tooth.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/A.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/AId.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/B.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/C.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/Channel.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/Child.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/ChildPk.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/CompositeIdTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/LittleGenius.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/Order.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/OrderLine.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/OrderLinePk.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/Parent.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/ParentPk.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/Presenter.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/Product.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/TvMagazin.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/TvMagazinPk.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/TvProgram.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/TvProgramIdClass.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/Boy.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/Brand.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/Character.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/CollectionElementTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/CountryAttitude.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/LocalizedString.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/Matrix.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/TestCourse.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/Toy.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/deepcollectionelements/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/deepcollectionelements/A.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/deepcollectionelements/B.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/deepcollectionelements/C.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/deepcollectionelements/DeepCollectionElementTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/indexedCollection/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/indexedCollection/Contact.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/indexedCollection/IndexedCollectionOfElementsTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/indexedCollection/Sale.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/configuration/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/configuration/ConfigurationTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/configuration/orm.xml
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/configuration/package-info.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/duplicatedgenerator/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/duplicatedgenerator/DuplicateTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/duplicatedgenerator/Flight.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/duplicatedgenerator/orm.xml
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Address.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/AddressType.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Book.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/CorpType.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Country.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Deal.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/EmbeddedTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/FixedLeg.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/FloatLeg.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/InternetProvider.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Leg.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/LegalStructure.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Manager.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Nationality.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/NotonialDeal.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Person.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/RegionalArticle.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/RegionalArticlePk.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/SpreadDeal.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Summary.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Swap.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/VanillaSwap.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Address.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/BasicHibernateAnnotationsTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Bid.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/CasterStringType.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/CommunityBid.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Country.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Flight.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Forest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Java5FeaturesTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Length.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/MonetaryAmount.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/MonetaryAmountUserType.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/PropertyDefaultMappingsTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Race.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Ransom.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Starred.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Tree.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/WashingMachine.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/ZipCode.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/package-info.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entitynonentity/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entitynonentity/Cellular.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entitynonentity/Communication.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entitynonentity/EntityNonEntityTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entitynonentity/GSM.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entitynonentity/Interaction.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entitynonentity/Phone.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entitynonentity/Voice.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fetch/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fetch/Branch.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fetch/FetchingTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fetch/Leaf.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fetch/Person.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fetch/Stay.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/A.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/A_PK.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/B.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/C.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/ClassA.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/ClassB.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/ClassC.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/ClassD.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/D.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/D_PK.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/FkCircularityTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/Classes.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/DNA.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/Dummy.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/EmbeddedGenericsTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/Gene.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/GenericsTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/Item.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/Paper.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/PaperType.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/Price.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/PricedStuff.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/SomeGuy.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/State.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/StateType.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/Stuff.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/UnresolvedTypeTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/WildEntity.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/Child.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy1.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy2.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy22.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/GenericsInheritanceTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/Parent.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy1.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy2.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy22.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/hibernate.cfg.xml
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/EnumIdTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/IdClassTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/IdTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/JoinColumnOverrideTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/UUIDGenerator.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Ball.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/BreakDance.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Bunny.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Computer.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Department.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Dog.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/FirTree.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Footballer.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/FootballerPk.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Furniture.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/GoalKeeper.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Home.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Location.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/MilitaryBuilding.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Monkey.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Phone.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Planet.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/PlanetCheatSheet.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/PointyTooth.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Shoe.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/SoundSystem.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Store.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Tower.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Tree.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/TwinkleToes.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/package-info.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/EnumIdTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/IdClassTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/IdTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/JoinColumnOverrideTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/UUIDGenerator.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Ball.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/BreakDance.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Bunny.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Computer.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Department.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Dog.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/FirTree.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Footballer.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/FootballerPk.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Furniture.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/GoalKeeper.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Home.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Location.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/MilitaryBuilding.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Monkey.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Phone.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Planet.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/PlanetCheatSheet.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/PointyTooth.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Shoe.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/SoundSystem.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Store.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Tower.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Tree.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/TwinkleToes.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/package-info.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/identifiercollection/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/identifiercollection/IdentifierCollectionTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/identifiercollection/Passport.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/identifiercollection/Stamp.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/BasketItems.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/BasketItemsPK.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/Card.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/CardField.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/CardKey.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/Customer.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/Customers.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/IdManyToOneTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/Project.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/ShoppingBaskets.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/ShoppingBasketsPK.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/Store.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/StoreCustomer.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/StoreCustomerPK.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/A.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/Acces.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/AlphabeticalIdManyToOneTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/AlphabeticalManyToOneTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/B.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/BId.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/Benefserv.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/C.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/CId.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/Droitacces.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/Service.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/immutable/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/immutable/Country.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/immutable/Foobar.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/immutable/ImmutableTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/immutable/State.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/AddressBook.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/AddressEntry.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/AddressEntryPk.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/AlphabeticalDirectory.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Atmosphere.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Drawer.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Dress.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Gas.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/GasKey.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Generation.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/GenerationGroup.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/GenerationUser.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/IndexedCollectionTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/MapKeyTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/News.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Newspaper.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Painter.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Painting.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/PaintingPk.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/PressReleaseAgency.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Software.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Trainee.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Training.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Version.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Wardrobe.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/Apple.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/Carrot.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/Fruit.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/SubclassTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/Tomato.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/Vegetable.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/VegetablePk.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Alarm.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Asset.hbm.xml
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Asset.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Clothing.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Document.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/EventInformation.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/File.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/FinancialAsset.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Folder.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/JoinedSubclassAndSecondaryTable.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/JoinedSubclassTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Parent.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Pool.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/ProgramExecution.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/PropertyAsset.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Sweater.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/SwimmingPool.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/SymbolicLink.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/mixed/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/mixed/Document.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/mixed/File.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/mixed/Folder.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/mixed/SubclassTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/mixed/SymbolicLink.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/singletable/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/singletable/Building.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/singletable/Funk.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/singletable/House.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/singletable/Music.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/singletable/Noise.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/singletable/PaperTrash.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/singletable/Rock.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/singletable/Trash.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/union/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/union/Document.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/union/File.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/union/Folder.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/union/SubclassTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/union/SymbolicLink.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/interfaces/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/interfaces/Contact.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/interfaces/ContactImpl.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/interfaces/InterfacesTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/interfaces/User.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/interfaces/UserImpl.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/A.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/B.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/C.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/Cat.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/Death.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/Dog.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/DogPk.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/JoinTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/Life.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/loader/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/loader/Loader.hbm.xml
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/loader/LoaderTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/loader/Player.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/loader/Team.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/lob/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/lob/Book.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/lob/CompiledCode.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/lob/Editor.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/lob/LobTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Building.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/BuildingCompany.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Cat.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/CatPk.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/City.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Company.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Contractor.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Employee.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Employer.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Friend.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Group.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/GroupWithSet.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Inspector.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/InspectorPrefixes.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/KnownClient.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Man.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/ManPk.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/ManyToManyTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Permission.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Store.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Supplier.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Woman.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/WomanPk.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Zone.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/BiggestForest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Car.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Carz.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Child.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Color.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Customer.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Deal.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/DistrictUser.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/ForestType.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Frame.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Lens.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Lotz.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/LotzPK.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/ManyToOneJoinTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/ManyToOneOnNonPkTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/ManyToOneTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Node.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/NodePk.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Order.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/OrderLine.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Parent.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/ParentPk.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/TreeType.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/User.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/UserPK.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/referencedcolumnname/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/referencedcolumnname/GenericObject.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/referencedcolumnname/Item.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/referencedcolumnname/ManyToOneReferencedColumnNameTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/referencedcolumnname/Vendor.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/referencedcolumnname/WarehouseItem.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/referencedcolumnname/ZItemCost.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/namingstrategy/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/namingstrategy/Address.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/namingstrategy/DummyNamingStrategy.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/namingstrategy/NamingStrategyTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/namingstrategy/Person.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/naturalid/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/naturalid/Citizen.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/naturalid/NaturalIdOnManyToOne.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/naturalid/NaturalIdOnSingleManyToOneTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/naturalid/NaturalIdTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/naturalid/State.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/notfound/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/notfound/Coin.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/notfound/Currency.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/notfound/NotFoundTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Child.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/City.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Monkey.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/OneToManyTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Order.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/OrderByTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/OrderID.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/OrderItem.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/OrderItemID.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Organisation.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/OrganisationUser.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Parent.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/ParentPk.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Person.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/PoliticalParty.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Politician.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Soldier.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Street.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Tiger.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Trainer.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Troop.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/Address.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/Body.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/Client.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/Computer.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/ComputerPk.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/Heart.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/OneToOneErrorTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/OneToOneTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/Owner.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/OwnerAddress.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/Party.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/PartyAffiliate.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/SerialNumber.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/SerialNumberPk.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/Show.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/ShowDescription.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/Trousers.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/TrousersZip.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/primarykey/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/primarykey/Address.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/primarykey/NullablePrimaryKeyTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/primarykey/Person.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/orm.xml
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/override/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/override/AssociationOverrideTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/override/Location.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/override/Move.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/override/Trip.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/persister/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/persister/Card.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/persister/CollectionPersister.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/persister/Deck.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/persister/EntityPersister.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/persister/PersisterTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/polymorphism/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/polymorphism/Car.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/polymorphism/MovingThing.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/polymorphism/PolymorphismTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/polymorphism/SportCar.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/Area.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/Captain.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/CasimirParticle.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/Chaos.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/Dictionary.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/Dimensions.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/Identity.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/Mark.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/Night.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/QueryAndSQLTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/SpaceShip.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/SynonymousDictionary.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/orm.xml
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/quote/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/quote/QuoteTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/quote/Role.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/quote/User.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/Bag.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/Clothes.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/House.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/Inhabitant.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/Item.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/ItemCost.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/Luggage.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/Postman.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/Rambler.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/ReferencedColumnNameTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/Vendor.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/WarehouseItem.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/Administration.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/Availability.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/BusTrip.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/BusTripPk.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/Competition.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/EJB3OverridenAnnotationReaderTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/LogListener.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/Match.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/Organization.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/OtherLogListener.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/SocialSecurityMoralAccount.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/SocialSecurityNumber.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/SocialSecurityPhysicalAccount.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/TennisMatch.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/XMLContextTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/metadata-complete.xml
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/orm.xml
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/strategy/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/strategy/Location.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/strategy/Storm.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/strategy/StrategyTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tableperclass/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tableperclass/Component.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tableperclass/Machine.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tableperclass/Product.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tableperclass/Robot.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tableperclass/T800.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tableperclass/TablePerClassTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/target/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/target/Brand.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/target/Luggage.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/target/LuggageImpl.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/target/Owner.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/target/OwnerImpl.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/target/Size.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/target/SizeImpl.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/target/TargetTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/Country.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/Cuisine.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/DataProxyHandler.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/DynamicComponentTuplizer.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/DynamicEntityTuplizer.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/DynamicInstantiator.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/EntityNameInterceptor.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/ProxyHelper.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/TuplizerTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/type/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/type/Dvd.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/type/MyOid.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/type/MyOidGenerator.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/type/MyOidType.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/type/TypeTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/various/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/various/Antenna.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/various/Conductor.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/various/GeneratedTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/various/IndexTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/various/ProfessionalAgreement.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/various/Truck.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/various/Vehicule.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/various/VersionTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/CarModel.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/Ejb3XmlTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/Light.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/Lighter.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/Manufacturer.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/Model.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/orm.xml
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/orm2.xml
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/orm3.xml
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/A.hbm.xml
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/A.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/AImpl.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/B.hbm.xml
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/B.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/BImpl.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/CloudType.hbm.xml
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/CloudType.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/Government.hbm.xml
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/Government.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/HbmTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/HbmWithIdentityTest.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/PrimeMinister.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/Sky.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/Z.java
   annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/ZImpl.java
Removed:
   annotations/branches/v3_4_0_GA_CP/src/test/org/
Log:
JBPAPP-3150 change the build tool of Hibernate Annotations(eap 5 cp branch)

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/A320.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/A320.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/A320.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,23 @@
+//$Id: A320.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations;
+
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at DiscriminatorValue("A320")
+ at Entity()
+public class A320 extends Plane {
+	private String javaEmbeddedVersion;
+
+	public String getJavaEmbeddedVersion() {
+		return javaEmbeddedVersion;
+	}
+
+	public void setJavaEmbeddedVersion(String string) {
+		javaEmbeddedVersion = string;
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/A320b.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/A320b.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/A320b.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,12 @@
+//$Id: A320b.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity()
+public class A320b extends A320 {
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/AlternativeNamingStrategy.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/AlternativeNamingStrategy.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/AlternativeNamingStrategy.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,73 @@
+//$Id: AlternativeNamingStrategy.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations;
+
+import org.hibernate.cfg.EJB3NamingStrategy;
+import org.hibernate.cfg.NamingStrategy;
+import org.hibernate.util.StringHelper;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class AlternativeNamingStrategy extends EJB3NamingStrategy {
+	public static NamingStrategy INSTANCE = new AlternativeNamingStrategy();
+
+	public String classToTableName(String className) {
+		return tableName( StringHelper.unqualify( className ) );
+	}
+
+	public String propertyToColumnName(String propertyName) {
+		return columnName( StringHelper.unqualify( propertyName ) );
+	}
+
+	public String tableName(String tableName) {
+		return "table_" + tableName;
+	}
+
+	public String columnName(String columnName) {
+		return "f_" + columnName;
+	}
+
+	public String propertyToTableName(String className, String propertyName) {
+		return tableName( StringHelper.unqualify( className ) + "_" + StringHelper.unqualify( propertyName ) );
+	}
+
+	public String logicalColumnName(String columnName, String propertyName) {
+		return StringHelper.isNotEmpty( columnName ) ? columnName : propertyName;
+	}
+
+	public String collectionTableName(
+			String ownerEntity, String ownerEntityTable, String associatedEntity, String associatedEntityTable,
+			String propertyName
+	) {
+		return tableName(
+				new StringBuilder( ownerEntityTable ).append( "_" )
+						.append(
+								associatedEntityTable != null ?
+										associatedEntityTable :
+										StringHelper.unqualify( propertyName )
+						).toString()
+		);
+	}
+
+	public String logicalCollectionTablelName(
+			String tableName,
+			String ownerEntityTable, String associatedEntityTable, String propertyName
+	) {
+		if ( tableName != null ) {
+			return tableName;
+		}
+		else {
+			//use of a stringbuffer to workaround a JDK bug
+			return new StringBuffer( ownerEntityTable ).append( "_" )
+					.append(
+							associatedEntityTable != null ?
+									associatedEntityTable :
+									StringHelper.unqualify( propertyName )
+					).toString();
+		}
+	}
+
+	public String logicalCollectionColumnName(String columnName, String propertyName, String referencedColumn) {
+		return StringHelper.isNotEmpty( columnName ) ? columnName : propertyName + "_" + referencedColumn;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/AmericaCupClass.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/AmericaCupClass.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/AmericaCupClass.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,26 @@
+//$Id: AmericaCupClass.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations;
+
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.PrimaryKeyJoinColumn;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at PrimaryKeyJoinColumn(name = "BOAT_ID")
+public class AmericaCupClass extends Boat {
+	private Country country;
+
+	@ManyToOne()
+	@JoinColumn(name = "COUNTRY_ID")
+	public Country getCountry() {
+		return country;
+	}
+
+	public void setCountry(Country country) {
+		this.country = country;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Boat.hbm.xml
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Boat.hbm.xml	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Boat.hbm.xml	2009-11-24 21:03:15 UTC (rev 18049)
@@ -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">
+
+<!--
+
+  Used to demonstrate the declarative configuration
+  of both hbm files and annotated classes
+  See hibernate.cfg.xml and ConfigurationTest
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.annotations">
+
+    <class name="Boat" table="BoatInXml">
+
+        <id name="id">
+            <generator class="native"/>
+        </id>
+
+        <property name="size" column="boat_size"/>
+
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Boat.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Boat.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Boat.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,57 @@
+//$Id: Boat.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+
+
+/**
+ * Boat class. Mapped in a Joined manner
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity()
+ at Inheritance(
+		strategy = InheritanceType.JOINED
+)
+public class Boat implements Serializable {
+	private Integer id;
+	private int size;
+	private int weight;
+
+	public Boat() {
+		super();
+	}
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	@Column(name = "boat_size")
+	public int getSize() {
+		return size;
+	}
+
+	public void setId(Integer integer) {
+		id = integer;
+	}
+
+	public void setSize(int i) {
+		size = i;
+	}
+
+	public int getWeight() {
+		return weight;
+	}
+
+	public void setWeight(int weight) {
+		this.weight = weight;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Company.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Company.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Company.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,46 @@
+//$Id: Company.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+
+/**
+ * Corporate like Air France
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity(name = "Corporation")
+public class Company implements Serializable {
+	private Integer id;
+	private String name;
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+
+	public void setId(Integer integer) {
+		id = integer;
+	}
+
+
+	public void setName(String string) {
+		name = string;
+	}
+
+	//should be treated as getter
+	private int[] getWorkingHoursPerWeek(Set<Date> holidayDays) {
+        return null;
+    }
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/ConfigurationTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/ConfigurationTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/ConfigurationTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,155 @@
+//$Id: ConfigurationTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations;
+
+import org.hibernate.HibernateException;
+import org.hibernate.MappingException;
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.AnnotationConfiguration;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ConfigurationTest extends junit.framework.TestCase {
+	public void testDeclarativeMix() throws Exception {
+		AnnotationConfiguration cfg = new AnnotationConfiguration();
+		cfg.configure( "org/hibernate/test/annotations/hibernate.cfg.xml" );
+		cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
+		SessionFactory sf = cfg.buildSessionFactory();
+		assertNotNull( sf );
+		Session s = sf.openSession();
+		Transaction tx = s.beginTransaction();
+		Query q = s.createQuery( "from Boat" );
+		assertEquals( 0, q.list().size() );
+		q = s.createQuery( "from Plane" );
+		assertEquals( 0, q.list().size() );
+		tx.commit();
+		s.close();
+		sf.close();
+	}
+
+	public void testIgnoringHbm() throws Exception {
+		AnnotationConfiguration cfg = new AnnotationConfiguration();
+		cfg.configure( "org/hibernate/test/annotations/hibernate.cfg.xml" );
+		cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
+		cfg.setProperty( AnnotationConfiguration.ARTEFACT, "class, whatever" );
+		SessionFactory sf = cfg.buildSessionFactory();
+		assertNotNull( sf );
+		Session s = sf.openSession();
+		Transaction tx = s.beginTransaction();
+		Query q;
+		try {
+			s.createQuery( "from Boat" ).list();
+			fail( "Boat should not be mapped" );
+		}
+		catch (HibernateException e) {
+			//all good
+		}
+		q = s.createQuery( "from Plane" );
+		assertEquals( 0, q.list().size() );
+		tx.commit();
+		s.close();
+		sf.close();
+	}
+
+	public void testPrecedenceHbm() throws Exception {
+		AnnotationConfiguration cfg = new AnnotationConfiguration();
+		cfg.configure( "org/hibernate/test/annotations/hibernate.cfg.xml" );
+		cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
+		cfg.addAnnotatedClass( Boat.class );
+		SessionFactory sf = cfg.buildSessionFactory();
+		assertNotNull( sf );
+		Session s = sf.openSession();
+		s.getTransaction().begin();
+		Boat boat = new Boat();
+		boat.setSize( 12 );
+		boat.setWeight( 34 );
+		s.persist( boat );
+		s.getTransaction().commit();
+		s.clear();
+		Transaction tx = s.beginTransaction();
+		boat = (Boat) s.get( Boat.class, boat.getId() );
+		assertTrue( "Annotation has precedence", 34 != boat.getWeight() );
+		s.delete( boat );
+		//s.getTransaction().commit();
+		tx.commit();
+		s.close();
+		sf.close();
+	}
+
+	public void testPrecedenceAnnotation() throws Exception {
+		AnnotationConfiguration cfg = new AnnotationConfiguration();
+		cfg.configure( "org/hibernate/test/annotations/hibernate.cfg.xml" );
+		cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
+		cfg.setProperty( AnnotationConfiguration.ARTEFACT, "class, hbm" );
+		cfg.addAnnotatedClass( Boat.class );
+		SessionFactory sf = cfg.buildSessionFactory();
+		assertNotNull( sf );
+		Session s = sf.openSession();
+		s.getTransaction().begin();
+		Boat boat = new Boat();
+		boat.setSize( 12 );
+		boat.setWeight( 34 );
+		s.persist( boat );
+		s.getTransaction().commit();
+		s.clear();
+		Transaction tx = s.beginTransaction();
+		boat = (Boat) s.get( Boat.class, boat.getId() );
+		assertTrue( "Annotation has precedence", 34 == boat.getWeight() );
+		s.delete( boat );
+		tx.commit();
+		s.close();
+		sf.close();
+	}
+
+	public void testDeclarativeAnnWoAnnConfig() throws Exception {
+		Configuration cfg = new Configuration();
+		try {
+			cfg.configure( "org/hibernate/test/annotations/hibernate.cfg.xml" );
+			fail( "Configuration object should fail when finding annotated elements declarations" );
+		}
+		catch (MappingException e) {
+			//success
+		}
+	}
+
+	public void testHbmWithSubclassExtends() throws Exception {
+		AnnotationConfiguration cfg = new AnnotationConfiguration();
+		cfg.configure( "org/hibernate/test/annotations/hibernate.cfg.xml" );
+		cfg.addClass( Ferry.class );
+		cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
+		SessionFactory sf = cfg.buildSessionFactory();
+		assertNotNull( sf );
+		Session s = sf.openSession();
+		Transaction tx = s.beginTransaction();
+		Query q = s.createQuery( "from Ferry" );
+		assertEquals( 0, q.list().size() );
+		q = s.createQuery( "from Plane" );
+		assertEquals( 0, q.list().size() );
+		tx.commit();
+		s.close();
+		sf.close();
+	}
+
+	public void testAnnReferencesHbm() throws Exception {
+		AnnotationConfiguration cfg = new AnnotationConfiguration();
+		cfg.configure( "org/hibernate/test/annotations/hibernate.cfg.xml" );
+		cfg.addAnnotatedClass( Port.class );
+		cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
+		SessionFactory sf = cfg.buildSessionFactory();
+		assertNotNull( sf );
+		Session s = sf.openSession();
+		Transaction tx = s.beginTransaction();
+		Query q = s.createQuery( "from Boat" );
+		assertEquals( 0, q.list().size() );
+		q = s.createQuery( "from Port" );
+		assertEquals( 0, q.list().size() );
+		tx.commit();
+		s.close();
+		sf.close();
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Country.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Country.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Country.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,47 @@
+//$Id: Country.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations;
+
+/**
+ * @author Emmanuel Bernard
+ */
+
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+ at Entity()
+public class Country implements Serializable {
+	private Integer id;
+	private String name;
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setId(Integer integer) {
+		id = integer;
+	}
+
+	public void setName(String string) {
+		name = string;
+	}
+
+	public int hashCode() {
+		return name == null ? 0 : name.hashCode();
+	}
+
+	public boolean equals(Object obj) {
+		if ( obj == this ) return true;
+		if ( ! ( obj instanceof Country ) ) return false;
+		Country that = (Country) obj;
+		if ( this.name == null ) return false;
+		return this.name.equals( that.name );
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Customer.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Customer.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Customer.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,88 @@
+//$Id: Customer.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.SortedSet;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToMany;
+import javax.persistence.OneToOne;
+
+import org.hibernate.annotations.Cascade;
+import static org.hibernate.annotations.CascadeType.ALL;
+import org.hibernate.annotations.Sort;
+import org.hibernate.annotations.SortType;
+
+
+/**
+ * Company customer
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Customer implements Serializable {
+	Long id;
+	String name;
+	SortedSet<Ticket> tickets;
+	Collection discountTickets;
+	Passport passport;
+
+	public Customer() {
+	}
+
+	@Id
+	@GeneratedValue
+	public Long getId() {
+		return id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setId(Long long1) {
+		id = long1;
+	}
+
+	public void setName(String string) {
+		name = string;
+	}
+
+	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
+	@JoinColumn(name = "CUST_ID")
+	@Sort(type = SortType.COMPARATOR, comparator = TicketComparator.class)
+	public SortedSet<Ticket> getTickets() {
+		return tickets;
+	}
+
+	public void setTickets(SortedSet<Ticket> tickets) {
+		this.tickets = tickets;
+	}
+
+	@OneToMany(targetEntity = org.hibernate.test.annotations.Discount.class,
+			cascade = CascadeType.ALL, mappedBy = "owner")
+	@Cascade({ALL})
+	public Collection getDiscountTickets() {
+		return discountTickets;
+	}
+
+	public void setDiscountTickets(Collection collection) {
+		discountTickets = collection;
+	}
+
+	@OneToOne(cascade = CascadeType.ALL)
+	public Passport getPassport() {
+		return passport;
+	}
+
+	public void setPassport(Passport passport) {
+		this.passport = passport;
+	}
+
+}
+

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Discount.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Discount.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Discount.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,58 @@
+//$Id: Discount.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations;
+
+import java.io.Serializable;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+
+/**
+ * Discount ticket a client can use when buying tickets
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Discount implements Serializable {
+
+	private Long id;
+	private double discount;
+	private Customer owner;
+
+
+	@Column(precision = 5, scale = 2)
+	public double getDiscount() {
+		return discount;
+	}
+
+	@Id
+	@GeneratedValue
+	public Long getId() {
+		return id;
+	}
+
+	public void setDiscount(double i) {
+		discount = i;
+	}
+
+	public void setId(Long long1) {
+		id = long1;
+	}
+
+	@ManyToOne(cascade = {CascadeType.ALL}, fetch = FetchType.LAZY)
+	@JoinColumn(name = "CUSTOMER_ID")
+	public Customer getOwner() {
+		return owner;
+	}
+
+	public void setOwner(Customer customer) {
+		owner = customer;
+	}
+
+}
+

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/EntityTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/EntityTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/EntityTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,385 @@
+//$Id: EntityTest.java 16418 2009-04-23 09:55:33Z jcosta at redhat.com $
+package org.hibernate.test.annotations;
+
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.List;
+import java.util.TimeZone;
+
+import org.hibernate.Hibernate;
+import org.hibernate.HibernateException;
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.StaleStateException;
+import org.hibernate.Transaction;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class EntityTest extends TestCase {
+
+	public EntityTest(String x) {
+		super( x );
+	}
+
+	public void testLoad() throws Exception {
+		//put an object in DB
+		assertEquals( "Flight", getCfg().getClassMapping( Flight.class.getName() ).getTable().getName() );
+
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Flight firstOne = new Flight();
+		firstOne.setId( new Long( 1 ) );
+		firstOne.setName( "AF3202" );
+		firstOne.setDuration( new Long( 1000000 ) );
+		firstOne.setDurationInSec( 2000 );
+		s.save( firstOne );
+		s.flush();
+		tx.commit();
+		s.close();
+
+		//read it
+		s = openSession();
+		tx = s.beginTransaction();
+		firstOne = (Flight) s.get( Flight.class, new Long( 1 ) );
+		assertNotNull( firstOne );
+		assertEquals( new Long( 1 ), firstOne.getId() );
+		assertEquals( "AF3202", firstOne.getName() );
+		assertEquals( new Long( 1000000 ), firstOne.getDuration() );
+		assertFalse( "Transient is not working", 2000l == firstOne.getDurationInSec() );
+		tx.commit();
+		s.close();
+	}
+
+	public void testColumn() throws Exception {
+		//put an object in DB
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Flight firstOne = new Flight();
+		firstOne.setId( new Long( 1 ) );
+		firstOne.setName( "AF3202" );
+		firstOne.setDuration( new Long( 1000000 ) );
+		firstOne.setDurationInSec( 2000 );
+		s.save( firstOne );
+		s.flush();
+		tx.commit();
+		s.close();
+		
+
+		s = openSession();
+		tx = s.beginTransaction();
+		firstOne = new Flight();
+		firstOne.setId( new Long( 1 ) );
+		firstOne.setName( null );
+
+		try {
+			s.save( firstOne );
+			tx.commit();
+			fail( "Name column should be not null" );
+		}
+		catch (HibernateException e) {
+			//fine
+		}
+		finally {
+			s.close();
+		}
+
+		//insert an object and check that name is not updatable
+		s = openSession();
+		tx = s.beginTransaction();
+		firstOne = new Flight();
+		firstOne.setId( new Long( 1 ) );
+		firstOne.setName( "AF3202" );
+		firstOne.setTriggeredData( "should not be insertable" );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		firstOne = (Flight) s.get( Flight.class, new Long( 1 ) );
+		assertNotNull( firstOne );
+		assertEquals( new Long( 1 ), firstOne.getId() );
+		assertEquals( "AF3202", firstOne.getName() );
+		assertFalse( "should not be insertable".equals( firstOne.getTriggeredData() ) );
+		firstOne.setName( "BA1234" );
+		firstOne.setTriggeredData( "should not be updatable" );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		firstOne = (Flight) s.get( Flight.class, new Long( 1 ) );
+		assertNotNull( firstOne );
+		assertEquals( new Long( 1 ), firstOne.getId() );
+		assertEquals( "AF3202", firstOne.getName() );
+		assertFalse( "should not be updatable".equals( firstOne.getTriggeredData() ) );
+		tx.commit();
+		s.close();
+	}
+
+	public void testColumnUnique() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Sky sky = new Sky();
+		sky.id = new Long( 2 );
+		sky.color = "blue";
+		sky.day = "monday";
+		sky.month = "January";
+
+		Sky sameSky = new Sky();
+		sameSky.id = new Long( 3 );
+		sameSky.color = "blue";
+		sky.day = "tuesday";
+		sky.month = "January";
+
+		try {
+			s.save( sky );
+			s.flush();
+			s.save( sameSky );
+			tx.commit();
+			fail( "unique constraints not respected" );
+		}
+		catch (HibernateException e) {
+			//success
+		}
+		finally {
+			if ( tx != null ) tx.rollback();
+			s.close();
+		}
+	}
+
+	public void testUniqueConstraint() throws Exception {
+		int id = 5;
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Sky sky = new Sky();
+		sky.id = new Long( id++ );
+		sky.color = "green";
+		sky.day = "monday";
+		sky.month = "March";
+
+		Sky otherSky = new Sky();
+		otherSky.id = new Long( id++ );
+		otherSky.color = "red";
+		otherSky.day = "friday";
+		otherSky.month = "March";
+
+		Sky sameSky = new Sky();
+		sameSky.id = new Long( id++ );
+		sameSky.color = "green";
+		sameSky.day = "monday";
+		sameSky.month = "March";
+
+		s.save( sky );
+		s.flush();
+
+		s.save( otherSky );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		try {
+			s.save( sameSky );
+			tx.commit();
+			fail( "unique constraints not respected" );
+		}
+		catch (HibernateException e) {
+			//success
+		}
+		finally {
+			if ( tx != null ) tx.rollback();
+			s.close();
+		}
+	}
+
+	public void testVersion() throws Exception {
+//		put an object in DB
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Flight firstOne = new Flight();
+		firstOne.setId( new Long( 2 ) );
+		firstOne.setName( "AF3202" );
+		firstOne.setDuration( new Long( 500 ) );
+		s.save( firstOne );
+		s.flush();
+		tx.commit();
+		s.close();
+
+		//read it
+		s = openSession();
+		tx = s.beginTransaction();
+		firstOne = (Flight) s.get( Flight.class, new Long( 2 ) );
+		tx.commit();
+		s.close();
+
+		//read it again
+		s = openSession();
+		tx = s.beginTransaction();
+		Flight concurrentOne = (Flight) s.get( Flight.class, new Long( 2 ) );
+		concurrentOne.setDuration( new Long( 1000 ) );
+		s.update( concurrentOne );
+		tx.commit();
+		s.close();
+		assertFalse( firstOne == concurrentOne );
+		assertFalse( firstOne.getVersion().equals( concurrentOne.getVersion() ) );
+
+		//reattach the first one
+		s = openSession();
+		tx = s.beginTransaction();
+		firstOne.setName( "Second access" );
+		s.update( firstOne );
+		try {
+			tx.commit();
+			fail( "Optimistic locking should work" );
+		}
+		catch (StaleStateException e) {
+			//fine
+		}
+		finally {
+			if ( tx != null ) tx.rollback();
+			s.close();
+		}
+
+	}
+
+	public void testFieldAccess() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Sky sky = new Sky();
+		sky.id = new Long( 1 );
+		sky.color = "black";
+		Sky.area = "Paris";
+		sky.day = "23";
+		sky.month = "1";
+		s.save( sky );
+		tx.commit();
+		s.close();
+		Sky.area = "London";
+
+		s = openSession();
+		tx = s.beginTransaction();
+		sky = (Sky) s.get( Sky.class, sky.id );
+		assertNotNull( sky );
+		assertEquals( "black", sky.color );
+		assertFalse( "Paris".equals( Sky.area ) );
+		tx.commit();
+		s.close();
+	}
+
+	public void testEntityName() throws Exception {
+		assertEquals( "Corporation", getCfg().getClassMapping( Company.class.getName() ).getTable().getName() );
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Company comp = new Company();
+		s.persist( comp );
+		comp.setName( "JBoss Inc" );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		List result = s.createQuery( "from Corporation" ).list();
+		assertNotNull( result );
+		assertEquals( 1, result.size() );
+		tx.commit();
+		s.close();
+
+	}
+
+	public void testNonGetter() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Flight airFrance = new Flight();
+		airFrance.setId( new Long( 747 ) );
+		airFrance.setName( "Paris-Amsterdam" );
+		airFrance.setDuration( new Long( 10 ) );
+		airFrance.setFactor( 25 );
+		s.persist( airFrance );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		airFrance = (Flight) s.get( Flight.class, airFrance.getId() );
+		assertNotNull( airFrance );
+		assertEquals( new Long( 10 ), airFrance.getDuration() );
+		assertFalse( 25 == airFrance.getFactor( false ) );
+		s.delete( airFrance );
+		tx.commit();
+		s.close();
+	}
+
+	public void testTemporalType() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Flight airFrance = new Flight();
+		airFrance.setId( new Long( 747 ) );
+		airFrance.setName( "Paris-Amsterdam" );
+		airFrance.setDuration( new Long( 10 ) );
+		airFrance.setDepartureDate( new Date( 05, 06, 21, 10, 0, 0 ) );
+		airFrance.setAlternativeDepartureDate( new GregorianCalendar( 2006, 02, 03, 10, 00 ) );
+		airFrance.getAlternativeDepartureDate().setTimeZone( TimeZone.getTimeZone( "GMT" ) );
+		airFrance.setBuyDate( new java.sql.Timestamp(122367443) );
+		airFrance.setFactor( 25 );
+		s.persist( airFrance );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		Query q = s.createQuery( "from Flight f where f.departureDate = :departureDate" );
+		q.setParameter( "departureDate", airFrance.getDepartureDate(), Hibernate.DATE );
+		Flight copyAirFrance = (Flight) q.uniqueResult();
+		assertNotNull( copyAirFrance );
+		assertEquals(
+				new Date( 05, 06, 21 ),
+				copyAirFrance.getDepartureDate()
+		);
+		assertEquals( copyAirFrance.getBuyDate().getTime() / 1000 , airFrance.getBuyDate().getTime() / 1000 );
+
+		s.delete( copyAirFrance );
+		tx.commit();
+		s.close();
+	}
+
+	public void testBasic() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Flight airFrance = new Flight();
+		airFrance.setId( new Long( 747 ) );
+		airFrance.setName( "Paris-Amsterdam" );
+		airFrance.setDuration( null );
+		try {
+			s.persist( airFrance );
+			tx.commit();
+			fail( "Basic(optional=false) fails" );
+		}
+		catch (Exception e) {
+			//success
+			if ( tx != null ) tx.rollback();
+		}
+		finally {
+			s.close();
+		}
+	}
+
+	/**
+	 * @see org.hibernate.test.annotations.TestCase#getMappings()
+	 */
+	protected Class[] getMappings() {
+		return new Class[]{
+				Flight.class,
+				Company.class,
+				Sky.class
+		};
+	}
+
+}
+

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Ferry.hbm.xml
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Ferry.hbm.xml	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Ferry.hbm.xml	2009-11-24 21:03:15 UTC (rev 18049)
@@ -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">
+
+<!--
+
+  Used to test the interaction of hbm files with a subclass
+  extends attribute and annotated classes.
+
+  See ConfigurationTest
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.annotations">
+
+    <joined-subclass name="Ferry" table="FerryJoined" extends="org.hibernate.test.annotations.Boat">
+        <key column="id"/>
+        <property name="sea"/>
+
+    </joined-subclass>
+
+</hibernate-mapping>
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Ferry.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Ferry.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Ferry.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,22 @@
+//$Id: Ferry.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations;
+
+import javax.persistence.Entity;
+
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity()
+public class Ferry extends Boat {
+	private String sea;
+
+	public String getSea() {
+		return sea;
+	}
+
+	public void setSea(String string) {
+		sea = string;
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Flight.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Flight.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Flight.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,149 @@
+//$Id: Flight.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations;
+
+import java.io.Serializable;
+import java.util.Calendar;
+import java.util.Date;
+import javax.persistence.Basic;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+import javax.persistence.Transient;
+import javax.persistence.Version;
+
+/**
+ * Flight
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity()
+ at Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+public class Flight implements Serializable {
+	Long id;
+	String name;
+	transient Long duration;
+	long durationInSec;
+	Integer version;
+	Company company;
+	String triggeredData;
+	long factor;
+	Date departureDate;
+	java.sql.Timestamp buyDate;
+	Calendar alternativeDepartureDate;
+
+	@Id
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long long1) {
+		id = long1;
+	}
+
+	@Column(name = "flight_name", nullable = false, updatable = false, length = 50)
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String string) {
+		name = string;
+	}
+
+	@Basic(fetch = FetchType.LAZY, optional = false)
+	public Long getDuration() {
+		return duration;
+	}
+
+	@Basic
+	@Temporal(TemporalType.DATE)
+	public Date getDepartureDate() {
+		return departureDate;
+	}
+
+	public void setDepartureDate(Date departureDate) {
+		this.departureDate = departureDate;
+	}
+
+
+	public void setDuration(Long l) {
+		duration = l;
+		//durationInSec = duration / 1000;
+	}
+
+	@Transient
+	public long getDurationInSec() {
+		return durationInSec;
+	}
+
+	public void setDurationInSec(long l) {
+		durationInSec = l;
+	}
+
+	@Version
+	@Column(name = "OPTLOCK")
+	public Integer getVersion() {
+		return version;
+	}
+
+	public void setVersion(Integer i) {
+		version = i;
+	}
+
+	@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
+	@JoinColumn(name = "COMP_ID")
+	public Company getCompany() {
+		return company;
+	}
+
+	public void setCompany(Company company) {
+		this.company = company;
+	}
+
+	@Column(insertable = false, updatable = false)
+	public String getTriggeredData() {
+		return triggeredData;
+	}
+
+	public void setTriggeredData(String string) {
+		triggeredData = string;
+	}
+
+	public void getIsNotAGetter() {
+		//do nothing
+	}
+
+	public long getFactor(boolean x10) {
+		//this is not a getter should not be persisted
+		return factor * ( 1 + ( x10 == true ? 9 : 0 ) );
+	}
+
+	public void setFactor(long factor) {
+		this.factor = factor;
+	}
+
+	@Temporal(TemporalType.TIMESTAMP)
+	public Calendar getAlternativeDepartureDate() {
+		return alternativeDepartureDate;
+	}
+
+	public void setAlternativeDepartureDate(Calendar alternativeDepartureDate) {
+		this.alternativeDepartureDate = alternativeDepartureDate;
+	}
+
+	public java.sql.Timestamp getBuyDate() {
+		return buyDate;
+	}
+
+	public void setBuyDate(java.sql.Timestamp buyDate) {
+		this.buyDate = buyDate;
+	}
+
+}
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/FlyingObject.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/FlyingObject.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/FlyingObject.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,54 @@
+//$Id: FlyingObject.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.MappedSuperclass;
+import javax.persistence.Transient;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MappedSuperclass
+public abstract class FlyingObject extends Thing implements Serializable {
+	private String serial;
+	private int altitude;
+	private int metricAltitude;
+	private String color = "white";
+
+
+	public int getAltitude() {
+		return altitude;
+	}
+
+	public void setAltitude(int i) {
+		altitude = i;
+	}
+
+	@Transient
+	public int getMetricAltitude() {
+		return metricAltitude;
+	}
+
+	public void setMetricAltitude(int i) {
+		metricAltitude = i;
+	}
+
+	@Column(name = "serialnbr")
+	public String getSerial() {
+		return serial;
+	}
+
+	public void setSerial(String serial) {
+		this.serial = serial;
+	}
+
+	@Column(nullable = false)
+	public String getColor() {
+		return color;
+	}
+
+	public void setColor(String color) {
+		this.color = color;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/IncorrectEntity.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/IncorrectEntity.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/IncorrectEntity.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,20 @@
+//$Id: IncorrectEntity.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class IncorrectEntity {
+	private String name;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/JoinedSubclassTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/JoinedSubclassTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/JoinedSubclassTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,110 @@
+//$Id: JoinedSubclassTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.inheritance.Carrot;
+import org.hibernate.test.annotations.inheritance.Tomato;
+import org.hibernate.test.annotations.inheritance.Vegetable;
+import org.hibernate.test.annotations.inheritance.VegetablePk;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class JoinedSubclassTest extends TestCase {
+
+	public JoinedSubclassTest(String x) {
+		super( x );
+	}
+
+	public void testDefaultValues() {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Ferry f = new Ferry();
+		f.setSize( 2 );
+		f.setSea( "Channel" );
+		s.persist( f );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		f = (Ferry) s.get( Ferry.class, f.getId() );
+		assertNotNull( f );
+		assertEquals( "Channel", f.getSea() );
+		assertEquals( 2, f.getSize() );
+		s.delete( f );
+		tx.commit();
+		s.close();
+	}
+
+	public void testDeclaredValues() {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Country c = new Country();
+		c.setName( "France" );
+		AmericaCupClass f = new AmericaCupClass();
+		f.setSize( 2 );
+		f.setCountry( c );
+		s.persist( c );
+		s.persist( f );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		f = (AmericaCupClass) s.get( AmericaCupClass.class, f.getId() );
+		assertNotNull( f );
+		assertEquals( c, f.getCountry() );
+		assertEquals( 2, f.getSize() );
+		s.delete( f );
+		s.delete( f.getCountry() );
+		tx.commit();
+		s.close();
+	}
+
+	public void testCompositePk() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Carrot c = new Carrot();
+		VegetablePk pk = new VegetablePk();
+		pk.setFarmer( "Bill" );
+		pk.setHarvestDate( "2004-08-15" );
+		c.setId( pk );
+		c.setLength( 23 );
+		s.persist( c );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		Vegetable v = (Vegetable) s.createCriteria( Vegetable.class ).uniqueResult();
+		assertTrue( v instanceof Carrot );
+		Carrot result = (Carrot) v;
+		assertEquals( 23, result.getLength() );
+		tx.commit();
+		s.close();
+	}
+
+	/**
+	 * @see org.hibernate.test.annotations.TestCase#getMappings()
+	 */
+	protected Class[] getMappings() {
+		return new Class[]{
+				Boat.class,
+				Ferry.class,
+				AmericaCupClass.class,
+				Country.class,
+				Vegetable.class,
+				Carrot.class,
+				Tomato.class
+		};
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Passport.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Passport.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Passport.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,49 @@
+//$Id: Passport.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToOne;
+
+/**
+ * International passport
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Passport implements Serializable {
+
+	private Long id;
+	private String number;
+	private Customer owner;
+
+	@Id
+	public Long getId() {
+		return id;
+	}
+
+	@Column(name = "passport_number")
+	public String getNumber() {
+		return number;
+	}
+
+	@OneToOne(mappedBy = "passport")
+	public Customer getOwner() {
+		return owner;
+	}
+
+	public void setId(Long long1) {
+		id = long1;
+	}
+
+	public void setNumber(String string) {
+		number = string;
+	}
+
+	public void setOwner(Customer customer) {
+		owner = customer;
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Plane.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Plane.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Plane.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,58 @@
+//$Id: Plane.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations;
+
+import javax.persistence.AttributeOverride;
+import javax.persistence.Column;
+import javax.persistence.DiscriminatorColumn;
+import javax.persistence.DiscriminatorType;
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.NamedQuery;
+import javax.persistence.QueryHint;
+
+/**
+ * Plane class
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity()
+ at Inheritance(strategy = InheritanceType.SINGLE_TABLE)
+ at DiscriminatorColumn(name = "planetype", length = 100, discriminatorType = DiscriminatorType.STRING)
+ at DiscriminatorValue("Plane")
+ at AttributeOverride(name = "altitude", column = @Column(name = "fld_altitude"))
+ at NamedQuery(name = "plane.byId", query = "from Plane where id = :id",
+		hints = {@QueryHint(name = "org.hibernate.cacheable", value = "true"),
+		@QueryHint(name = "org.hibernate.cacheRegion", value = "testedCacheRegion"),
+		@QueryHint(name = "org.hibernate.timeout", value = "100"),
+		@QueryHint(name = "org.hibernate.fetchSize", value = "1"),
+		@QueryHint(name = "org.hibernate.flushMode", value = "Commit"),
+		@QueryHint(name = "org.hibernate.cacheMode", value = "NORMAL"),
+		@QueryHint(name = "org.hibernate.comment", value = "Plane by id")})
+public class Plane extends FlyingObject {
+
+	private Long id;
+	private int nbrofSeats;
+
+	@Id
+	@GeneratedValue
+	public Long getId() {
+		return id;
+	}
+
+	public int getNbrOfSeats() {
+		return nbrofSeats;
+	}
+
+	public void setId(Long long1) {
+		id = long1;
+	}
+
+	public void setNbrOfSeats(int i) {
+		nbrofSeats = i;
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Port.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Port.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Port.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,37 @@
+//$Id: Port.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations;
+
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+/**
+ * Used to test that annotated classes can have one-to-many
+ * relationships with hbm loaded classes.
+ */
+ at Entity()
+public class Port {
+	private Long id;
+	private Set<Boat> boats;
+
+	@Id
+	@GeneratedValue
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long long1) {
+		id = long1;
+	}
+
+	@OneToMany
+	public Set<Boat> getBoats() {
+		return boats;
+	}
+
+	public void setBoats(Set<Boat> boats) {
+		this.boats = boats;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/RequiresDialect.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/RequiresDialect.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/RequiresDialect.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,20 @@
+// $Id: RequiresDialect.java 15025 2008-08-11 09:14:39Z hardy.ferentschik $
+package org.hibernate.test.annotations;
+
+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;
+
+/**
+ * Annotations used to mark a test to be specific to a given dialect.
+ * 
+ * @author Hardy Ferentschik
+ */
+ at Target({ElementType.METHOD, ElementType.TYPE})
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface RequiresDialect {
+	Class<? extends Dialect>[] value();
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/SafeMappingTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/SafeMappingTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/SafeMappingTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,25 @@
+//$Id: SafeMappingTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations;
+
+import org.hibernate.AnnotationException;
+import org.hibernate.SessionFactory;
+import org.hibernate.cfg.AnnotationConfiguration;
+import org.hibernate.cfg.Environment;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class SafeMappingTest extends junit.framework.TestCase {
+	public void testDeclarativeMix() throws Exception {
+		AnnotationConfiguration cfg = new AnnotationConfiguration();
+		cfg.addAnnotatedClass( IncorrectEntity.class );
+		cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
+		try {
+			SessionFactory sf = cfg.buildSessionFactory();
+			fail( "Entity wo id should fail" );
+		}
+		catch (AnnotationException e) {
+			//success
+		}
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/SecuredBindingTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/SecuredBindingTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/SecuredBindingTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,44 @@
+//$Id: SecuredBindingTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations;
+
+import java.util.Properties;
+
+import junit.framework.TestCase;
+import org.hibernate.HibernateException;
+import org.hibernate.SessionFactory;
+import org.hibernate.cfg.AnnotationConfiguration;
+import org.hibernate.cfg.Environment;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class SecuredBindingTest extends TestCase {
+
+	public SecuredBindingTest(String x) {
+		super( x );
+	}
+
+	public void testConfigurationMethods() throws Exception {
+		AnnotationConfiguration ac = new AnnotationConfiguration();
+		Properties p = new Properties();
+		p.put( Environment.DIALECT, "org.hibernate.dialect.HSQLDialect" );
+		p.put( "hibernate.connection.driver_class", "org.hsqldb.jdbcDrive" );
+		p.put( "hibernate.connection.url", "jdbc:hsqldb:." );
+		p.put( "hibernate.connection.username", "sa" );
+		p.put( "hibernate.connection.password", "" );
+		p.put( "hibernate.show_sql", "true" );
+		ac.setProperties( p );
+		ac.addAnnotatedClass( Plane.class );
+		SessionFactory sf;
+		try {
+			sf = ac.buildSessionFactory();
+			fail( "Driver property overriding should work" );
+			sf.close();
+		}
+		catch (HibernateException he) {
+			//success
+		}
+
+	}
+}
+

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Sky.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Sky.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Sky.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,28 @@
+//$Id: Sky.java 16418 2009-04-23 09:55:33Z jcosta at redhat.com $
+package org.hibernate.test.annotations;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.UniqueConstraint;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "tbl_sky",
+		uniqueConstraints = {@UniqueConstraint(columnNames = {"month", "day"})}
+)
+public class Sky implements Serializable {
+	@Id
+	protected Long id;
+	@Column(unique = true, columnDefinition = "varchar(250)", nullable = false)
+	protected String color;
+	@Column(nullable = false)
+	protected String day;
+	@Column(name = "MONTH", nullable = false)
+	protected String month;
+	static protected String area;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/TestCase.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/TestCase.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/TestCase.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,292 @@
+//$Id: TestCase.java 17724 2009-10-13 15:47:59Z stliu $
+package org.hibernate.test.annotations;
+
+import java.io.InputStream;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.hibernate.HibernateException;
+import org.hibernate.Interceptor;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.cfg.AnnotationConfiguration;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.jdbc.Work;
+import org.hibernate.tool.hbm2ddl.SchemaExport;
+
+/**
+ * A base class for all tests.
+ *
+ * @author Emmnauel Bernand
+ * @author Hardy Ferentschik
+ */
+public abstract class TestCase extends junit.framework.TestCase {
+
+	public static final Logger log = LoggerFactory.getLogger( TestCase.class );
+
+	private static SessionFactory sessions;
+	private static AnnotationConfiguration cfg;
+	private static Class<?> lastTestClass;
+	private Session session;
+
+	/**
+	 * The test method.
+	 */
+	private Method runMethod = null;
+
+	/**
+	 * Flag indicating whether the test should be run or skipped.
+	 */
+	private boolean runTest = true;
+
+	/**
+	 * List of required dialect for the current {@code runMethod}. If the list is empty any dialect is allowed.
+	 * Otherwise the current dialect or a superclass of the current dialect must be in the list.
+	 */
+	private final Set<Class<? extends Dialect>> requiredDialectList = new HashSet<Class<? extends Dialect>>();
+
+	public TestCase() {
+		super();
+	}
+
+	public TestCase(String x) {
+		super( x );
+	}
+
+	protected void buildSessionFactory(Class<?>[] classes, String[] packages, String[] xmlFiles) throws Exception {
+
+		if ( getSessions() != null ) {
+			getSessions().close();
+		}
+		try {
+			setCfg( new AnnotationConfiguration() );
+			configure( cfg );
+			if ( recreateSchema() ) {
+				cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
+			}
+			for ( String aPackage : packages ) {
+				getCfg().addPackage( aPackage );
+			}
+			for ( Class<?> aClass : classes ) {
+				getCfg().addAnnotatedClass( aClass );
+			}
+			for ( String xmlFile : xmlFiles ) {
+				InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream( xmlFile );
+				getCfg().addInputStream( is );
+			}
+			setSessions( getCfg().buildSessionFactory( /* new TestInterceptor() */ ) );
+		}
+		catch ( Exception e ) {
+			e.printStackTrace();
+			throw e;
+		}
+	}
+
+	protected void setUp() throws Exception {
+		runMethod = findTestMethod();
+		setRunTestFlag( runMethod );
+		if ( runTest ) {
+			if ( getSessions() == null || lastTestClass != getClass() ) {
+				buildSessionFactory( getMappings(), getAnnotatedPackages(), getXmlFiles() );
+				lastTestClass = getClass();
+			}
+			else {
+				runSchemaGeneration();
+			}
+		}
+	}
+
+	protected void runTest() throws Throwable {
+		try {
+			if ( runTest ) {
+				runTestMethod( runMethod );
+				handleUnclosedSession();
+			}
+		}
+		catch ( Throwable e ) {
+			closeSession( e );
+		}
+	}
+
+	private void setRunTestFlag(Method runMethod) {
+		updateRequiredDialectList( runMethod );
+
+		if ( runForCurrentDialect() ) {
+			runTest = true;
+		}
+		else {
+			log.warn(
+					"Skipping test {}, because test does not apply for dialect {}", runMethod.getName(), Dialect
+							.getDialect().getClass()
+			);
+			runTest = false;
+		}
+	}
+
+	private void updateRequiredDialectList(Method runMethod) {
+		requiredDialectList.clear();
+
+		RequiresDialect requiresDialectMethodAnn = runMethod.getAnnotation( RequiresDialect.class );
+		if ( requiresDialectMethodAnn != null ) {
+			Class<? extends Dialect>[] requiredDialects = requiresDialectMethodAnn.value();
+			requiredDialectList.addAll( Arrays.asList( requiredDialects ) );
+		}
+
+		RequiresDialect requiresDialectClassAnn = getClass().getAnnotation( RequiresDialect.class );
+		if ( requiresDialectClassAnn != null ) {
+			Class<? extends Dialect>[] requiredDialects = requiresDialectClassAnn.value();
+			requiredDialectList.addAll( Arrays.asList( requiredDialects ) );
+		}
+	}
+
+	protected boolean runForCurrentDialect() {
+		if ( requiredDialectList.isEmpty() ) {
+			return true;
+		}
+		else {
+			// check whether the current dialect is assignableFrom from any of the specified required dialects.
+			for ( Class<? extends Dialect> dialect : requiredDialectList ) {
+				if ( dialect.isAssignableFrom( Dialect.getDialect().getClass() ) ) {
+					return true;
+				}
+			}
+			return false;
+		}
+	}
+
+	private void runTestMethod(Method runMethod) throws Throwable {
+		try {
+			runMethod.invoke( this, new Class[0] );
+		}
+		catch ( InvocationTargetException e ) {
+			e.fillInStackTrace();
+			throw e.getTargetException();
+		}
+		catch ( IllegalAccessException e ) {
+			e.fillInStackTrace();
+			throw e;
+		}
+	}
+
+	private Method findTestMethod() {
+		String fName = getName();
+		assertNotNull( fName );
+		Method runMethod = null;
+		try {
+			runMethod = getClass().getMethod( fName, null );
+		}
+		catch ( NoSuchMethodException e ) {
+			fail( "Method \"" + fName + "\" not found" );
+		}
+		if ( !Modifier.isPublic( runMethod.getModifiers() ) ) {
+			fail( "Method \"" + fName + "\" should be public" );
+		}
+		return runMethod;
+	}
+
+	private void handleUnclosedSession() {
+		if ( session != null && session.isOpen() ) {
+			if ( session.isConnected() ) {
+				session.doWork( new RollbackWork() );
+			}
+			session.close();
+			session = null;
+			fail( "unclosed session" );
+		}
+		else {
+			session = null;
+		}
+	}
+
+	private void closeSession(Throwable e) throws Throwable {
+		try {
+			if ( session != null && session.isOpen() ) {
+				if ( session.isConnected() ) {
+					session.doWork( new RollbackWork() );
+				}
+				session.close();
+			}
+		}
+		catch ( Exception ignore ) {
+		}
+		try {
+			if ( sessions != null ) {
+				sessions.close();
+				sessions = null;
+			}
+		}
+		catch ( Exception ignore ) {
+		}
+		throw e;
+	}
+
+	public Session openSession() throws HibernateException {
+		session = getSessions().openSession();
+		return session;
+	}
+
+	public Session openSession(Interceptor interceptor) throws HibernateException {
+		session = getSessions().openSession( interceptor );
+		return session;
+	}
+
+	protected abstract Class<?>[] getMappings();
+
+	protected String[] getAnnotatedPackages() {
+		return new String[] { };
+	}
+
+	protected String[] getXmlFiles() {
+		return new String[] { };
+	}
+
+	private void setSessions(SessionFactory sessions) {
+		TestCase.sessions = sessions;
+	}
+
+	protected SessionFactory getSessions() {
+		return sessions;
+	}
+
+	protected Dialect getDialect() {
+		return Dialect.getDialect();
+	}
+
+	protected static void setCfg(AnnotationConfiguration cfg) {
+		TestCase.cfg = cfg;
+	}
+
+	protected static AnnotationConfiguration 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 );
+	}
+
+	public class RollbackWork implements Work {
+
+		public void execute(Connection connection) throws SQLException {
+			connection.rollback();
+		}
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Thing.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Thing.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Thing.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,21 @@
+//$Id: Thing.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations;
+
+import javax.persistence.MappedSuperclass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MappedSuperclass
+public class Thing {
+	private boolean isAlive;
+
+	public boolean isAlive() {
+		return isAlive;
+	}
+
+	public void setAlive(boolean alive) {
+		isAlive = alive;
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Ticket.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Ticket.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/Ticket.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,58 @@
+//$Id: Ticket.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * Flight ticket
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Ticket implements Serializable {
+	Long id;
+	String number;
+
+	public Ticket() {
+	}
+
+	@Id
+	@GeneratedValue
+	public Long getId() {
+		return id;
+	}
+
+	@Column(name = "ticket_number")
+	public String getNumber() {
+		return number;
+	}
+
+	public void setId(Long long1) {
+		id = long1;
+	}
+
+	public void setNumber(String string) {
+		number = string;
+	}
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( !( o instanceof Ticket ) ) return false;
+
+		final Ticket ticket = (Ticket) o;
+
+		if ( !number.equals( ticket.number ) ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		return number.hashCode();
+	}
+
+}
+

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/TicketComparator.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/TicketComparator.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/TicketComparator.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,20 @@
+//$Id: TicketComparator.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations;
+
+import java.util.Comparator;
+
+/**
+ * Ticket comparator ordering longest first
+ *
+ * @author Emmanuel Bernard
+ */
+public class TicketComparator implements Comparator<Ticket> {
+
+	public int compare(Ticket ticket, Ticket ticket1) {
+		if ( ticket == null || ticket1 == null ) {
+			throw new IllegalStateException( "Ticket comparison only available through non null tickets" );
+		}
+		return ticket1.getNumber().length() - ticket.getNumber().length();
+
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/access/AccessTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/access/AccessTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/access/AccessTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,128 @@
+//$Id: AccessTest.java 15025 2008-08-11 09:14:39Z hardy.ferentschik $
+package org.hibernate.test.annotations.access;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class AccessTest extends TestCase {
+	
+	public void testSuperclassOverriding() throws Exception {
+		Furniture fur = new Furniture();
+		fur.setColor( "Black" );
+		fur.setName( "Beech" );
+		fur.isAlive = true;
+		Session s = openSession();
+		s.persist( fur );
+		Transaction tx = s.beginTransaction();
+		tx.commit();
+		s.clear();
+		tx = s.beginTransaction();
+		fur = (Furniture) s.get( Furniture.class, fur.getId() );
+		assertFalse( fur.isAlive );
+		assertNotNull( fur.getColor() );
+		s.delete( fur );
+		tx.commit();
+		s.close();
+	}
+
+	public void testSuperclassNonOverriding() throws Exception {
+		Furniture fur = new Furniture();
+		fur.setGod( "Buddha" );
+		Session s = openSession();
+		s.persist( fur );
+		Transaction tx = s.beginTransaction();
+		tx.commit();
+		s.clear();
+		tx = s.beginTransaction();
+		fur = (Furniture) s.get( Furniture.class, fur.getId() );
+		assertNotNull( fur.getGod() );
+		s.delete( fur );
+		tx.commit();
+		s.close();
+	}
+
+	public void testPropertyOverriding() throws Exception {
+		Furniture fur = new Furniture();
+		fur.weight = 3;
+		Session s = openSession();
+		s.persist( fur );
+		Transaction tx = s.beginTransaction();
+		tx.commit();
+		s.clear();
+		tx = s.beginTransaction();
+		fur = (Furniture) s.get( Furniture.class, fur.getId() );
+		assertEquals( 5, fur.weight );
+		s.delete( fur );
+		tx.commit();
+		s.close();
+
+	}
+
+	public void testNonOverridenSubclass() throws Exception {
+		Chair chair = new Chair();
+		chair.setPillow( "Blue" );
+		Session s = openSession();
+		s.persist( chair );
+		Transaction tx = s.beginTransaction();
+		tx.commit();
+		s.clear();
+		tx = s.beginTransaction();
+		chair = (Chair) s.get( Chair.class, chair.getId() );
+		assertNull( chair.getPillow() );
+		s.delete( chair );
+		tx.commit();
+		s.close();
+
+	}
+
+	public void testOverridenSubclass() throws Exception {
+		BigBed bed = new BigBed();
+		bed.size = 5;
+		bed.setQuality( "good" );
+		Session s = openSession();
+		s.persist( bed );
+		Transaction tx = s.beginTransaction();
+		tx.commit();
+		s.clear();
+		tx = s.beginTransaction();
+		bed = (BigBed) s.get( BigBed.class, bed.getId() );
+		assertEquals( 5, bed.size );
+		assertNull( bed.getQuality() );
+		s.delete( bed );
+		tx.commit();
+		s.close();
+
+	}
+
+	public void testFieldsOverriding() throws Exception {
+		Gardenshed gs = new Gardenshed();
+		gs.floors = 4;
+		Session s = openSession();
+		s.persist( gs );
+		Transaction tx = s.beginTransaction();
+		tx.commit();
+		s.clear();
+		tx = s.beginTransaction();
+		gs = (Gardenshed) s.get( Gardenshed.class, gs.getId() );
+		assertEquals( 4, gs.floors );
+		assertEquals( 6, gs.getFloors() );
+		s.delete( gs );
+		tx.commit();
+		s.close();
+
+	}
+
+	protected Class[] getMappings() {
+		return new Class[]{
+				Bed.class,
+				Chair.class,
+				Furniture.class,
+				BigBed.class,
+				Gardenshed.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/access/Bed.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/access/Bed.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/access/Bed.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,25 @@
+//$Id: Bed.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.access;
+
+import javax.persistence.Entity;
+import javax.persistence.Transient;
+
+import org.hibernate.annotations.AccessType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at AccessType("property")
+public class Bed extends Furniture {
+	String quality;
+
+	@Transient
+	public String getQuality() {
+		return quality;
+	}
+
+	public void setQuality(String quality) {
+		this.quality = quality;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/access/BigBed.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/access/BigBed.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/access/BigBed.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,14 @@
+//$Id: BigBed.java 15073 2008-08-14 17:32:44Z epbernard $
+package org.hibernate.test.annotations.access;
+
+import javax.persistence.Entity;
+import javax.persistence.Column;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class BigBed extends Bed {
+	@Column(name="bed_size")
+	public int size;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/access/Chair.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/access/Chair.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/access/Chair.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,23 @@
+//$Id: Chair.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.access;
+
+import javax.persistence.Entity;
+import javax.persistence.Transient;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Chair extends Furniture {
+
+	@Transient
+	private String pillow;
+
+	public String getPillow() {
+		return pillow;
+	}
+
+	public void setPillow(String pillow) {
+		this.pillow = pillow;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/access/Furniture.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/access/Furniture.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/access/Furniture.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,51 @@
+//$Id: Furniture.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.access;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Transient;
+
+import org.hibernate.annotations.AccessType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at AccessType("field")
+public class Furniture extends Woody {
+	@Id
+	@GeneratedValue
+	private Integer id;
+
+	private String brand;
+
+	@Transient
+	public String getBrand() {
+		return brand;
+	}
+
+	public void setBrand(String brand) {
+		this.brand = brand;
+	}
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+
+	@AccessType("property")
+	public long weight;
+
+	public long getWeight() {
+		return weight + 1;
+	}
+
+	public void setWeight(long weight) {
+		this.weight = weight + 1;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/access/Gardenshed.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/access/Gardenshed.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/access/Gardenshed.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,55 @@
+//$Id: Gardenshed.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.access;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Transient;
+
+import org.hibernate.annotations.AccessType;
+
+/**
+ * This is the opposite of the Furniture test, as this tries to override the class AccessType("property") with
+ * the property AccessType("field").
+ *
+ * @author Dennis Fleurbaaij
+ * @since 2007-05-31
+ */
+ at Entity
+ at AccessType( "property" )
+public class Gardenshed
+		extends
+		Woody {
+	private Integer id;
+	private String brand;
+	public long floors;
+
+	@Transient
+	public String getBrand() {
+		return brand;
+	}
+
+	public void setBrand(String brand) {
+		this.brand = brand;
+	}
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	// These 2 functions should not return in Hibernate, but the value should come from the field "floors"
+	@AccessType( "field" )
+	public long getFloors() {
+		return this.floors + 2;
+	}
+
+	public void setFloors(long floors) {
+		this.floors = floors + 2;
+	}
+}
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/access/Thingy.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/access/Thingy.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/access/Thingy.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,22 @@
+//$Id: Thingy.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.access;
+
+import javax.persistence.MappedSuperclass;
+import javax.persistence.Transient;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MappedSuperclass
+public class Thingy {
+	private String god;
+
+	@Transient
+	public String getGod() {
+		return god;
+	}
+
+	public void setGod(String god) {
+		this.god = god;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/access/Woody.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/access/Woody.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/access/Woody.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,33 @@
+//$Id: Woody.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.access;
+
+import javax.persistence.MappedSuperclass;
+
+import org.hibernate.annotations.AccessType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MappedSuperclass
+ at AccessType("property")
+public class Woody extends Thingy {
+	private String color;
+	private String name;
+	public boolean isAlive; //shouldn't be persistent
+
+	public String getColor() {
+		return color;
+	}
+
+	public void setColor(String color) {
+		this.color = color;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/AnyTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/AnyTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/AnyTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,158 @@
+package org.hibernate.test.annotations.any;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+public class AnyTest extends TestCase {
+
+	public void testDefaultAnyAssociation() {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		PropertySet set1 = new PropertySet( "string" );
+		Property property = new StringProperty( "name", "Alex" );
+		set1.setSomeProperty( property );
+		set1.addGeneratedProperty( property );
+		s.save( set1 );
+
+		PropertySet set2 = new PropertySet( "integer" );
+		property = new IntegerProperty( "age", 33 );
+		set2.setSomeProperty( property );
+		set2.addGeneratedProperty( property );
+		s.save( set2 );
+
+		s.flush();
+		s.clear();
+
+		Query q = s
+				.createQuery( "select s from PropertySet s where name = :name" );
+		q.setString( "name", "string" );
+		PropertySet result = (PropertySet) q.uniqueResult();
+
+		assertNotNull( result );
+		assertNotNull( result.getSomeProperty() );
+		assertTrue( result.getSomeProperty() instanceof StringProperty );
+		assertEquals( "Alex", result.getSomeProperty().asString() );
+		assertNotNull( result.getGeneralProperties() );
+		assertEquals( 1, result.getGeneralProperties().size() );
+		assertEquals( "Alex", result.getGeneralProperties().get( 0 ).asString() );
+
+		q.setString( "name", "integer" );
+		result = (PropertySet) q.uniqueResult();
+		assertNotNull( result );
+		assertNotNull( result.getSomeProperty() );
+		assertTrue( result.getSomeProperty() instanceof IntegerProperty );
+		assertEquals( "33", result.getSomeProperty().asString() );
+		assertNotNull( result.getGeneralProperties() );
+		assertEquals( 1, result.getGeneralProperties().size() );
+		assertEquals( "33", result.getGeneralProperties().get( 0 ).asString() );
+
+		t.rollback();
+		s.close();
+	}
+
+	public void testManyToAnyWithMap() throws Exception {
+
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		PropertyMap map = new PropertyMap( "sample" );
+		map.getProperties().put( "name", new StringProperty( "name", "Alex" ) );
+		map.getProperties().put( "age", new IntegerProperty( "age", 33 ) );
+
+		s.save( map );
+
+		s.flush();
+		s.clear();
+
+		Query q = s
+				.createQuery( "SELECT map FROM PropertyMap map WHERE map.name = :name" );
+		q.setString( "name", "sample" );
+		PropertyMap actualMap = (PropertyMap) q.uniqueResult();
+
+		assertNotNull( actualMap );
+		assertNotNull( actualMap.getProperties() );
+
+		Property property = actualMap.getProperties().get( "name" );
+		assertNotNull( property );
+		assertTrue( property instanceof StringProperty );
+		assertEquals( "Alex", property.asString() );
+
+		property = actualMap.getProperties().get( "age" );
+		assertNotNull( property );
+		assertTrue( property instanceof IntegerProperty );
+		assertEquals( "33", property.asString() );
+
+		t.rollback();
+		s.close();
+
+	}
+
+	public void testMetaDataUseWithManyToAny() throws Exception {
+		Session s = openSession();
+		Transaction t = s.beginTransaction();
+
+		PropertyList list = new PropertyList( "sample" );
+		StringProperty stringProperty = new StringProperty( "name", "Alex" );
+		IntegerProperty integerProperty = new IntegerProperty( "age", 33 );
+		LongProperty longProperty = new LongProperty( "distance", 121L );
+		CharProperty charProp = new CharProperty( "Est", 'E' );
+
+		list.setSomeProperty( longProperty );
+
+		list.addGeneratedProperty( stringProperty );
+		list.addGeneratedProperty( integerProperty );
+		list.addGeneratedProperty( longProperty );
+		list.addGeneratedProperty( charProp );
+
+		s.save( list );
+
+		s.flush();
+		s.clear();
+
+		Query q = s
+				.createQuery( "SELECT list FROM PropertyList list WHERE list.name = :name" );
+		q.setString( "name", "sample" );
+		PropertyList<Property> actualList = (PropertyList<Property>) q
+				.uniqueResult();
+
+		assertNotNull( actualList );
+		assertNotNull( actualList.getGeneralProperties() );
+		assertEquals( 4, actualList.getGeneralProperties().size() );
+
+		Property property = actualList.getSomeProperty();
+		assertNotNull( property );
+		assertTrue( property instanceof LongProperty );
+		assertEquals( "121", property.asString() );
+
+		assertEquals( "Alex", actualList.getGeneralProperties().get( 0 )
+				.asString() );
+		assertEquals( "33", actualList.getGeneralProperties().get( 1 ).asString() );
+		assertEquals( "121", actualList.getGeneralProperties().get( 2 ).asString() );
+		assertEquals( "E", actualList.getGeneralProperties().get( 3 ).asString() );
+
+		t.rollback();
+		s.close();
+	}
+
+	@Override
+	protected Class[] getMappings() {
+		return new Class[] {
+				StringProperty.class,
+				IntegerProperty.class,
+				LongProperty.class,
+				PropertySet.class,
+				PropertyMap.class,
+				PropertyList.class,
+				CharProperty.class
+		};
+	}
+
+	protected String[] getAnnotatedPackages() {
+		return new String[] {
+				"org.hibernate.test.annotations.any"
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/CharProperty.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/CharProperty.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/CharProperty.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,57 @@
+package org.hibernate.test.annotations.any;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+ at Entity
+ at Table( name = "char_property" )
+public class CharProperty implements Property {
+	private Integer id;
+
+	private String name;
+
+	private Character value;
+
+	public CharProperty() {
+		super();
+	}
+
+	public CharProperty(String name, Character value) {
+		super();
+		this.name = name;
+		this.value = value;
+	}
+
+	public String asString() {
+		return Character.toString( value );
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public Character getValue() {
+		return value;
+	}
+
+	public void setValue(Character value) {
+		this.value = value;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/IntegerProperty.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/IntegerProperty.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/IntegerProperty.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,56 @@
+package org.hibernate.test.annotations.any;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+ at Entity
+ at Table(name="int_property")
+public class IntegerProperty implements Property {
+	private Integer id;
+	private String name;
+	private Integer value;
+	
+	public IntegerProperty() {
+		super();
+	}
+
+	public IntegerProperty(String name, Integer value) {
+		super();
+		this.name = name;
+		this.value = value;
+	}
+
+	public String asString() {
+		return Integer.toString(value);
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public Integer getValue() {
+		return value;
+	}
+
+	public void setValue(Integer value) {
+		this.value = value;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/LongProperty.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/LongProperty.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/LongProperty.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,57 @@
+package org.hibernate.test.annotations.any;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+ at Entity
+ at Table(name = "long_property")
+public class LongProperty implements Property {
+    private Integer id;
+
+    private String name;
+
+    private Long value;
+
+    public LongProperty() {
+        super();
+    }
+
+    public LongProperty(String name, Long value) {
+        super();
+        this.name = name;
+        this.value = value;
+    }
+
+    public String asString() {
+        return Long.toString(value);
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    @Id
+    @GeneratedValue
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Long getValue() {
+        return value;
+    }
+
+    public void setValue(Long value) {
+        this.value = value;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/Property.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/Property.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/Property.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,7 @@
+package org.hibernate.test.annotations.any;
+
+public interface Property {
+
+	public String getName();
+	public String asString();
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/PropertyList.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/PropertyList.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/PropertyList.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,85 @@
+package org.hibernate.test.annotations.any;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.JoinTable;
+import javax.persistence.Column;
+import javax.persistence.JoinColumn;
+
+import org.hibernate.annotations.ManyToAny;
+import org.hibernate.annotations.Cascade;
+import org.hibernate.annotations.IndexColumn;
+import org.hibernate.annotations.Any;
+import org.hibernate.annotations.CascadeType;
+
+ at Entity
+ at Table( name = "property_list" )
+public class PropertyList<T extends Property> {
+	private Integer id;
+
+	private String name;
+
+	private T someProperty;
+
+	private List<T> generalProperties = new ArrayList<T>();
+
+	public PropertyList() {
+		super();
+	}
+
+	public PropertyList(String name) {
+		this.name = name;
+	}
+
+    @ManyToAny( metaDef = "Property", metaColumn = @Column(name = "property_type") )
+    @Cascade( { org.hibernate.annotations.CascadeType.ALL })
+    @JoinTable(name = "list_properties",
+			joinColumns = @JoinColumn(name = "obj_id"),
+			inverseJoinColumns = @JoinColumn(name = "property_id")
+	)
+    @IndexColumn(name = "prop_index")
+    public List<T> getGeneralProperties() {
+        return generalProperties;
+    }
+
+    public void setGeneralProperties(List<T> generalProperties) {
+        this.generalProperties = generalProperties;
+    }
+
+	@Id
+	@GeneratedValue
+	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;
+	}
+
+    @Any( metaDef = "Property", metaColumn = @Column(name = "property_type") )
+	@Cascade( CascadeType.ALL )
+	@JoinColumn(name = "property_id")
+	public T getSomeProperty() {
+        return someProperty;
+    }
+
+	public void setSomeProperty(T someProperty) {
+		this.someProperty = someProperty;
+	}
+
+	public void addGeneratedProperty(T property) {
+		this.generalProperties.add( property );
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/PropertyMap.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/PropertyMap.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/PropertyMap.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,74 @@
+package org.hibernate.test.annotations.any;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.Table;
+
+import org.hibernate.annotations.AnyMetaDef;
+import org.hibernate.annotations.Cascade;
+import org.hibernate.annotations.ManyToAny;
+import org.hibernate.annotations.MapKey;
+import org.hibernate.annotations.MetaValue;
+
+ at Entity
+ at Table( name = "property_map" )
+public class PropertyMap {
+	private Integer id;
+	private String name;
+
+	private Map<String, Property> properties = new HashMap<String, Property>();
+
+	public PropertyMap(String name) {
+		this.name = name;
+	}
+
+	public PropertyMap() {
+		super();
+	}
+
+	@Id
+	@GeneratedValue
+	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;
+	}
+
+	@ManyToAny( metaColumn = @Column( name = "property_type" ) )
+	@AnyMetaDef(
+			idType = "integer", metaType = "string",
+			metaValues = {
+			@MetaValue( value = "S", targetEntity = StringProperty.class ),
+			@MetaValue( value = "I", targetEntity = IntegerProperty.class ) } )
+	@Cascade( org.hibernate.annotations.CascadeType.ALL )
+	@JoinTable(
+			name = "map_properties",
+			joinColumns = @JoinColumn( name = "map_id" ),
+			inverseJoinColumns = @JoinColumn( name = "property_id" ) )
+	@MapKey( columns = { @Column( name = "map_key" ) } )
+	public Map<String, Property> getProperties() {
+		return properties;
+	}
+
+	public void setProperties(Map<String, Property> properties) {
+		this.properties = properties;
+	}
+
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/PropertySet.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/PropertySet.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/PropertySet.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,90 @@
+package org.hibernate.test.annotations.any;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.Table;
+
+import org.hibernate.annotations.Any;
+import org.hibernate.annotations.AnyMetaDef;
+import org.hibernate.annotations.Cascade;
+import org.hibernate.annotations.CascadeType;
+import org.hibernate.annotations.ManyToAny;
+import org.hibernate.annotations.MetaValue;
+
+ at Entity
+ at Table( name = "property_set" )
+public class PropertySet {
+	private Integer id;
+	private String name;
+	private Property someProperty;
+
+	private List<Property> generalProperties = new ArrayList<Property>();
+
+	public PropertySet() {
+		super();
+	}
+
+	public PropertySet(String name) {
+		this.name = name;
+	}
+
+	@ManyToAny(
+			metaColumn = @Column( name = "property_type" ) )
+	@AnyMetaDef( idType = "integer", metaType = "string",
+			metaValues = {
+			@MetaValue( value = "S", targetEntity = StringProperty.class ),
+			@MetaValue( value = "I", targetEntity = IntegerProperty.class ) } )
+	@Cascade( { org.hibernate.annotations.CascadeType.ALL } )
+	@JoinTable( name = "obj_properties", joinColumns = @JoinColumn( name = "obj_id" ),
+			inverseJoinColumns = @JoinColumn( name = "property_id" ) )
+	public List<Property> getGeneralProperties() {
+		return generalProperties;
+	}
+
+	public void setGeneralProperties(List<Property> generalProperties) {
+		this.generalProperties = generalProperties;
+	}
+
+	@Id
+	@GeneratedValue
+	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;
+	}
+
+	@Any( metaColumn = @Column( name = "property_type" ) )
+	@Cascade( value = { CascadeType.ALL } )
+	@AnyMetaDef( idType = "integer", metaType = "string", metaValues = {
+	@MetaValue( value = "S", targetEntity = StringProperty.class ),
+	@MetaValue( value = "I", targetEntity = IntegerProperty.class )
+			} )
+	@JoinColumn( name = "property_id" )
+	public Property getSomeProperty() {
+		return someProperty;
+	}
+
+	public void setSomeProperty(Property someProperty) {
+		this.someProperty = someProperty;
+	}
+
+	public void addGeneratedProperty(Property property) {
+		this.generalProperties.add( property );
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/StringProperty.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/StringProperty.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/StringProperty.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,54 @@
+package org.hibernate.test.annotations.any;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+ at Entity
+ at Table(name="string_property")
+public class StringProperty implements Property {
+	private Integer id;
+	private String name;
+	private String value;
+
+	public StringProperty() {
+		super();
+	}
+
+	public StringProperty(String name, String value) {
+		super();
+		this.name = name;
+		this.value = value;
+	}
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public String asString() {
+		return value;
+	}
+
+	public String getValue() {
+		return value;
+	}
+
+	public void setValue(String value) {
+		this.value = value;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/package-info.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/package-info.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/any/package-info.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,16 @@
+//$Id:
+ at AnyMetaDefs(
+		@AnyMetaDef( name= "Property", metaType = "string", idType = "integer",
+			metaValues = {
+					@MetaValue(value = "C", targetEntity = CharProperty.class),
+					@MetaValue(value = "I", targetEntity = IntegerProperty.class),
+					@MetaValue(value = "S", targetEntity = StringProperty.class),
+					@MetaValue(value = "L", targetEntity = LongProperty.class)
+					})
+)
+
+package org.hibernate.test.annotations.any;
+
+import org.hibernate.annotations.AnyMetaDefs;
+import org.hibernate.annotations.AnyMetaDef;
+import org.hibernate.annotations.MetaValue;
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/array/ArrayTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/array/ArrayTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/array/ArrayTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,54 @@
+//$Id: ArrayTest.java 14956 2008-07-18 12:08:43Z hardy.ferentschik $
+package org.hibernate.test.annotations.array;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.test.annotations.array.Contest.Month;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ArrayTest extends TestCase {
+
+	public void testOneToMany() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Competitor c1 = new Competitor();
+		c1.setName( "Renault" );
+		Competitor c2 = new Competitor();
+		c2.setName( "Ferrari" );
+		Contest contest = new Contest();
+		contest.setResults( new Competitor[]{c1, c2} );
+		contest.setHeldIn(new Month[]{Month.January, Month.December});
+		s.persist( contest );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		contest = (Contest) s.get( Contest.class, contest.getId() );
+		assertNotNull( contest );
+		assertNotNull( contest.getResults() );
+		assertEquals( 2, contest.getResults().length );
+		assertEquals( c2.getName(), contest.getResults()[1].getName() );
+		assertEquals( 2, contest.getHeldIn().length );
+		assertEquals( Month.January, contest.getHeldIn()[0] );
+		tx.commit();
+		s.close();
+	}
+
+	public ArrayTest(String x) {
+		super( x );
+	}
+
+	@SuppressWarnings("unchecked")
+	protected Class[] getMappings() {
+		return new Class[]{
+				Competitor.class,
+				Contest.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/array/Competitor.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/array/Competitor.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/array/Competitor.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,33 @@
+//$Id: Competitor.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.array;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Competitor {
+	private int id;
+	private String name;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	@Id
+	@GeneratedValue
+	public int getId() {
+		return id;
+	}
+
+	public void setId(int id) {
+		this.id = id;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/array/Contest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/array/Contest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/array/Contest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,56 @@
+//$Id: Contest.java 14956 2008-07-18 12:08:43Z hardy.ferentschik $
+package org.hibernate.test.annotations.array;
+
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+import org.hibernate.annotations.CollectionOfElements;
+import org.hibernate.annotations.IndexColumn;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Contest {
+	private int id;
+	private Competitor[] results;
+	private Month[] heldIn;
+
+	@Id
+	@GeneratedValue
+	public int getId() {
+		return id;
+	}
+
+	public void setId(int id) {
+		this.id = id;
+	}
+
+	@OneToMany(cascade = CascadeType.ALL)
+	@IndexColumn(name = "pos")
+	public Competitor[] getResults() {
+		return results;
+	}
+
+	public void setResults(Competitor[] results) {
+		this.results = results;
+	}
+	
+	@CollectionOfElements
+	@IndexColumn(name = "pos", base=1)
+	public Month[] getHeldIn() {
+		return heldIn;
+	}
+
+	public void setHeldIn(Month[] heldIn) {
+		this.heldIn = heldIn;
+	}
+	
+	public enum Month {
+		January, February, March, April, May, June, July, August, September, October, November, December;
+	}; 
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/backquotes/BackquoteTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/backquotes/BackquoteTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/backquotes/BackquoteTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,37 @@
+//$Id: BackquoteTest.java 14747 2008-06-06 08:16:25Z hardy.ferentschik $
+package org.hibernate.test.annotations.backquotes;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+import junit.framework.TestCase;
+
+import org.hibernate.cfg.AnnotationConfiguration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Testcase for ANN-718 - @JoinTable / @JoinColumn fail when using backquotes in PK field name.
+ * 
+ * @author Hardy Ferentschik
+ *
+ */
+public class BackquoteTest extends TestCase {
+		
+	private Logger log = LoggerFactory.getLogger(BackquoteTest.class);	
+	
+	public void testBackquotes() {
+		try {
+			AnnotationConfiguration config = new AnnotationConfiguration();
+			config.addAnnotatedClass(Bug.class);
+			config.addAnnotatedClass(Category.class);
+			config.buildSessionFactory();
+		}
+		catch( Exception e ) {
+			StringWriter writer = new StringWriter();
+			e.printStackTrace(new PrintWriter(writer));
+			log.debug(writer.toString());
+			fail(e.getMessage());
+		}
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/backquotes/Bug.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/backquotes/Bug.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/backquotes/Bug.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,52 @@
+//$Id: Bug.java 14747 2008-06-06 08:16:25Z hardy.ferentschik $
+package org.hibernate.test.annotations.backquotes;
+
+import java.util.List;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+
+import org.hibernate.annotations.Index;
+
+ at Entity
+public class Bug 
+{
+	@Id
+	@Column(name="`bug_id`")
+	private int id;
+	
+	@Column(name="`title`")
+	@Index(name="`titleindex`")
+	private String title;
+	
+	@ManyToMany
+	@JoinTable(name="`bug_category`")
+	private List<Category> categories;
+
+	public List<Category> getCategories() {
+		return categories;
+	}
+
+	public void setCategories(List<Category> categories) {
+		this.categories = categories;
+	}
+
+	public int getId() {
+		return id;
+	}
+
+	public void setId(int id) {
+		this.id = id;
+	}
+
+	public String getTitle() {
+		return title;
+	}
+
+	public void setTitle(String title) {
+		this.title = title;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/backquotes/Category.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/backquotes/Category.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/backquotes/Category.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,33 @@
+//$Id: Category.java 14735 2008-06-04 14:05:50Z hardy.ferentschik $
+package org.hibernate.test.annotations.backquotes;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+ at Entity
+public class Category 
+{
+	@Id
+	@Column(name="`cat_id`")
+	private int id;
+	
+	@Column(name="`title`")
+	private String title;
+
+	public int getId() {
+		return id;
+	}
+
+	public void setId(int id) {
+		this.id = id;
+	}
+
+	public String getTitle() {
+		return title;
+	}
+
+	public void setTitle(String title) {
+		this.title = title;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/bytecode/Hammer.hbm.xml
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/bytecode/Hammer.hbm.xml	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/bytecode/Hammer.hbm.xml	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,12 @@
+<?xml version="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.annotations.bytecode">
+    <class name="Hammer">
+        <id name="id" type="java.lang.Long">
+            <generator class="increment"/>
+        </id>
+    </class>
+</hibernate-mapping>
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/bytecode/Hammer.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/bytecode/Hammer.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/bytecode/Hammer.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,21 @@
+//$Id: Hammer.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.bytecode;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Hammer implements Tool {
+	private Long id;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Integer usage() {
+		return 0;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/bytecode/ProxyBreakingTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/bytecode/ProxyBreakingTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/bytecode/ProxyBreakingTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,52 @@
+//$Id: ProxyBreakingTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.bytecode;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.Hibernate;
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.cfg.Configuration;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ProxyBreakingTest extends TestCase {
+
+	static {
+		System.setProperty( "hibernate.bytecode.provider", "javassist" );
+	}
+
+	public void testProxiedBridgeMethod() throws Exception {
+		//bridge methods should not be proxied
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Hammer h = new Hammer();
+		s.save(h);
+		s.flush();
+		s.clear();
+		assertNotNull( "The proxy creation failure is breaking things", h.getId() );
+		h = (Hammer) s.load( Hammer.class, h.getId() );
+		assertFalse( Hibernate.isInitialized( h ) );
+		tx.rollback();
+		s.close();
+	}
+
+	public ProxyBreakingTest(String name) {
+		super( name );
+	}
+
+	protected Class[] getMappings() {
+		return new Class[0];
+	}
+
+	protected String[] getXmlFiles() {
+		return new String[] {
+				"org/hibernate/test/annotations/bytecode/Hammer.hbm.xml"
+		};
+	}
+
+	@Override
+	protected void configure(Configuration cfg) {
+		super.configure( cfg.setProperty( "hibernate.bytecode.provider", "javassist" ) );
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/bytecode/Tool.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/bytecode/Tool.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/bytecode/Tool.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,13 @@
+//$Id: Tool.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.bytecode;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface Tool {
+	public Long getId();
+
+	public void setId(Long id);
+
+	public Number usage();
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cascade/CascadeTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cascade/CascadeTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cascade/CascadeTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,115 @@
+//$Id: CascadeTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.cascade;
+
+import java.util.ArrayList;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * Check some of the individual cascade styles
+ *
+ * @author Emmanuel Bernard
+ */
+//FIXME do somthing for refresh
+public class CascadeTest extends TestCase {
+	public void testPersist() {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		Tooth tooth = new Tooth();
+		Tooth leftTooth = new Tooth();
+		tooth.leftNeighbour = leftTooth;
+		s.persist( tooth );
+		tx = s.beginTransaction();
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		leftTooth = (Tooth) s.get( Tooth.class, leftTooth.id );
+		assertNotNull( leftTooth );
+		tx.commit();
+		s.close();
+	}
+
+	public void testMerge() {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		Tooth tooth = new Tooth();
+		Tooth rightTooth = new Tooth();
+		tooth.type = "canine";
+		tooth.rightNeighbour = rightTooth;
+		rightTooth.type = "incisive";
+		s.persist( rightTooth );
+		s.persist( tooth );
+		tx = s.beginTransaction();
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		tooth = (Tooth) s.get( Tooth.class, tooth.id );
+		assertEquals( "incisive", tooth.rightNeighbour.type );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		tooth.rightNeighbour.type = "premolars";
+		s.merge( tooth );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		rightTooth = (Tooth) s.get( Tooth.class, rightTooth.id );
+		assertEquals( "premolars", rightTooth.type );
+		tx.commit();
+		s.close();
+	}
+
+	public void testRemove() {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Tooth tooth = new Tooth();
+		Mouth mouth = new Mouth();
+		s.persist( mouth );
+		s.persist( tooth );
+		tooth.mouth = mouth;
+		mouth.teeth = new ArrayList<Tooth>();
+		mouth.teeth.add( tooth );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		tooth = (Tooth) s.get( Tooth.class, tooth.id );
+		assertNotNull( tooth );
+		s.delete( tooth.mouth );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		tooth = (Tooth) s.get( Tooth.class, tooth.id );
+		assertNull( tooth );
+		tx.commit();
+		s.close();
+	}
+
+	public CascadeTest(String x) {
+		super( x );
+	}
+
+	protected Class[] getMappings() {
+		return new Class[]{
+				Mouth.class,
+				Tooth.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cascade/Mouth.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cascade/Mouth.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cascade/Mouth.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,24 @@
+//$Id: Mouth.java 15056 2008-08-13 18:15:05Z epbernard $
+package org.hibernate.test.annotations.cascade;
+
+import java.util.Collection;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Column;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Mouth {
+	@Id
+	@GeneratedValue
+	public Integer id;
+	@Column(name="mouth_size")
+	public int size;
+	@OneToMany(mappedBy = "mouth", cascade = CascadeType.REMOVE)
+	public Collection<Tooth> teeth;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cascade/Tooth.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cascade/Tooth.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cascade/Tooth.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,25 @@
+//$Id: Tooth.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.cascade;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Tooth {
+	@Id
+	@GeneratedValue
+	public Integer id;
+	public String type;
+	@ManyToOne(cascade = CascadeType.PERSIST)
+	public Tooth leftNeighbour;
+	@ManyToOne(cascade = CascadeType.MERGE)
+	public Tooth rightNeighbour;
+	@ManyToOne
+	public Mouth mouth;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/A.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/A.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/A.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,27 @@
+//$Id: A.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.cid;
+
+import java.io.Serializable;
+
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+
+
+/**
+ * @author Artur Legan
+ *
+ */
+ at Entity
+public class A implements Serializable{
+
+	@EmbeddedId
+	private AId aId;
+
+	public AId getAId() {
+		return aId;
+	}
+
+	public void setAId(AId aId) {
+		this.aId = aId;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/AId.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/AId.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/AId.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,40 @@
+//$Id: AId.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.cid;
+
+import java.io.Serializable;
+import javax.persistence.Embeddable;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+
+
+/**
+ * @author Artur Legan
+ */
+ at Embeddable
+public class AId implements Serializable {
+
+	@OneToOne
+	@JoinColumn( name = "bid" )
+	private B b;
+
+	@OneToOne
+	@JoinColumn( name = "cid" )
+	private C c;
+
+
+	public B getB() {
+		return b;
+	}
+
+	public void setB(B b) {
+		this.b = b;
+	}
+
+	public C getC() {
+		return c;
+	}
+
+	public void setC(C c) {
+		this.c = c;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/B.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/B.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/B.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,27 @@
+//$Id: B.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.cid;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+
+/**
+ * @author Artur Legan
+ */
+ at Entity
+public class B {
+
+	@Id
+	@GeneratedValue
+	private Long id;
+
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+}
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/C.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/C.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/C.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,27 @@
+//$Id: C.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.cid;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+
+/**
+ * @author Artur Legan
+ */
+ at Entity
+public class C {
+
+	@Id
+	@GeneratedValue
+	private Long id;
+
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/Channel.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/Channel.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/Channel.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,16 @@
+//$Id: Channel.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.cid;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Channel {
+	@Id
+	@GeneratedValue
+	public Integer id;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/Child.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/Child.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/Child.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,22 @@
+//$Id: Child.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.cid;
+
+import javax.persistence.AttributeOverride;
+import javax.persistence.Column;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+
+/**
+ * Entity having a many to one in its pk
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Inheritance(strategy = InheritanceType.JOINED)
+public class Child {
+	@EmbeddedId
+	@AttributeOverride(name = "nthChild", column = @Column(name = "nth"))
+	public ChildPk id;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/ChildPk.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/ChildPk.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/ChildPk.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,43 @@
+//$Id: ChildPk.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.cid;
+
+import java.io.Serializable;
+import javax.persistence.Embeddable;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
+import javax.persistence.ManyToOne;
+
+/**
+ * Child Pk with many to one inside
+ *
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class ChildPk implements Serializable {
+	public int nthChild;
+	@ManyToOne()
+	@JoinColumns({
+	@JoinColumn(name = "parentLastName", referencedColumnName = "p_lname"),
+	@JoinColumn(name = "parentFirstName", referencedColumnName = "firstName")
+			})
+	public Parent parent;
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( !( o instanceof ChildPk ) ) return false;
+
+		final ChildPk childPk = (ChildPk) o;
+
+		if ( nthChild != childPk.nthChild ) return false;
+		if ( !parent.equals( childPk.parent ) ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		int result;
+		result = nthChild;
+		result = 29 * result + parent.hashCode();
+		return result;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/CompositeIdTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/CompositeIdTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/CompositeIdTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,280 @@
+//$Id: CompositeIdTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.cid;
+
+import java.util.Date;
+import java.util.List;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * test some composite id functionalities
+ *
+ * @author Emmanuel Bernard
+ */
+public class CompositeIdTest extends TestCase {
+	public CompositeIdTest(String x) {
+		super( x );
+	}
+
+	public void testOneToOneInCompositePk() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		B b = new B();
+		C c = new C();
+		s.persist( b );
+		s.persist( c );
+		A a = new A();
+		a.setAId( new AId() );
+		a.getAId().setB( b );
+		a.getAId().setC( c );
+		s.persist( a );
+		s.flush();
+		s.clear();
+
+		a = (A) s.get(A.class, a.getAId() );
+		assertEquals( b.getId(), a.getAId().getB().getId() );
+
+		tx.rollback();
+		s.close();
+	}
+
+
+	/**
+	 * This feature is not supported by the EJB3
+	 * this is an hibernate extension
+	 */
+	public void testManyToOneInCompositePk() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		ParentPk ppk = new ParentPk();
+		ppk.setFirstName( "Emmanuel" );
+		ppk.setLastName( "Bernard" );
+		Parent p = new Parent();
+		p.id = ppk;
+		s.persist( p );
+		ChildPk cpk = new ChildPk();
+		cpk.parent = p;
+		cpk.nthChild = 1;
+		Child c = new Child();
+		c.id = cpk;
+		s.persist( c );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		Query q = s.createQuery( "select c from Child c where c.id.nthChild = :nth" );
+		q.setInteger( "nth", 1 );
+		List results = q.list();
+		assertEquals( 1, results.size() );
+		c = (Child) results.get( 0 );
+		assertNotNull( c );
+		assertNotNull( c.id.parent );
+		//FIXME mke it work in unambigious cases
+		//		assertNotNull(c.id.parent.id);
+		//		assertEquals(p.id.getFirstName(), c.id.parent.id.getFirstName());
+		s.delete( c );
+		s.delete( c.id.parent );
+		tx.commit();
+		s.close();
+	}
+
+	/**
+	 * This feature is not supported by the EJB3
+	 * this is an hibernate extension
+	 */
+	public void testManyToOneInCompositePkAndSubclass() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		ParentPk ppk = new ParentPk();
+		ppk.setFirstName( "Emmanuel" );
+		ppk.setLastName( "Bernard" );
+		Parent p = new Parent();
+		p.id = ppk;
+		s.persist( p );
+		ChildPk cpk = new ChildPk();
+		cpk.parent = p;
+		cpk.nthChild = 1;
+		LittleGenius c = new LittleGenius();
+		c.particularSkill = "Human Annotation parser";
+		c.id = cpk;
+		s.persist( c );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		Query q = s.createQuery( "select c from Child c where c.id.nthChild = :nth" );
+		q.setInteger( "nth", 1 );
+		List results = q.list();
+		assertEquals( 1, results.size() );
+		c = (LittleGenius) results.get( 0 );
+		assertNotNull( c );
+		assertNotNull( c.id.parent );
+		//FIXME mke it work in unambigious cases
+//		assertNotNull(c.id.parent.id);
+//		assertEquals(p.id.getFirstName(), c.id.parent.id.getFirstName());
+		s.delete( c );
+		s.delete( c.id.parent );
+		tx.commit();
+		s.close();
+	}
+
+	public void testManyToOneInCompositeId() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Channel channel = new Channel();
+		s.persist( channel );
+		Presenter pres = new Presenter();
+		pres.name = "Casimir";
+		s.persist( pres );
+		TvMagazinPk pk = new TvMagazinPk();
+		TvMagazin mag = new TvMagazin();
+		mag.time = new Date();
+		mag.id = pk;
+		//pk.name = "Trax";
+		pk.channel = channel;
+		pk.presenter = pres;
+		s.persist( mag );
+		tx.commit();
+		s.clear();
+		tx = s.beginTransaction();
+		mag = (TvMagazin) s.createQuery( "from TvMagazin mag" ) // where mag.id.name = :name")
+				//.setParameter( "name", "Trax" )
+				.uniqueResult();
+		assertNotNull( mag.id );
+		assertNotNull( mag.id.channel );
+		assertEquals( channel.id, mag.id.channel.id );
+		assertNotNull( mag.id.presenter );
+		assertEquals( pres.name, mag.id.presenter.name );
+		s.delete( mag );
+		s.delete( mag.id.channel );
+		s.delete( mag.id.presenter );
+		tx.commit();
+		s.close();
+	}
+
+	public void testManyToOneInCompositeIdClass() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Order order = new Order();
+		s.persist( order );
+		Product product = new Product();
+		product.name = "small car";
+		s.persist( product );
+		OrderLinePk pk = new OrderLinePk();
+		OrderLine orderLine = new OrderLine();
+		orderLine.order = order;
+		orderLine.product = product;
+		s.persist( orderLine );
+		s.flush();
+		s.clear();
+
+		orderLine = (OrderLine) s.createQuery( "select ol from OrderLine ol" ).uniqueResult();
+		assertNotNull( orderLine.order );
+		assertEquals( order.id, orderLine.order.id );
+		assertNotNull( orderLine.product );
+		assertEquals( product.name, orderLine.product.name );
+
+		tx.rollback();
+		s.close();
+	}
+
+	public void testSecondaryTableWithCompositeId() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Channel channel = new Channel();
+		s.persist( channel );
+		Presenter pres = new Presenter();
+		pres.name = "Tim Russet";
+		s.persist( pres );
+		TvMagazinPk pk = new TvMagazinPk();
+		TvProgram program = new TvProgram();
+		program.time = new Date();
+		program.id = pk;
+		program.text = "Award Winning Programming";
+		//pk.name = "Trax";
+		pk.channel = channel;
+		pk.presenter = pres;
+		s.persist( program );
+		tx.commit();
+		s.clear();
+		tx = s.beginTransaction();
+		program = (TvProgram) s.createQuery( "from TvProgram pr" ) // where mag.id.name = :name")
+				//.setParameter( "name", "Trax" )
+				.uniqueResult();
+		assertNotNull( program.id );
+		assertNotNull( program.id.channel );
+		assertEquals( channel.id, program.id.channel.id );
+		assertNotNull( program.id.presenter );
+		assertNotNull( program.text );
+		assertEquals( pres.name, program.id.presenter.name );
+		s.delete( program );
+		s.delete( program.id.channel );
+		s.delete( program.id.presenter );
+		tx.commit();
+		s.close();
+	}
+
+	public void testSecondaryTableWithIdClass() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Channel channel = new Channel();
+		s.persist( channel );
+		Presenter pres = new Presenter();
+		pres.name = "Bob";
+		s.persist( pres );
+		TvProgramIdClass program = new TvProgramIdClass();
+		program.time = new Date();
+		program.channel = channel;
+		program.presenter = pres;
+		program.text = "Jump the shark programming";
+		//pk.name = "Trax";
+		s.persist( program );
+		tx.commit();
+		s.clear();
+		tx = s.beginTransaction();
+		program = (TvProgramIdClass) s.createQuery( "from TvProgramIdClass pr" ) // where mag.id.name = :name")
+				//.setParameter( "name", "Trax" )
+				.uniqueResult();
+		assertNotNull( program.channel );
+		assertEquals( channel.id, program.channel.id );
+		assertNotNull( program.presenter );
+		assertNotNull( program.text );
+		assertEquals( pres.name, program.presenter.name );
+		s.delete( program );
+		s.delete( program.channel );
+		s.delete( program.presenter );
+		tx.commit();
+		s.close();
+	}
+
+	protected Class[] getMappings() {
+		return new Class[] {
+				Parent.class,
+				Child.class,
+				Channel.class,
+				TvMagazin.class,
+				TvProgramIdClass.class,
+				TvProgram.class,
+				Presenter.class,
+				Order.class,
+				Product.class,
+				OrderLine.class,
+				OrderLinePk.class,
+				LittleGenius.class,
+				A.class,
+				B.class,
+				C.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/LittleGenius.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/LittleGenius.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/LittleGenius.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,19 @@
+package org.hibernate.test.annotations.cid;
+
+import javax.persistence.Entity;
+import javax.persistence.PrimaryKeyJoinColumn;
+import javax.persistence.PrimaryKeyJoinColumns;
+
+/**
+ * Hierarchy with cid + many to one
+ * @author Anthony
+ *
+ */
+ at Entity
+ at PrimaryKeyJoinColumns({
+ at PrimaryKeyJoinColumn(name = "nthChild"),
+ at PrimaryKeyJoinColumn(name = "parentLastName"),
+ at PrimaryKeyJoinColumn(name = "parentFirstName")})
+public class LittleGenius extends Child {
+	public String particularSkill;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/Order.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/Order.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/Order.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,17 @@
+package org.hibernate.test.annotations.cid;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "OrderTableFoobar")
+public class Order {
+	@Id
+    @GeneratedValue
+    public Integer id;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/OrderLine.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/OrderLine.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/OrderLine.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,17 @@
+package org.hibernate.test.annotations.cid;
+
+import javax.persistence.Entity;
+import javax.persistence.IdClass;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at IdClass(OrderLinePk.class)
+public class OrderLine {
+    @Id
+    public Order order;
+    @Id
+    public Product product;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/OrderLinePk.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/OrderLinePk.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/OrderLinePk.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,18 @@
+package org.hibernate.test.annotations.cid;
+
+
+import javax.persistence.ManyToOne;
+import javax.persistence.JoinColumn;
+import java.io.Serializable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class OrderLinePk implements Serializable {
+	@ManyToOne
+    @JoinColumn(name = "foo", nullable = false)
+    public Order order;
+	@ManyToOne
+    @JoinColumn(name = "bar", nullable = false)
+    public Product product;    
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/Parent.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/Parent.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/Parent.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,31 @@
+//$Id: Parent.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.cid;
+
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+
+/**
+ * Entity with composite id
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Parent {
+	@EmbeddedId
+	public ParentPk id;
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( !( o instanceof Parent ) ) return false;
+
+		final Parent parent = (Parent) o;
+
+		if ( !id.equals( parent.id ) ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		return id.hashCode();
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/ParentPk.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/ParentPk.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/ParentPk.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,52 @@
+//$Id: ParentPk.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.cid;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+
+/**
+ * @author Emmanuel Bernard
+ */
+
+public class ParentPk implements Serializable {
+	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;
+	}
+
+
+	private String firstName;
+	@Column(name = "p_lname")
+	private String lastName;
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( !( o instanceof ParentPk ) ) return false;
+
+		final ParentPk parentPk = (ParentPk) o;
+
+		if ( !firstName.equals( parentPk.firstName ) ) return false;
+		if ( !lastName.equals( parentPk.lastName ) ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		int result;
+		result = firstName.hashCode();
+		result = 29 * result + lastName.hashCode();
+		return result;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/Presenter.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/Presenter.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/Presenter.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,14 @@
+//$Id: Presenter.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.cid;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Presenter {
+	@Id
+	public String name;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/Product.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/Product.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/Product.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,13 @@
+package org.hibernate.test.annotations.cid;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Product {
+	@Id
+    public String name;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/TvMagazin.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/TvMagazin.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/TvMagazin.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,22 @@
+//$Id: TvMagazin.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.cid;
+
+import java.util.Date;
+import javax.persistence.AssociationOverride;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at AssociationOverride(name = "id.channel", joinColumns = @JoinColumn(name = "chan_id"))
+public class TvMagazin {
+	@EmbeddedId
+	public TvMagazinPk id;
+	@Temporal(TemporalType.TIME)
+	Date time;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/TvMagazinPk.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/TvMagazinPk.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/TvMagazinPk.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,18 @@
+//$Id: TvMagazinPk.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.cid;
+
+import java.io.Serializable;
+import javax.persistence.Embeddable;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class TvMagazinPk implements Serializable {
+	@ManyToOne
+	public Channel channel;
+	//public String name;
+	@ManyToOne
+	public Presenter presenter;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/TvProgram.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/TvProgram.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/TvProgram.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,31 @@
+//$Id: TvProgram.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.cid;
+
+import java.util.Date;
+import javax.persistence.Column;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.PrimaryKeyJoinColumn;
+import javax.persistence.SecondaryTable;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+/**
+ * @author Chandra Patni
+ */
+ at Entity
+ at SecondaryTable( name = "TV_PROGRAM_EXT", pkJoinColumns = {
+ at PrimaryKeyJoinColumn( name = "CHANNEL_ID" ),
+ at PrimaryKeyJoinColumn( name = "PRESENTER_NAME" )
+		} )
+public class TvProgram {
+	@EmbeddedId
+	public TvMagazinPk id;
+
+	@Temporal( TemporalType.TIME )
+	Date time;
+
+	@Column( name = "TXT", table = "TV_PROGRAM_EXT" )
+	public String text;
+
+}
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/TvProgramIdClass.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/TvProgramIdClass.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/cid/TvProgramIdClass.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,34 @@
+//$Id: TvProgramIdClass.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.cid;
+
+import java.util.Date;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.PrimaryKeyJoinColumn;
+import javax.persistence.SecondaryTable;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+ at Entity
+ at SecondaryTable( name = "TV_PROGRAM_IDCLASS", pkJoinColumns =
+		{
+		@PrimaryKeyJoinColumn( name = "CHANNEL_ID" ),
+		@PrimaryKeyJoinColumn( name = "PRESENTER_NAME" )
+				} )
+ at IdClass( TvMagazinPk.class )
+public class TvProgramIdClass {
+	@Id
+	public Channel channel;
+	@Id
+	public Presenter presenter;
+
+	@Temporal( TemporalType.TIME )
+	Date time;
+
+	@Column( name = "TXT", table = "TV_PROGRAM_IDCLASS" )
+	public String text;
+}
+
+

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/Boy.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/Boy.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/Boy.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,134 @@
+//$Id: Boy.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.collectionelement;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import javax.persistence.AttributeOverride;
+import javax.persistence.AttributeOverrides;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+
+import org.hibernate.annotations.CollectionOfElements;
+import org.hibernate.annotations.IndexColumn;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at AttributeOverrides({
+		@AttributeOverride( name="characters.element", column = @Column(name="fld_character") ),
+		@AttributeOverride( name="scorePerNickName.element", column = @Column(name="fld_score") ),
+		@AttributeOverride( name="favoriteToys.element.brand.surname", column = @Column(name = "fld_surname"))}
+)
+public class Boy {
+	private Integer id;
+	private String firstName;
+	private String lastName;
+	private Set<String> nickNames = new HashSet<String>();
+	private Map<String, Integer> scorePerNickName = new HashMap<String, Integer>();
+	private int[] favoriteNumbers;
+	private Set<Toy> favoriteToys = new HashSet<Toy>();
+	private Set<Character> characters = new HashSet<Character>();
+	private Set<CountryAttitude> countryAttitudes = new HashSet<CountryAttitude>();
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer 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;
+	}
+
+	@CollectionOfElements
+	public Set<String> getNickNames() {
+		return nickNames;
+	}
+
+	public void setNickNames(Set<String> nickName) {
+		this.nickNames = nickName;
+	}
+
+	@CollectionOfElements
+	@JoinTable(name = "ScorePerNickName", joinColumns = @JoinColumn(name = "BoyId"))
+	@Column(name = "score", nullable = false)
+	public Map<String, Integer> getScorePerNickName() {
+		return scorePerNickName;
+	}
+
+	public void setScorePerNickName(Map<String, Integer> scorePerNickName) {
+		this.scorePerNickName = scorePerNickName;
+	}
+
+	@CollectionOfElements
+	@JoinTable(
+			name = "BoyFavoriteNumbers",
+			joinColumns = @JoinColumn(name = "BoyId")
+	)
+	@Column(name = "favoriteNumber", nullable = false)
+	@IndexColumn(name = "nbr_index")
+	public int[] getFavoriteNumbers() {
+		return favoriteNumbers;
+	}
+
+	public void setFavoriteNumbers(int[] favoriteNumbers) {
+		this.favoriteNumbers = favoriteNumbers;
+	}
+
+	@CollectionOfElements
+	@AttributeOverride(name = "element.serial", column = @Column(name = "serial_nbr"))
+	public Set<Toy> getFavoriteToys() {
+		return favoriteToys;
+	}
+
+	public void setFavoriteToys(Set<Toy> favoriteToys) {
+		this.favoriteToys = favoriteToys;
+	}
+
+	@CollectionOfElements
+	@Enumerated(EnumType.STRING)
+	public Set<Character> getCharacters() {
+		return characters;
+	}
+
+	public void setCharacters(Set<Character> characters) {
+		this.characters = characters;
+	}
+
+	@CollectionOfElements(fetch = FetchType.EAGER)
+	//@Where(clause = "b_likes=false")
+	public Set<CountryAttitude> getCountryAttitudes() {
+		return countryAttitudes;
+	}
+
+	public void setCountryAttitudes(Set<CountryAttitude> countryAttitudes) {
+		this.countryAttitudes = countryAttitudes;
+	}
+}
+

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/Brand.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/Brand.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/Brand.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,44 @@
+//$Id: Brand.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.collectionelement;
+
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class Brand {
+	private String name;
+	private String surname;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getSurname() {
+		return surname;
+	}
+
+	public void setSurname(String surname) {
+		this.surname = surname;
+	}
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( o == null || getClass() != o.getClass() ) return false;
+
+		final Brand brand = (Brand) o;
+
+		if ( !name.equals( brand.name ) ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		return name.hashCode();
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/Character.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/Character.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/Character.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,13 @@
+package org.hibernate.test.annotations.collectionelement;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public enum Character {
+	GENTLE,
+	NORMAL,
+	AGGRESSIVE,
+	ATTENTIVE,
+	VIOLENT,
+	CRAFTY
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/CollectionElementTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/CollectionElementTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/CollectionElementTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,213 @@
+//$Id: CollectionElementTest.java 14754 2008-06-09 15:57:07Z hardy.ferentschik $
+package org.hibernate.test.annotations.collectionelement;
+
+import java.util.List;
+import java.util.Locale;
+
+import org.hibernate.Filter;
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.Country;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ * @author Hardy Ferentschik
+ */
+ at SuppressWarnings("unchecked")
+public class CollectionElementTest extends TestCase {
+	
+	public void testSimpleElement() throws Exception {
+		assertEquals(
+				"BoyFavoriteNumbers",
+				getCfg().getCollectionMapping( Boy.class.getName() + '.' + "favoriteNumbers" )
+						.getCollectionTable().getName()
+		);
+		Session s = openSession();
+		s.getTransaction().begin();
+		Boy boy = new Boy();
+		boy.setFirstName( "John" );
+		boy.setLastName( "Doe" );
+		boy.getNickNames().add( "Johnny" );
+		boy.getNickNames().add( "Thing" );
+		boy.getScorePerNickName().put( "Johnny", new Integer( 3 ) );
+		boy.getScorePerNickName().put( "Thing", new Integer( 5 ) );
+		int[] favNbrs = new int[4];
+		for (int index = 0; index < favNbrs.length - 1; index++) {
+			favNbrs[index] = index * 3;
+		}
+		boy.setFavoriteNumbers( favNbrs );
+		boy.getCharacters().add( Character.GENTLE );
+		boy.getCharacters().add( Character.CRAFTY );
+		s.persist( boy );
+		s.getTransaction().commit();
+		s.clear();
+		Transaction tx = s.beginTransaction();
+		boy = (Boy) s.get( Boy.class, boy.getId() );
+		assertNotNull( boy.getNickNames() );
+		assertTrue( boy.getNickNames().contains( "Thing" ) );
+		assertNotNull( boy.getScorePerNickName() );
+		assertTrue( boy.getScorePerNickName().containsKey( "Thing" ) );
+		assertEquals( new Integer( 5 ), boy.getScorePerNickName().get( "Thing" ) );
+		assertNotNull( boy.getFavoriteNumbers() );
+		assertEquals( 3, boy.getFavoriteNumbers()[1] );
+		assertTrue( boy.getCharacters().contains( Character.CRAFTY ) );
+		List result = s.createQuery( "select boy from Boy boy join boy.nickNames names where names = :name" )
+				.setParameter( "name", "Thing" ).list();
+		assertEquals( 1, result.size() );
+		s.delete( boy );
+		tx.commit();
+		s.close();
+	}
+
+	public void testCompositeElement() throws Exception {
+		Session s = openSession();
+		s.getTransaction().begin();
+		Boy boy = new Boy();
+		boy.setFirstName( "John" );
+		boy.setLastName( "Doe" );
+		Toy toy = new Toy();
+		toy.setName( "Balloon" );
+		toy.setSerial( "serial001" );
+		toy.setBrand( new Brand() );
+		toy.getBrand().setName( "Bandai" );
+		boy.getFavoriteToys().add( toy );
+		s.persist( boy );
+		s.getTransaction().commit();
+		s.clear();
+		Transaction tx = s.beginTransaction();
+		boy = (Boy) s.get( Boy.class, boy.getId() );
+		assertNotNull( boy.getFavoriteToys() );
+		assertTrue( boy.getFavoriteToys().contains( toy ) );
+		assertEquals( "@Parent is failing", boy, boy.getFavoriteToys().iterator().next().getOwner() );
+		s.delete( boy );
+		tx.commit();
+		s.close();
+	}
+
+	public void testAttributedJoin() throws Exception {
+		Session s = openSession();
+		s.getTransaction().begin();
+		Country country = new Country();
+		country.setName( "Australia" );
+		s.persist( country );
+
+		Boy boy = new Boy();
+		boy.setFirstName( "John" );
+		boy.setLastName( "Doe" );
+		CountryAttitude attitude = new CountryAttitude();
+		// TODO: doesn't work
+		attitude.setBoy( boy );
+		attitude.setCountry( country );
+		attitude.setLikes( true );
+		boy.getCountryAttitudes().add( attitude );
+		s.persist( boy );
+		s.getTransaction().commit();
+		s.clear();
+
+		Transaction tx = s.beginTransaction();
+		boy = (Boy) s.get( Boy.class, boy.getId() );
+		assertTrue( boy.getCountryAttitudes().contains( attitude ) );
+		s.delete( boy );
+		s.delete( s.get( Country.class, country.getId() ) );
+		tx.commit();
+		s.close();
+
+	}
+
+	public void testLazyCollectionofElements() throws Exception {
+		assertEquals(
+				"BoyFavoriteNumbers",
+				getCfg().getCollectionMapping( Boy.class.getName() + '.' + "favoriteNumbers" )
+						.getCollectionTable().getName()
+		);
+		Session s = openSession();
+		s.getTransaction().begin();
+		Boy boy = new Boy();
+		boy.setFirstName( "John" );
+		boy.setLastName( "Doe" );
+		boy.getNickNames().add( "Johnny" );
+		boy.getNickNames().add( "Thing" );
+		boy.getScorePerNickName().put( "Johnny", new Integer( 3 ) );
+		boy.getScorePerNickName().put( "Thing", new Integer( 5 ) );
+		int[] favNbrs = new int[4];
+		for (int index = 0; index < favNbrs.length - 1; index++) {
+			favNbrs[index] = index * 3;
+		}
+		boy.setFavoriteNumbers( favNbrs );
+		boy.getCharacters().add( Character.GENTLE );
+		boy.getCharacters().add( Character.CRAFTY );
+		s.persist( boy );
+		s.getTransaction().commit();
+		s.clear();
+		Transaction tx = s.beginTransaction();
+		boy = (Boy) s.get( Boy.class, boy.getId() );
+		assertNotNull( boy.getNickNames() );
+		assertTrue( boy.getNickNames().contains( "Thing" ) );
+		assertNotNull( boy.getScorePerNickName() );
+		assertTrue( boy.getScorePerNickName().containsKey( "Thing" ) );
+		assertEquals( new Integer( 5 ), boy.getScorePerNickName().get( "Thing" ) );
+		assertNotNull( boy.getFavoriteNumbers() );
+		assertEquals( 3, boy.getFavoriteNumbers()[1] );
+		assertTrue( boy.getCharacters().contains( Character.CRAFTY ) );
+		List result = s.createQuery( "select boy from Boy boy join boy.nickNames names where names = :name" )
+				.setParameter( "name", "Thing" ).list();
+		assertEquals( 1, result.size() );
+		s.delete( boy );
+		tx.commit();
+		s.close();
+	}
+
+	public void testFetchEagerAndFilter() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+
+		TestCourse test = new TestCourse();
+
+		LocalizedString title = new LocalizedString( "title in english" );
+		title.getVariations().put( Locale.FRENCH.getLanguage(), "title en francais" );
+		test.setTitle( title );
+		s.save( test );
+
+		s.flush();
+		s.clear();
+
+		Filter filter = s.enableFilter( "selectedLocale" );
+		filter.setParameter( "param", "fr" );
+
+		Query q = s.createQuery( "from TestCourse t" );
+		List l = q.list();
+		assertEquals( 1, l.size() );
+
+		TestCourse t = (TestCourse) s.get( TestCourse.class, test.getTestCourseId() );
+		assertEquals( 1, t.getTitle().getVariations().size() );
+
+		tx.rollback();
+
+		s.close();
+	}
+
+	public void testMapKeyType() throws Exception {
+		Matrix m = new Matrix();
+		m.getValues().put( 1, 1.1f );
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		s.persist( m );
+		s.flush();
+		s.clear();
+		m = (Matrix) s.get( Matrix.class, m.getId() );
+		assertEquals( 1.1f, m.getValues().get( 1 ) );
+		tx.rollback();
+		s.close();
+	}
+
+	protected Class[] getMappings() {
+		return new Class[] {
+				Boy.class,
+				Country.class,
+				TestCourse.class,
+				Matrix.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/CountryAttitude.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/CountryAttitude.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/CountryAttitude.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,59 @@
+//$Id: CountryAttitude.java 14754 2008-06-09 15:57:07Z hardy.ferentschik $
+package org.hibernate.test.annotations.collectionelement;
+
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+import javax.persistence.ManyToOne;
+
+import org.hibernate.test.annotations.Country;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class CountryAttitude {
+	private Boy boy;
+	private Country country;
+	private boolean likes;
+
+	// TODO: This currently does not work
+//	@ManyToOne(optional = false)
+//	public Boy getBoy() {
+//		return boy;
+//	}
+
+	public void setBoy(Boy boy) {
+		this.boy = boy;
+	}
+
+	@ManyToOne(optional = false)
+	public Country getCountry() {
+		return country;
+	}
+
+	public void setCountry(Country country) {
+		this.country = country;
+	}
+
+	@Column(name = "b_likes")
+	public boolean isLikes() {
+		return likes;
+	}
+
+	public void setLikes(boolean likes) {
+		this.likes = likes;
+	}
+
+	@Override
+	public int hashCode() {
+		return country.hashCode();
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if ( !( obj instanceof CountryAttitude ) ) {
+			return false;
+		}
+		return country.equals( ( (CountryAttitude) obj ).country );
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/LocalizedString.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/LocalizedString.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/LocalizedString.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,47 @@
+//$Id: LocalizedString.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.collectionelement;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Locale;
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+
+import org.hibernate.annotations.CollectionOfElements;
+import org.hibernate.annotations.Fetch;
+import org.hibernate.annotations.MapKey;
+import org.hibernate.annotations.FetchMode;
+import org.hibernate.annotations.Filter;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class LocalizedString implements Serializable {
+
+	private static final Locale DEFAULT_LOCALE = Locale.ENGLISH;
+
+	public LocalizedString() {
+	}
+
+	public LocalizedString(String string) {
+		this.getVariations().put( DEFAULT_LOCALE.getLanguage(), string );
+	}
+
+	private Map<String, String> variations =
+			new HashMap<String, String>( 1 );
+
+	@CollectionOfElements
+	@MapKey( columns = @Column( name = "language_code" ) )
+	@Fetch( FetchMode.JOIN )
+	@Filter( name = "selectedLocale",
+			condition = " language_code = :param " )
+	public Map<String, String> getVariations() {
+		return variations;
+	}
+
+	public void setVariations(Map<String, String> variations) {
+		this.variations = variations;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/Matrix.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/Matrix.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/Matrix.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,48 @@
+//$
+package org.hibernate.test.annotations.collectionelement;
+
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+import org.hibernate.annotations.CollectionOfElements;
+import org.hibernate.annotations.MapKey;
+import org.hibernate.annotations.Sort;
+import org.hibernate.annotations.SortType;
+import org.hibernate.annotations.Type;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Matrix {
+	@Id
+	@GeneratedValue
+	private Integer id;
+	
+	@MapKey(type = @Type(type="integer") )
+	@CollectionOfElements
+	@Sort(type = SortType.NATURAL) 
+	@Type(type = "float")
+	private SortedMap<Integer, Float> values = new TreeMap<Integer, Float>();
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public Map<Integer, Float> getValues() {
+		return values;
+	}
+
+	public void setValues(SortedMap<Integer, Float> values) {
+		this.values = values;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/TestCourse.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/TestCourse.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/TestCourse.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,42 @@
+//$Id: TestCourse.java 14754 2008-06-09 15:57:07Z hardy.ferentschik $
+package org.hibernate.test.annotations.collectionelement;
+
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+import org.hibernate.annotations.FilterDef;
+import org.hibernate.annotations.ParamDef;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at FilterDef(name="selectedLocale", parameters={ @ParamDef( name="param", type="string" ) } )
+public class TestCourse {
+
+	private Long testCourseId;
+
+	private LocalizedString title;
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.AUTO)
+	public Long getTestCourseId() {
+		return testCourseId;
+	}
+
+	public void setTestCourseId(Long testCourseId) {
+		this.testCourseId = testCourseId;
+	}
+
+	@Embedded
+	public LocalizedString getTitle() {
+		return title;
+	}
+
+	public void setTitle(LocalizedString title) {
+		this.title = title;
+	}
+}
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/Toy.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/Toy.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/Toy.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,73 @@
+//$Id: Toy.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.collectionelement;
+
+import javax.persistence.AttributeOverride;
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+
+import org.hibernate.annotations.Parent;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class Toy {
+	private String name;
+	private Brand brand;
+	private String serial;
+	private Boy owner;
+
+	@AttributeOverride(name = "name", column = @Column(name = "brand_name"))
+	public Brand getBrand() {
+		return brand;
+	}
+
+	public void setBrand(Brand brand) {
+		this.brand = brand;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getSerial() {
+		return serial;
+	}
+
+	public void setSerial(String serial) {
+		this.serial = serial;
+	}
+
+	@Parent
+	public Boy getOwner() {
+		return owner;
+	}
+
+	public void setOwner(Boy owner) {
+		this.owner = owner;
+	}
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( o == null || getClass() != o.getClass() ) return false;
+
+		final Toy toy = (Toy) o;
+
+		if ( !brand.equals( toy.brand ) ) return false;
+		if ( !name.equals( toy.name ) ) return false;
+		if ( !serial.equals( toy.serial ) ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		int result;
+		result = name.hashCode();
+		result = 29 * result + brand.hashCode();
+		return result;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/deepcollectionelements/A.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/deepcollectionelements/A.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/deepcollectionelements/A.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,45 @@
+//$
+package org.hibernate.test.annotations.collectionelement.deepcollectionelements;
+
+/**
+ * @author Emmanuel Bernard
+ */
+
+import java.util.List;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.Table;
+
+import org.hibernate.annotations.CollectionOfElements;
+import org.hibernate.annotations.IndexColumn;
+
+ at Entity
+ at Table( name = "A" )
+public class A {
+	@Id
+	@GeneratedValue( strategy = GenerationType.SEQUENCE, generator = "aSequence" )
+	@SequenceGenerator( name = "aSequence", sequenceName = "seq_A" )
+	private int id;
+	@CollectionOfElements
+	@IndexColumn( name = "ndx" )
+	private List<B> listOfB;
+
+	public int getId() {
+		return id;
+	}
+
+	public void setId(int id) {
+		this.id = id;
+	}
+
+	public List<B> getListOfB() {
+		return listOfB;
+	}
+
+	public void setListOfB(List<B> listOfB) {
+		this.listOfB = listOfB;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/deepcollectionelements/B.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/deepcollectionelements/B.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/deepcollectionelements/B.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,36 @@
+//$
+package org.hibernate.test.annotations.collectionelement.deepcollectionelements;
+
+import java.util.List;
+import javax.persistence.Embeddable;
+import javax.persistence.Transient;
+import javax.persistence.OneToMany;
+
+import org.hibernate.annotations.CollectionOfElements;
+import org.hibernate.annotations.IndexColumn;
+
+ at Embeddable
+public class B {
+	private String name;
+
+	//@CollectionOfElements
+	@OneToMany
+	@IndexColumn( name = "ndx" )
+	private List<C> listOfC;
+
+	public List<C> getListOfC() {
+		return listOfC;
+	}
+
+	public void setListOfC(List<C> listOfC) {
+		this.listOfC = listOfC;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/deepcollectionelements/C.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/deepcollectionelements/C.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/deepcollectionelements/C.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,27 @@
+//$
+package org.hibernate.test.annotations.collectionelement.deepcollectionelements;
+
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Entity;
+
+
+ at Entity
+public class C {
+	@Id
+	@GeneratedValue
+	private int id;
+
+	@Column( length = 500 )
+	private String comment;
+
+	public String getComment() {
+		return comment;
+	}
+
+	public void setComment(String comment) {
+		this.comment = comment;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/deepcollectionelements/DeepCollectionElementTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/deepcollectionelements/DeepCollectionElementTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/deepcollectionelements/DeepCollectionElementTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,25 @@
+//$
+package org.hibernate.test.annotations.collectionelement.deepcollectionelements;
+
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+
+//TEST not used: wait for ANN-591 and HHH-3157 
+public class DeepCollectionElementTest extends TestCase {
+
+	public void testInitialization() throws Exception {
+		//test only the SF creation
+
+	}
+
+	protected Class[] getMappings() {
+		return new Class[] {
+				//A.class,
+				//B.class,
+				//C.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/indexedCollection/Contact.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/indexedCollection/Contact.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/indexedCollection/Contact.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,20 @@
+//$
+package org.hibernate.test.annotations.collectionelement.indexedCollection;
+
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class Contact {
+	private String name;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/indexedCollection/IndexedCollectionOfElementsTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/indexedCollection/IndexedCollectionOfElementsTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/indexedCollection/IndexedCollectionOfElementsTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,32 @@
+//$
+package org.hibernate.test.annotations.collectionelement.indexedCollection;
+
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.Session;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class IndexedCollectionOfElementsTest extends TestCase {
+
+	public void testIndexedCollectionOfElements() throws Exception {
+		Sale sale = new Sale();
+		Contact contact = new Contact();
+		contact.setName( "Emmanuel" );
+		sale.getContacts().add(contact);
+		Session s = openSession(  );
+		s.getTransaction().begin();
+		s.save( sale );
+		s.flush();
+		s.get( Sale.class, sale.getId() );
+		assertEquals( 1, sale.getContacts().size() );
+		s.getTransaction().rollback();
+		s.close();
+	}
+
+	protected Class[] getMappings() {
+		return new Class[] {
+				Sale.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/indexedCollection/Sale.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/indexedCollection/Sale.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/collectionelement/indexedCollection/Sale.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,51 @@
+//$
+package org.hibernate.test.annotations.collectionelement.indexedCollection;
+
+import java.util.List;
+import java.util.ArrayList;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.Column;
+
+import org.hibernate.annotations.Type;
+import org.hibernate.annotations.CollectionOfElements;
+import org.hibernate.annotations.CollectionId;
+import org.hibernate.annotations.GenericGenerator;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at GenericGenerator(name="increment", strategy = "increment")
+public class Sale {
+	@Id @GeneratedValue private Integer id;
+
+	@CollectionOfElements
+    @JoinTable(
+        name = "contact",
+        joinColumns = @JoinColumn(name = "n_key_person"))
+    @CollectionId(
+        columns = @Column(name = "n_key_contact"),
+        type = @Type(type = "long"),
+        generator = "increment" ) 
+	private List<Contact> contacts = new ArrayList<Contact>();
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public List<Contact> getContacts() {
+		return contacts;
+	}
+
+	public void setContacts(List<Contact> contacts) {
+		this.contacts = contacts;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/configuration/ConfigurationTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/configuration/ConfigurationTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/configuration/ConfigurationTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,21 @@
+//$Id: ConfigurationTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.configuration;
+
+import junit.framework.TestCase;
+import org.hibernate.cfg.AnnotationConfiguration;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ConfigurationTest extends TestCase {
+	public void testMixPackageAndResourceOrdering() throws Exception {
+		try {
+			AnnotationConfiguration config = new AnnotationConfiguration();
+			config.addResource( "org/hibernate/test/annotations/configuration/orm.xml" );
+			config.addPackage( "org.hibernate.test.annotations.configuration" );
+		}
+		catch( Exception e ) {
+			fail("Processing package first when ORM.xml is used should not fail");
+		}
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/configuration/orm.xml
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/configuration/orm.xml	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/configuration/orm.xml	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<entity-mappings
+    xmlns="http://java.sun.com/xml/ns/persistence/orm"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_1_0.xsd"
+    version="1.0">
+</entity-mappings>

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/configuration/package-info.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/configuration/package-info.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/configuration/package-info.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,4 @@
+ at GenericGenerator(name = "myGenerator", strategy = "sequence")
+package org.hibernate.test.annotations.configuration;
+
+import org.hibernate.annotations.GenericGenerator;

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/duplicatedgenerator/DuplicateTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/duplicatedgenerator/DuplicateTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/duplicatedgenerator/DuplicateTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,28 @@
+//$Id: DuplicateTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.duplicatedgenerator;
+
+import junit.framework.TestCase;
+import org.hibernate.AnnotationException;
+import org.hibernate.cfg.AnnotationConfiguration;
+import org.hibernate.cfg.Environment;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class DuplicateTest extends TestCase {
+	public void testDuplicateEntityName() throws Exception {
+		AnnotationConfiguration cfg = new AnnotationConfiguration();
+		cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
+		try {
+			cfg.addAnnotatedClass( Flight.class );
+			cfg.addAnnotatedClass( org.hibernate.test.annotations.Flight.class );
+			cfg.addResource( "org/hibernate/test/annotations/orm.xml");
+			cfg.addResource( "org/hibernate/test/annotations/duplicatedgenerator/orm.xml");
+			cfg.buildSessionFactory();
+			fail( "Should not be able to map the same entity name twice" );
+		}
+		catch (AnnotationException ae) {
+			//success
+		}
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/duplicatedgenerator/Flight.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/duplicatedgenerator/Flight.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/duplicatedgenerator/Flight.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,18 @@
+//$Id: Flight.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.duplicatedgenerator;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * Here to test duplicate import
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "tbl_flight")
+public class Flight {
+	@Id
+	public String id;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/duplicatedgenerator/orm.xml
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/duplicatedgenerator/orm.xml	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/duplicatedgenerator/orm.xml	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
+                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                 version="1.0"
+        >
+    <table-generator name="EMP_GEN" table="GENERATOR_TABLE"
+                     pk-column-name="pkey" pk-column-value="EMP"
+                     value-column-name="hi" allocation-size="20"/>
+</entity-mappings>
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Address.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Address.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Address.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,20 @@
+//$Id: Address.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.embedded;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class Address implements Serializable {
+	String address1;
+	@Column(name = "fld_city")
+	String city;
+	Country country;
+	@ManyToOne
+	AddressType type;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/AddressType.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/AddressType.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/AddressType.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,35 @@
+//$Id: AddressType.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.embedded;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * Kind of address (home, professional etc)
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity()
+public class AddressType {
+	private Integer id;
+	private String name;
+
+	@Id
+	@GeneratedValue
+	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;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Book.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Book.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Book.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,49 @@
+//$Id: Book.java 15073 2008-08-14 17:32:44Z epbernard $
+package org.hibernate.test.annotations.embedded;
+
+import javax.persistence.AttributeOverride;
+import javax.persistence.AttributeOverrides;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.SecondaryTable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at SecondaryTable(name = "BookSummary")
+public class Book {
+	private String isbn;
+	private String name;
+	private Summary summary;
+
+	@Id
+	public String getIsbn() {
+		return isbn;
+	}
+
+	public void setIsbn(String isbn) {
+		this.isbn = isbn;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	@AttributeOverrides({
+	@AttributeOverride(name = "size", column = @Column(name="summ_size", table = "BookSummary")),
+	@AttributeOverride(name = "text", column = @Column(table = "BookSummary"))
+			})
+	public Summary getSummary() {
+		return summary;
+	}
+
+	public void setSummary(Summary summary) {
+		this.summary = summary;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/CorpType.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/CorpType.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/CorpType.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,33 @@
+//$Id: CorpType.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.embedded;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class CorpType {
+	private Integer id;
+	private String type;
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Country.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Country.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Country.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,39 @@
+//$Id: Country.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.embedded;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+
+import org.hibernate.annotations.AccessType;
+
+/**
+ * Non realistic embedded dependent object
+ *
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+//access = AccessType.PROPERTY)
+ at AccessType("property")
+public class Country implements Serializable {
+	private String iso2;
+	private String name;
+
+	public String getIso2() {
+		return iso2;
+	}
+
+	public void setIso2(String iso2) {
+		this.iso2 = iso2;
+	}
+
+	@Column(name = "countryName")
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Deal.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Deal.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Deal.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,40 @@
+//$Id: Deal.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.embedded;
+
+import javax.persistence.Embedded;
+import javax.persistence.Id;
+import javax.persistence.MappedSuperclass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MappedSuperclass
+public class Deal {
+	/**
+	 * Deal ID.
+	 */
+	private String id;
+
+	@Id
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	/**
+	 * Swap with the tenor.
+	 */
+	private Swap swap;
+
+	@Embedded
+	public Swap getSwap() {
+		return swap;
+	}
+
+	public void setSwap(Swap swap) {
+		this.swap = swap;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/EmbeddedTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/EmbeddedTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/EmbeddedTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,386 @@
+//$Id: EmbeddedTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.embedded;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Set;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.test.annotations.embedded.FloatLeg.RateIndex;
+import org.hibernate.test.annotations.embedded.Leg.Frequency;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class EmbeddedTest extends TestCase {
+
+	public void testSimple() throws Exception {
+		Session s;
+		Transaction tx;
+		Person p = new Person();
+		Address a = new Address();
+		Country c = new Country();
+		Country bornCountry = new Country();
+		c.setIso2( "DM" );
+		c.setName( "Matt Damon Land" );
+		bornCountry.setIso2( "US" );
+		bornCountry.setName( "United States of America" );
+
+		a.address1 = "colorado street";
+		a.city = "Springfield";
+		a.country = c;
+		p.address = a;
+		p.bornIn = bornCountry;
+		p.name = "Homer";
+		s = openSession();
+		tx = s.beginTransaction();
+		s.persist( p );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		p = (Person) s.get( Person.class, p.id );
+		assertNotNull( p );
+		assertNotNull( p.address );
+		assertEquals( "Springfield", p.address.city );
+		assertNotNull( p.address.country );
+		assertEquals( "DM", p.address.country.getIso2() );
+		assertNotNull( p.bornIn );
+		assertEquals( "US", p.bornIn.getIso2() );
+		tx.commit();
+		s.close();
+	}
+
+	public void testCompositeId() throws Exception {
+		Session s;
+		Transaction tx;
+		RegionalArticlePk pk = new RegionalArticlePk();
+		pk.iso2 = "FR";
+		pk.localUniqueKey = "1234567890123";
+		RegionalArticle reg = new RegionalArticle();
+		reg.setName( "Je ne veux pes rester sage - Dolly" );
+		reg.setPk( pk );
+		s = openSession();
+		tx = s.beginTransaction();
+		s.persist( reg );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		reg = (RegionalArticle) s.get( RegionalArticle.class, (Serializable) reg.getPk() );
+		assertNotNull( reg );
+		assertNotNull( reg.getPk() );
+		assertEquals( "Je ne veux pes rester sage - Dolly", reg.getName() );
+		assertEquals( "FR", reg.getPk().iso2 );
+		tx.commit();
+		s.close();
+	}
+
+	public void testManyToOneInsideComponent() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Person p = new Person();
+		Country bornIn = new Country();
+		bornIn.setIso2( "FR" );
+		bornIn.setName( "France" );
+		p.bornIn = bornIn;
+		p.name = "Emmanuel";
+		AddressType type = new AddressType();
+		type.setName( "Primary Home" );
+		s.persist( type );
+		Country currentCountry = new Country();
+		currentCountry.setIso2( "US" );
+		currentCountry.setName( "USA" );
+		Address add = new Address();
+		add.address1 = "4 square street";
+		add.city = "San diego";
+		add.country = currentCountry;
+		add.type = type;
+		p.address = add;
+		s.persist( p );
+		tx.commit();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		Query q = s.createQuery( "select p from Person p where p.address.city = :city" );
+		q.setString( "city", add.city );
+		List result = q.list();
+		Person samePerson = (Person) result.get( 0 );
+		assertNotNull( samePerson.address.type );
+		assertEquals( type.getName(), samePerson.address.type.getName() );
+		tx.commit();
+		s.close();
+	}
+
+	public void testEmbeddedSuperclass() {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		VanillaSwap swap = new VanillaSwap();
+		swap.setInstrumentId( "US345421" );
+		swap.setCurrency( VanillaSwap.Currency.EUR );
+		FixedLeg fixed = new FixedLeg();
+		fixed.setPaymentFrequency( Leg.Frequency.SEMIANNUALLY );
+		fixed.setRate( 5.6 );
+		FloatLeg floating = new FloatLeg();
+		floating.setPaymentFrequency( Leg.Frequency.QUARTERLY );
+		floating.setRateIndex( FloatLeg.RateIndex.LIBOR );
+		floating.setRateSpread( 1.1 );
+		swap.setFixedLeg( fixed );
+		swap.setFloatLeg( floating );
+		s.persist( swap );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		swap = (VanillaSwap) s.get( VanillaSwap.class, swap.getInstrumentId() );
+		// All fields must be filled with non-default values
+		fixed = swap.getFixedLeg();
+		assertNotNull( "Fixed leg retrieved as null", fixed );
+		floating = swap.getFloatLeg();
+		assertNotNull( "Floating leg retrieved as null", floating );
+		assertEquals( Leg.Frequency.SEMIANNUALLY, fixed.getPaymentFrequency() );
+		assertEquals( Leg.Frequency.QUARTERLY, floating.getPaymentFrequency() );
+		s.delete( swap );
+		tx.commit();
+		s.close();
+	}
+
+	public void testDottedProperty() {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		// Create short swap
+		Swap shortSwap = new Swap();
+		shortSwap.setTenor( 2 );
+		FixedLeg shortFixed = new FixedLeg();
+		shortFixed.setPaymentFrequency( Frequency.SEMIANNUALLY );
+		shortFixed.setRate( 5.6 );
+		FloatLeg shortFloating = new FloatLeg();
+		shortFloating.setPaymentFrequency( Frequency.QUARTERLY );
+		shortFloating.setRateIndex( RateIndex.LIBOR );
+		shortFloating.setRateSpread( 1.1 );
+		shortSwap.setFixedLeg( shortFixed );
+		shortSwap.setFloatLeg( shortFloating );
+		// Create medium swap
+		Swap swap = new Swap();
+		swap.setTenor( 7 );
+		FixedLeg fixed = new FixedLeg();
+		fixed.setPaymentFrequency( Frequency.MONTHLY );
+		fixed.setRate( 7.6 );
+		FloatLeg floating = new FloatLeg();
+		floating.setPaymentFrequency( Frequency.MONTHLY );
+		floating.setRateIndex( RateIndex.TIBOR );
+		floating.setRateSpread( 0.8 );
+		swap.setFixedLeg( fixed );
+		swap.setFloatLeg( floating );
+		// Create long swap
+		Swap longSwap = new Swap();
+		longSwap.setTenor( 7 );
+		FixedLeg longFixed = new FixedLeg();
+		longFixed.setPaymentFrequency( Frequency.MONTHLY );
+		longFixed.setRate( 7.6 );
+		FloatLeg longFloating = new FloatLeg();
+		longFloating.setPaymentFrequency( Frequency.MONTHLY );
+		longFloating.setRateIndex( RateIndex.TIBOR );
+		longFloating.setRateSpread( 0.8 );
+		longSwap.setFixedLeg( longFixed );
+		longSwap.setFloatLeg( longFloating );
+		// Compose a curve spread deal
+		SpreadDeal deal = new SpreadDeal();
+		deal.setId( "FX45632" );
+		deal.setNotional( 450000.0 );
+		deal.setShortSwap( shortSwap );
+		deal.setSwap( swap );
+		deal.setLongSwap( longSwap );
+		s.persist( deal );
+
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		deal = (SpreadDeal) s.get( SpreadDeal.class, deal.getId() );
+		// All fields must be filled with non-default values
+		assertNotNull( "Short swap is null.", deal.getShortSwap() );
+		assertNotNull( "Swap is null.", deal.getSwap() );
+		assertNotNull( "Long swap is null.", deal.getLongSwap() );
+		assertEquals( 2, deal.getShortSwap().getTenor() );
+		assertEquals( 7, deal.getSwap().getTenor() );
+		assertEquals( 7, deal.getLongSwap().getTenor() );
+		assertNotNull( "Short fixed leg is null.", deal.getShortSwap().getFixedLeg() );
+		assertNotNull( "Short floating leg is null.", deal.getShortSwap().getFloatLeg() );
+		assertNotNull( "Fixed leg is null.", deal.getSwap().getFixedLeg() );
+		assertNotNull( "Floating leg is null.", deal.getSwap().getFloatLeg() );
+		assertNotNull( "Long fixed leg is null.", deal.getLongSwap().getFixedLeg() );
+		assertNotNull( "Long floating leg is null.", deal.getLongSwap().getFloatLeg() );
+		assertEquals( Frequency.SEMIANNUALLY, deal.getShortSwap().getFixedLeg().getPaymentFrequency() );
+		assertEquals( Frequency.QUARTERLY, deal.getShortSwap().getFloatLeg().getPaymentFrequency() );
+		assertEquals( Frequency.MONTHLY, deal.getSwap().getFixedLeg().getPaymentFrequency() );
+		assertEquals( Frequency.MONTHLY, deal.getSwap().getFloatLeg().getPaymentFrequency() );
+		assertEquals( Frequency.MONTHLY, deal.getLongSwap().getFixedLeg().getPaymentFrequency() );
+		assertEquals( Frequency.MONTHLY, deal.getLongSwap().getFloatLeg().getPaymentFrequency() );
+		assertEquals( 5.6, deal.getShortSwap().getFixedLeg().getRate() );
+		assertEquals( 7.6, deal.getSwap().getFixedLeg().getRate() );
+		assertEquals( 7.6, deal.getLongSwap().getFixedLeg().getRate() );
+		assertEquals( RateIndex.LIBOR, deal.getShortSwap().getFloatLeg().getRateIndex() );
+		assertEquals( RateIndex.TIBOR, deal.getSwap().getFloatLeg().getRateIndex() );
+		assertEquals( RateIndex.TIBOR, deal.getLongSwap().getFloatLeg().getRateIndex() );
+		assertEquals( 1.1, deal.getShortSwap().getFloatLeg().getRateSpread() );
+		assertEquals( 0.8, deal.getSwap().getFloatLeg().getRateSpread() );
+		assertEquals( 0.8, deal.getLongSwap().getFloatLeg().getRateSpread() );
+		s.delete( deal );
+		tx.commit();
+		s.close();
+	}
+
+	public void testEmbeddedInSecdondaryTable() throws Exception {
+		Session s;
+		s = openSession();
+		s.getTransaction().begin();
+		Book book = new Book();
+		book.setIsbn( "1234" );
+		book.setName( "HiA Second Edition" );
+		Summary summary = new Summary();
+		summary.setText( "This is a HiA SE summary" );
+		summary.setSize( summary.getText().length() );
+		book.setSummary( summary );
+		s.persist( book );
+		s.getTransaction().commit();
+
+		s.clear();
+
+		Transaction tx = s.beginTransaction();
+		Book loadedBook = (Book) s.get( Book.class, book.getIsbn() );
+		assertNotNull( loadedBook.getSummary() );
+		assertEquals( book.getSummary().getText(), loadedBook.getSummary().getText() );
+		s.delete( loadedBook );
+		tx.commit();
+		s.close();
+	}
+
+	public void testParent() throws Exception {
+		Session s;
+		s = openSession();
+		s.getTransaction().begin();
+		Book book = new Book();
+		book.setIsbn( "1234" );
+		book.setName( "HiA Second Edition" );
+		Summary summary = new Summary();
+		summary.setText( "This is a HiA SE summary" );
+		summary.setSize( summary.getText().length() );
+		book.setSummary( summary );
+		s.persist( book );
+		s.getTransaction().commit();
+
+		s.clear();
+
+		Transaction tx = s.beginTransaction();
+		Book loadedBook = (Book) s.get( Book.class, book.getIsbn() );
+		assertNotNull( loadedBook.getSummary() );
+		assertEquals( loadedBook, loadedBook.getSummary().getSummarizedBook() );
+		s.delete( loadedBook );
+		tx.commit();
+		s.close();
+	}
+
+	public void testEmbeddedAndMultipleManyToOne() throws Exception {
+		Session s;
+		s = openSession();
+		Transaction tx = s.beginTransaction();
+		CorpType type = new CorpType();
+		type.setType( "National" );
+		s.persist( type );
+		Nationality nat = new Nationality();
+		nat.setName( "Canadian" );
+		s.persist( nat );
+		InternetProvider provider = new InternetProvider();
+		provider.setBrandName( "Fido" );
+		LegalStructure structure = new LegalStructure();
+		structure.setCorporationType( type );
+		structure.setCountry( "Canada" );
+		structure.setName( "Rogers" );
+		provider.setOwner( structure );
+		structure.setOrigin( nat );
+		s.persist( provider );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		provider = (InternetProvider) s.get( InternetProvider.class, provider.getId() );
+		assertNotNull( provider.getOwner() );
+		assertNotNull( "Many to one not set", provider.getOwner().getCorporationType() );
+		assertEquals( "Wrong link", type.getType(), provider.getOwner().getCorporationType().getType() );
+		assertNotNull( "2nd Many to one not set", provider.getOwner().getOrigin() );
+		assertEquals( "Wrong 2nd link", nat.getName(), provider.getOwner().getOrigin().getName() );
+		s.delete( provider );
+		s.delete( provider.getOwner().getCorporationType() );
+		s.delete( provider.getOwner().getOrigin() );
+		tx.commit();
+		s.close();
+	}
+
+	public void testEmbeddedAndOneToMany() throws Exception {
+		Session s;
+		s = openSession();
+		Transaction tx = s.beginTransaction();
+		InternetProvider provider = new InternetProvider();
+		provider.setBrandName( "Fido" );
+		LegalStructure structure = new LegalStructure();
+		structure.setCountry( "Canada" );
+		structure.setName( "Rogers" );
+		provider.setOwner( structure );
+		s.persist( provider );
+		Manager manager = new Manager();
+		manager.setName( "Bill" );
+		manager.setEmployer( provider );
+		structure.getTopManagement().add( manager );
+		s.persist( manager );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		provider = (InternetProvider) s.get( InternetProvider.class, provider.getId() );
+		assertNotNull( provider.getOwner() );
+		Set<Manager> topManagement = provider.getOwner().getTopManagement();
+		assertNotNull( "OneToMany not set", topManagement );
+		assertEquals( "Wrong number of elements", 1, topManagement.size() );
+		manager = (Manager) topManagement.iterator().next();
+		assertEquals( "Wrong element", "Bill", manager.getName() );
+		s.delete( manager );
+		s.delete( provider );
+		tx.commit();
+		s.close();
+	}
+
+	public EmbeddedTest(String x) {
+		super( x );
+	}
+
+	protected Class[] getMappings() {
+		return new Class[]{
+				Person.class,
+				RegionalArticle.class,
+				AddressType.class,
+				VanillaSwap.class,
+				SpreadDeal.class,
+				Book.class,
+				InternetProvider.class,
+				CorpType.class,
+				Nationality.class,
+				Manager.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/FixedLeg.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/FixedLeg.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/FixedLeg.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,31 @@
+package org.hibernate.test.annotations.embedded;
+
+import java.text.NumberFormat;
+import javax.persistence.Embeddable;
+
+/**
+ * Represents fixed part of Interest Rate Swap cash flows.
+ */
+ at Embeddable
+public class FixedLeg extends Leg {
+
+	/**
+	 * Fixed rate.
+	 */
+	private double rate;
+
+	public double getRate() {
+		return rate;
+	}
+
+	public void setRate(double rate) {
+		this.rate = rate;
+	}
+
+	public String toString() {
+		NumberFormat format = NumberFormat.getNumberInstance();
+		format.setMinimumFractionDigits( 4 );
+		format.setMaximumFractionDigits( 4 );
+		return format.format( getRate() ) + "%";
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/FloatLeg.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/FloatLeg.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/FloatLeg.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,49 @@
+package org.hibernate.test.annotations.embedded;
+
+import java.text.NumberFormat;
+import javax.persistence.Embeddable;
+
+/**
+ * Represents floating part of Interest Rate Swap cash flows.
+ */
+ at Embeddable
+public class FloatLeg extends Leg {
+
+	/**
+	 * Possible values for the rate index.
+	 */
+	public enum RateIndex {
+		LIBOR, EURIBOR, TIBOR}
+
+	;
+
+	private RateIndex rateIndex;
+
+	/**
+	 * Spread over the selected rate index (in basis points).
+	 */
+	private double rateSpread;
+
+	public RateIndex getRateIndex() {
+		return rateIndex;
+	}
+
+	public void setRateIndex(RateIndex rateIndex) {
+		this.rateIndex = rateIndex;
+	}
+
+	public double getRateSpread() {
+		return rateSpread;
+	}
+
+	public void setRateSpread(double rateSpread) {
+		this.rateSpread = rateSpread;
+	}
+
+	public String toString() {
+		NumberFormat format = NumberFormat.getNumberInstance();
+		format.setMinimumFractionDigits( 1 );
+		format.setMaximumFractionDigits( 1 );
+		return "[" + getRateIndex().toString() + "+" + format.format( getRateSpread() ) + "]";
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/InternetProvider.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/InternetProvider.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/InternetProvider.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,42 @@
+//$Id: InternetProvider.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.embedded;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class InternetProvider {
+	private Integer id;
+	private String brandName;
+	private LegalStructure owner;
+
+	public String getBrandName() {
+		return brandName;
+	}
+
+	public void setBrandName(String brandName) {
+		this.brandName = brandName;
+	}
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public LegalStructure getOwner() {
+		return owner;
+	}
+
+	public void setOwner(LegalStructure owner) {
+		this.owner = owner;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Leg.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Leg.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Leg.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,31 @@
+package org.hibernate.test.annotations.embedded;
+
+import javax.persistence.MappedSuperclass;
+
+/**
+ * Represents a leg of a vanilla interest rate swap.
+ */
+ at MappedSuperclass
+public class Leg {
+	/**
+	 * Possible values of the payment frequency field.
+	 */
+	public enum Frequency {
+		ANNUALY, SEMIANNUALLY, QUARTERLY, MONTHLY }
+
+	;
+
+	/**
+	 * Shows how frequent payments according to this leg should be made.
+	 */
+	private Frequency paymentFrequency;
+
+	public Frequency getPaymentFrequency() {
+		return paymentFrequency;
+	}
+
+	public void setPaymentFrequency(Frequency paymentFrequency) {
+		this.paymentFrequency = paymentFrequency;
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/LegalStructure.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/LegalStructure.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/LegalStructure.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,66 @@
+//$Id: LegalStructure.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.embedded;
+
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.Embeddable;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class LegalStructure {
+	private String name;
+	private String country;
+	private CorpType corporationType;
+	private Nationality origin;
+	private Set<Manager> topManagement = new HashSet<Manager>();
+
+	@ManyToOne
+	@JoinColumn(name = "CORP_ID")
+	public CorpType getCorporationType() {
+		return corporationType;
+	}
+
+	public void setCorporationType(CorpType corporationType) {
+		this.corporationType = corporationType;
+	}
+
+	public String getCountry() {
+		return country;
+	}
+
+	public void setCountry(String country) {
+		this.country = country;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	@ManyToOne
+	@JoinColumn(name = "origin_fk")
+	public Nationality getOrigin() {
+		return origin;
+	}
+
+	public void setOrigin(Nationality origin) {
+		this.origin = origin;
+	}
+
+	@OneToMany(mappedBy = "employer")
+	public Set<Manager> getTopManagement() {
+		return topManagement;
+	}
+
+	public void setTopManagement(Set<Manager> topManagement) {
+		this.topManagement = topManagement;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Manager.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Manager.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Manager.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,44 @@
+//$Id: Manager.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.embedded;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Manager {
+	private Integer id;
+	private String name;
+	private InternetProvider employer;
+
+	@ManyToOne
+	public InternetProvider getEmployer() {
+		return employer;
+	}
+
+	public void setEmployer(InternetProvider employer) {
+		this.employer = employer;
+	}
+
+	@Id
+	@GeneratedValue
+	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;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Nationality.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Nationality.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Nationality.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,33 @@
+//$Id: Nationality.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.embedded;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Nationality {
+	private Integer id;
+	private String name;
+
+	@Id
+	@GeneratedValue
+	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;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/NotonialDeal.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/NotonialDeal.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/NotonialDeal.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,30 @@
+//$Id: NotonialDeal.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.embedded;
+
+import javax.persistence.AttributeOverride;
+import javax.persistence.AttributeOverrides;
+import javax.persistence.Column;
+import javax.persistence.MappedSuperclass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at AttributeOverrides(value = {
+ at AttributeOverride(name = "swap.tenor", column = @Column(name = "TENOR")), //should be ovvriden by deal
+ at AttributeOverride(name = "id", column = @Column(name = "NOTONIALDEAL_ID"))
+		})
+ at MappedSuperclass
+public class NotonialDeal extends Deal {
+	/**
+	 * Notional amount of both IRSs.
+	 */
+	private double notional;
+
+	public double getNotional() {
+		return notional;
+	}
+
+	public void setNotional(double notional) {
+		this.notional = notional;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Person.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Person.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Person.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,35 @@
+//$Id: Person.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.embedded;
+
+import java.io.Serializable;
+import javax.persistence.AttributeOverride;
+import javax.persistence.AttributeOverrides;
+import javax.persistence.Column;
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "PersonEmbed")
+public class Person implements Serializable {
+	@Id
+	@GeneratedValue
+	Integer id;
+
+	String name;
+
+	@Embedded
+	Address address;
+
+	@Embedded
+	@AttributeOverrides({
+	@AttributeOverride(name = "iso2", column = @Column(name = "bornIso2")),
+	@AttributeOverride(name = "name", column = @Column(name = "bornCountryName"))
+			})
+	Country bornIn;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/RegionalArticle.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/RegionalArticle.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/RegionalArticle.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,50 @@
+//$Id: RegionalArticle.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.embedded;
+
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * A regional article is typically a bad design, it keep the country iso2 and a business key as
+ * (composite) primary key
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class RegionalArticle implements Serializable {
+	private RegionalArticlePk pk;
+	private String name;
+
+	@Id
+	public RegionalArticlePk getPk() {
+		return pk;
+	}
+
+	public void setPk(RegionalArticlePk pk) {
+		this.pk = pk;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public int hashCode() {
+		//a NPE can occurs, but I don't expect hashcode to be used before pk is set
+		return getPk().hashCode();
+	}
+
+	public boolean equals(Object obj) {
+		//a NPE can occurs, but I don't expect equals to be used before pk is set
+		if ( obj != null && obj instanceof RegionalArticle ) {
+			return getPk().equals( ( (RegionalArticle) obj ).getPk() );
+		}
+		else {
+			return false;
+		}
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/RegionalArticlePk.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/RegionalArticlePk.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/RegionalArticlePk.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,38 @@
+//$Id: RegionalArticlePk.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.embedded;
+
+import java.io.Serializable;
+import javax.persistence.Embeddable;
+
+import org.hibernate.annotations.AccessType;
+
+/**
+ * Regional article pk
+ *
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+ at AccessType("field")
+public class RegionalArticlePk implements Serializable {
+	/**
+	 * country iso2 code
+	 */
+	public String iso2;
+	public String localUniqueKey;
+
+	public int hashCode() {
+		//this implem sucks
+		return ( iso2 + localUniqueKey ).hashCode();
+	}
+
+	public boolean equals(Object obj) {
+		//iso2 and localUniqueKey are expected to be set in this implem
+		if ( obj != null && obj instanceof RegionalArticlePk ) {
+			RegionalArticlePk other = (RegionalArticlePk) obj;
+			return iso2.equals( other.iso2 ) && localUniqueKey.equals( other.localUniqueKey );
+		}
+		else {
+			return false;
+		}
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/SpreadDeal.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/SpreadDeal.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/SpreadDeal.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,62 @@
+package org.hibernate.test.annotations.embedded;
+
+import javax.persistence.AttributeOverride;
+import javax.persistence.AttributeOverrides;
+import javax.persistence.Column;
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+
+/**
+ * Represents a "curve spread" deal that consists of
+ * two Interest Rate Swaps with different tenors (short and long).
+ * For simplicity, tenors are not considered here.
+ */
+ at Entity
+ at AttributeOverrides(value = {
+ at AttributeOverride(name = "swap.tenor", column = @Column(name = "MEDIUM_TENOR")),
+ at AttributeOverride(name = "swap.fixedLeg.paymentFrequency", column = @Column(name = "MEDIUM_FIXED_FREQUENCY")),
+ at AttributeOverride(name = "swap.fixedLeg.rate", column = @Column(name = "MEDIUM_FIXED_RATE")),
+ at AttributeOverride(name = "swap.floatLeg.paymentFrequency", column = @Column(name = "MEDIUM_FLOAT_FREQUENCY")),
+ at AttributeOverride(name = "swap.floatLeg.rateIndex", column = @Column(name = "MEDIUM_FLOAT_RATEINDEX")),
+ at AttributeOverride(name = "swap.floatLeg.rateSpread", column = @Column(name = "MEDIUM_FLOAT_RATESPREAD"))
+		})
+public class SpreadDeal extends NotonialDeal {
+
+	/**
+	 * Swap with the tenor.
+	 */
+	private Swap longSwap;
+
+	@Embedded
+	public Swap getLongSwap() {
+		return longSwap;
+	}
+
+	public void setLongSwap(Swap swap) {
+		this.longSwap = swap;
+	}
+
+
+	/**
+	 * Swap with the longer tenor.
+	 */
+	private Swap shortSwap;
+
+
+	@Embedded
+	@AttributeOverrides(value = {
+	@AttributeOverride(name = "tenor", column = @Column(name = "SHORT_TENOR")),
+	@AttributeOverride(name = "fixedLeg.paymentFrequency", column = @Column(name = "SHORT_FIXED_FREQUENCY")),
+	@AttributeOverride(name = "fixedLeg.rate", column = @Column(name = "SHORT_FIXED_RATE")),
+	@AttributeOverride(name = "floatLeg.paymentFrequency", column = @Column(name = "SHORT_FLOAT_FREQUENCY")),
+	@AttributeOverride(name = "floatLeg.rateIndex", column = @Column(name = "SHORT_FLOAT_RATEINDEX")),
+	@AttributeOverride(name = "floatLeg.rateSpread", column = @Column(name = "SHORT_FLOAT_RATESPREAD"))
+			})
+	public Swap getShortSwap() {
+		return shortSwap;
+	}
+
+	public void setShortSwap(Swap shortSwap) {
+		this.shortSwap = shortSwap;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Summary.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Summary.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Summary.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,43 @@
+//$Id: Summary.java 15056 2008-08-13 18:15:05Z epbernard $
+package org.hibernate.test.annotations.embedded;
+
+import javax.persistence.Embeddable;
+import javax.persistence.Column;
+
+import org.hibernate.annotations.Parent;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class Summary {
+	private int size;
+	private String text;
+	private Book summarizedBook;
+
+	@Column(name="summary_size")
+	public int getSize() {
+		return size;
+	}
+
+	public void setSize(int size) {
+		this.size = size;
+	}
+
+	public String getText() {
+		return text;
+	}
+
+	public void setText(String text) {
+		this.text = text;
+	}
+
+	@Parent
+	public Book getSummarizedBook() {
+		return summarizedBook;
+	}
+
+	public void setSummarizedBook(Book summarizedBook) {
+		this.summarizedBook = summarizedBook;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Swap.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Swap.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/Swap.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,58 @@
+package org.hibernate.test.annotations.embedded;
+
+import javax.persistence.AttributeOverride;
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+import javax.persistence.Embedded;
+
+/**
+ * Interest Rate Swap with Tenor. Used here to compose
+ * a swap spread deal.
+ */
+ at Embeddable
+public class Swap {
+
+	/**
+	 * Tenor (duration) of the swap (in years).
+	 */
+	private int tenor;
+
+	public int getTenor() {
+		return tenor;
+	}
+
+	public void setTenor(int tenor) {
+		this.tenor = tenor;
+	}
+
+	/**
+	 * Fixed leg (cash flows with the fixed rate).
+	 */
+	private FixedLeg fixedLeg;
+
+	/**
+	 * Floating leg (cash flows bound to a financial index).
+	 */
+	private FloatLeg floatLeg;
+
+	@Embedded
+	// We retain this annotation to test the precedence of @AttributeOverride
+	// Outermost override annotation should win
+	@AttributeOverride(name = "paymentFrequency", column = @Column(name = "FIXED_FREQENCY"))
+	public FixedLeg getFixedLeg() {
+		return fixedLeg;
+	}
+
+	public void setFixedLeg(FixedLeg fixedLeg) {
+		this.fixedLeg = fixedLeg;
+	}
+
+	@Embedded
+	public FloatLeg getFloatLeg() {
+		return floatLeg;
+	}
+
+	public void setFloatLeg(FloatLeg floatLeg) {
+		this.floatLeg = floatLeg;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/VanillaSwap.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/VanillaSwap.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/embedded/VanillaSwap.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,77 @@
+package org.hibernate.test.annotations.embedded;
+
+import javax.persistence.AttributeOverride;
+import javax.persistence.Column;
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * Represents an Interest Rate Swap.
+ */
+ at Entity
+public class VanillaSwap {
+
+	/**
+	 * Possible values for the currency field.
+	 */
+	public enum Currency {
+		USD, GBP, EUR, JPY }
+
+	/**
+	 * Identifier of the Interest Rate Swap
+	 */
+	private String instrumentId;
+
+	/**
+	 * Currency of the swap (and of both legs).
+	 */
+	private Currency currency;
+
+	/**
+	 * Fixed leg (cash flows with the fixed rate).
+	 */
+	private FixedLeg fixedLeg;
+
+	/**
+	 * Floating leg (cash flows bound to a financial index).
+	 */
+	private FloatLeg floatLeg;
+
+	@Embedded
+	@AttributeOverride(name = "paymentFrequency", column = @Column(name = "FIXED_FREQENCY"))
+	public FixedLeg getFixedLeg() {
+		return fixedLeg;
+	}
+
+	public void setFixedLeg(FixedLeg fixedLeg) {
+		this.fixedLeg = fixedLeg;
+	}
+
+	@Embedded
+	@AttributeOverride(name = "paymentFrequency", column = @Column(name = "FLOAT_FREQUENCY"))
+	public FloatLeg getFloatLeg() {
+		return floatLeg;
+	}
+
+	public void setFloatLeg(FloatLeg floatLeg) {
+		this.floatLeg = floatLeg;
+	}
+
+	public Currency getCurrency() {
+		return currency;
+	}
+
+	public void setCurrency(Currency currency) {
+		this.currency = currency;
+	}
+
+	@Id
+	public String getInstrumentId() {
+		return instrumentId;
+	}
+
+	public void setInstrumentId(String instrumentId) {
+		this.instrumentId = instrumentId;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Address.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Address.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Address.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,47 @@
+//$Id: Address.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.entity;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * Has a serializable class as a property
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "serial_address")
+public class Address {
+	private Integer id;
+	private String city;
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getCity() {
+		return city;
+	}
+
+	public void setCity(String city) {
+		this.city = city;
+	}
+
+	public Country getCountry() {
+		return country;
+	}
+
+	public void setCountry(Country country) {
+		this.country = country;
+	}
+
+	private Country country;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/BasicHibernateAnnotationsTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/BasicHibernateAnnotationsTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/BasicHibernateAnnotationsTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,357 @@
+//$Id: BasicHibernateAnnotationsTest.java 17798 2009-10-19 15:48:57Z stliu $
+package org.hibernate.test.annotations.entity;
+
+import java.math.BigDecimal;
+import java.util.Currency;
+import java.util.Date;
+
+import org.hibernate.Hibernate;
+import org.hibernate.HibernateException;
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class BasicHibernateAnnotationsTest extends TestCase {
+
+	public void testEntity() throws Exception {
+		if( !getDialect().supportsExpectedLobUsagePattern() ){
+			return;
+		}
+		Forest forest = new Forest();
+		forest.setName( "Fontainebleau" );
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		s.persist( forest );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		forest = (Forest) s.get( Forest.class, forest.getId() );
+		assertNotNull( forest );
+		forest.setName( "Fontainebleau" );
+		//should not execute SQL update
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		forest = (Forest) s.get( Forest.class, forest.getId() );
+		assertNotNull( forest );
+		forest.setLength( 23 );
+		//should execute dynamic SQL update
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.delete( s.get( Forest.class, forest.getId() ) );
+		tx.commit();
+		s.close();
+	}
+
+	public void testVersioning() throws Exception {
+		if( !getDialect().supportsExpectedLobUsagePattern() ){
+			return;
+		}
+		Forest forest = new Forest();
+		forest.setName( "Fontainebleau" );
+		forest.setLength( 33 );
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		s.persist( forest );
+		tx.commit();
+		s.close();
+
+		Session parallelSession = openSession();
+		Transaction parallelTx = parallelSession.beginTransaction();
+		s = openSession();
+		tx = s.beginTransaction();
+
+		forest = (Forest) parallelSession.get( Forest.class, forest.getId() );
+		Forest reloadedForest = (Forest) s.get( Forest.class, forest.getId() );
+		reloadedForest.setLength( 11 );
+		assertNotSame( forest, reloadedForest );
+		tx.commit();
+		s.close();
+
+		forest.setLength( 22 );
+		try {
+			parallelTx.commit();
+			fail( "All optimistic locking should have make it fail" );
+		}
+		catch (HibernateException e) {
+			if ( parallelTx != null ) parallelTx.rollback();
+		}
+		finally {
+			parallelSession.close();
+		}
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.delete( s.get( Forest.class, forest.getId() ) );
+		tx.commit();
+		s.close();
+
+	}
+
+	public void testPolymorphism() throws Exception {
+		if( !getDialect().supportsExpectedLobUsagePattern() ){
+			return;
+		}
+		Forest forest = new Forest();
+		forest.setName( "Fontainebleau" );
+		forest.setLength( 33 );
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		s.persist( forest );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		Query query = s.createQuery( "from java.lang.Object" );
+		assertEquals( 0, query.list().size() );
+		query = s.createQuery( "from Forest" );
+		assertTrue( 0 < query.list().size() );
+		tx.commit();
+		s.close();
+	}
+
+	public void testType() throws Exception {
+		if( !getDialect().supportsExpectedLobUsagePattern() ){
+			return;
+		}
+		Forest f = new Forest();
+		f.setName( "Broceliande" );
+		String description = "C'est une enorme foret enchantee ou vivais Merlin et toute la clique";
+		f.setLongDescription( description );
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		s.persist( f );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		f = (Forest) s.get( Forest.class, f.getId() );
+		assertNotNull( f );
+		assertEquals( description, f.getLongDescription() );
+		s.delete( f );
+		tx.commit();
+		s.close();
+
+	}
+
+	public void testNonLazy() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Forest f = new Forest();
+		Tree t = new Tree();
+		t.setName( "Basic one" );
+		s.persist( f );
+		s.persist( t );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		f = (Forest) s.load( Forest.class, f.getId() );
+		t = (Tree) s.load( Tree.class, t.getId() );
+		assertFalse( "Default should be lazy", Hibernate.isInitialized( f ) );
+		assertTrue( "Tree is not lazy", Hibernate.isInitialized( t ) );
+		tx.commit();
+		s.close();
+	}
+
+	public void testCache() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		ZipCode zc = new ZipCode();
+		zc.code = "92400";
+		s.persist( zc );
+		tx.commit();
+		s.close();
+		getSessions().getStatistics().clear();
+		getSessions().getStatistics().setStatisticsEnabled( true );
+		getSessions().evict( ZipCode.class );
+		s = openSession();
+		tx = s.beginTransaction();
+		s.get( ZipCode.class, zc.code );
+		assertEquals( 1, getSessions().getStatistics().getSecondLevelCachePutCount() );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.get( ZipCode.class, zc.code );
+		assertEquals( 1, getSessions().getStatistics().getSecondLevelCacheHitCount() );
+		tx.commit();
+		s.close();
+	}
+
+	public void testFilter() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		s.createQuery( "delete Forest" ).executeUpdate();
+		Forest f1 = new Forest();
+		f1.setLength( 2 );
+		s.persist( f1 );
+		Forest f2 = new Forest();
+		f2.setLength( 20 );
+		s.persist( f2 );
+		Forest f3 = new Forest();
+		f3.setLength( 200 );
+		s.persist( f3 );
+		tx.commit();
+		s.close();
+		s = openSession();
+		tx = s.beginTransaction();
+		s.enableFilter( "betweenLength" ).setParameter( "minLength", 5 ).setParameter( "maxLength", 50 );
+		long count = ( (Long) s.createQuery( "select count(*) from Forest" ).iterate().next() ).intValue();
+		assertEquals( 1, count );
+		s.disableFilter( "betweenLength" );
+		s.enableFilter( "minLength" ).setParameter( "minLength", 5 );
+		count = ( (Long) s.createQuery( "select count(*) from Forest" ).iterate().next() ).longValue();
+		assertEquals( 2l, count );
+		s.disableFilter( "minLength" );
+		tx.rollback();
+		s.close();
+	}
+
+	public void testParameterizedType() throws Exception {
+		if( !getDialect().supportsExpectedLobUsagePattern() ){
+			return;
+		}
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Forest f = new Forest();
+		f.setSmallText( "ThisIsASmallText" );
+		f.setBigText( "ThisIsABigText" );
+		s.persist( f );
+		tx.commit();
+		s.close();
+		s = openSession();
+		tx = s.beginTransaction();
+		Forest f2 = (Forest) s.get( Forest.class, f.getId() );
+		assertEquals( f.getSmallText().toLowerCase(), f2.getSmallText() );
+		assertEquals( f.getBigText().toUpperCase(), f2.getBigText() );
+		tx.commit();
+		s.close();
+	}
+
+	public void testSerialized() throws Exception {
+		if( !getDialect().supportsExpectedLobUsagePattern() ){
+			return;
+		}
+		Forest forest = new Forest();
+		forest.setName( "Shire" );
+		Country country = new Country();
+		country.setName( "Middle Earth" );
+		forest.setCountry( country );
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		s.persist( forest );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		forest = (Forest) s.get( Forest.class, forest.getId() );
+		assertNotNull( forest );
+		assertNotNull( forest.getCountry() );
+		assertEquals( country.getName(), forest.getCountry().getName() );
+		tx.commit();
+		s.close();
+	}
+
+	public void testCompositeType() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Ransom r = new Ransom();
+		r.setKidnapperName( "Se7en" );
+		r.setDate( new Date() );
+		MonetaryAmount amount = new MonetaryAmount(
+				new BigDecimal( 100000 ),
+				Currency.getInstance( "EUR" )
+		);
+		r.setAmount( amount );
+		s.persist( r );
+		tx.commit();
+		s.clear();
+		tx = s.beginTransaction();
+		r = (Ransom) s.get( Ransom.class, r.getId() );
+		assertNotNull( r );
+		assertNotNull( r.getAmount() );
+		assertTrue( 0 == new BigDecimal( 100000 ).compareTo( r.getAmount().getAmount() ) );
+		assertEquals( Currency.getInstance( "EUR" ), r.getAmount().getCurrency() );
+		tx.commit();
+		s.close();
+	}
+
+	public void testFormula() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		org.hibernate.test.annotations.entity.Flight airFrance = new Flight();
+		airFrance.setId( new Long( 747 ) );
+		airFrance.setMaxAltitude( 10000 );
+		s.persist( airFrance );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		airFrance = (Flight) s.get( Flight.class, airFrance.getId() );
+		assertNotNull( airFrance );
+		assertEquals( 10000000, airFrance.getMaxAltitudeInMilimeter() );
+		s.delete( airFrance );
+		tx.commit();
+		s.close();
+	}
+
+	public BasicHibernateAnnotationsTest(String x) {
+		super( x );
+	}
+
+	protected Class[] getMappings() {
+		return new Class[]{
+				Forest.class,
+				Tree.class,
+				Ransom.class,
+				ZipCode.class,
+				Flight.class
+		};
+	}
+
+	protected String[] getAnnotatedPackages() {
+		return new String[]{
+				"org.hibernate.test.annotations.entity"
+		};
+	}
+
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Bid.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Bid.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Bid.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,63 @@
+//$Id: Bid.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.entity;
+
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Bid {
+	private Integer id;
+	private String description;
+	private Starred note;
+	private Starred editorsNote;
+	private Boolean approved;
+
+	@Enumerated(EnumType.STRING)
+	//@Column(columnDefinition = "VARCHAR(10)")
+	public Starred getEditorsNote() {
+		return editorsNote;
+	}
+
+	public void setEditorsNote(Starred editorsNote) {
+		this.editorsNote = editorsNote;
+	}
+
+	@Id
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getDescription() {
+		return description;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
+	public Starred getNote() {
+		return note;
+	}
+
+	public void setNote(Starred note) {
+		this.note = note;
+	}
+
+	public Boolean getApproved() {
+		return approved;
+	}
+
+	public void setApproved(Boolean approved) {
+		this.approved = approved;
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/CasterStringType.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/CasterStringType.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/CasterStringType.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,90 @@
+//$Id: CasterStringType.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.entity;
+
+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.hibernate.HibernateException;
+import org.hibernate.usertype.ParameterizedType;
+import org.hibernate.usertype.UserType;
+
+/**
+ * Sample of parameter type
+ *
+ * @author Emmanuel Bernard
+ */
+public class CasterStringType implements UserType, ParameterizedType {
+	private static final String CAST = "cast";
+	private Properties parameters;
+
+	public int[] sqlTypes() {
+		return new int[]{Types.VARCHAR};
+	}
+
+	public Class returnedClass() {
+		return String.class;
+	}
+
+	public boolean equals(Object x, Object y) throws HibernateException {
+		return ( x == y ) || ( x != null && 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 {
+		String result = rs.getString( names[0] );
+		if ( rs.wasNull() ) return null;
+		if ( parameters.getProperty( CAST ).equals( "lower" ) ) {
+			return result.toLowerCase();
+		}
+		else {
+			return result.toUpperCase();
+		}
+	}
+
+	public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
+		if ( value == null ) {
+			st.setNull( index, sqlTypes()[0] );
+		}
+		else {
+			String string = (String) value;
+			if ( parameters.getProperty( CAST ).equals( "lower" ) ) {
+				string = string.toLowerCase();
+			}
+			else {
+				string = string.toUpperCase();
+			}
+			st.setString( index, string );
+		}
+	}
+
+	public Object deepCopy(Object value) throws HibernateException {
+		return value;
+	}
+
+	public boolean isMutable() {
+		return false;
+	}
+
+	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 void setParameterValues(Properties parameters) {
+		this.parameters = parameters;
+	}
+}
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/CommunityBid.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/CommunityBid.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/CommunityBid.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,21 @@
+//$Id: CommunityBid.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.entity;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class CommunityBid extends Bid {
+	private Starred communityNote;
+
+	public Starred getCommunityNote() {
+		return communityNote;
+	}
+
+	public void setCommunityNote(Starred communityNote) {
+		this.communityNote = communityNote;
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Country.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Country.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Country.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,21 @@
+//$Id: Country.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.entity;
+
+import java.io.Serializable;
+
+/**
+ * Serializable object to be serialized in DB as is
+ *
+ * @author Emmanuel Bernard
+ */
+public class Country implements Serializable {
+	private String name;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Flight.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Flight.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Flight.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,49 @@
+//$Id: Flight.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.entity;
+
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.Table;
+
+import org.hibernate.annotations.Formula;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity()
+ at Table(name = "Formula_flight")
+ at Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+public class Flight implements Serializable {
+	Long id;
+	long maxAltitudeInMilimeter;
+	long maxAltitude;
+
+	@Id
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long long1) {
+		id = long1;
+	}
+
+	public long getMaxAltitude() {
+		return maxAltitude;
+	}
+
+	public void setMaxAltitude(long maxAltitude) {
+		this.maxAltitude = maxAltitude;
+	}
+
+	@Formula("maxAltitude * 1000")
+	public long getMaxAltitudeInMilimeter() {
+		return maxAltitudeInMilimeter;
+	}
+
+	public void setMaxAltitudeInMilimeter(long maxAltitudeInMilimeter) {
+		this.maxAltitudeInMilimeter = maxAltitudeInMilimeter;
+	}
+}
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Forest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Forest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Forest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,113 @@
+//$Id: Forest.java 17791 2009-10-19 13:16:08Z stliu $
+package org.hibernate.test.annotations.entity;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Lob;
+
+import org.hibernate.annotations.BatchSize;
+import org.hibernate.annotations.Filter;
+import org.hibernate.annotations.FilterDef;
+import org.hibernate.annotations.Filters;
+import org.hibernate.annotations.Index;
+import org.hibernate.annotations.OptimisticLock;
+import org.hibernate.annotations.OptimisticLockType;
+import org.hibernate.annotations.ParamDef;
+import org.hibernate.annotations.Parameter;
+import org.hibernate.annotations.PolymorphismType;
+import org.hibernate.annotations.Type;
+import org.hibernate.annotations.Where;
+
+/**
+ * Use hibernate specific annotations
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at BatchSize(size = 5)
+ at org.hibernate.annotations.Entity(
+		selectBeforeUpdate = true,
+		dynamicInsert = true, dynamicUpdate = true,
+		optimisticLock = OptimisticLockType.ALL,
+		polymorphism = PolymorphismType.EXPLICIT)
+ at Where(clause = "1=1")
+ at FilterDef(name = "minLength", parameters = {@ParamDef(name = "minLength", type = "integer")})
+ at Filters({
+ at Filter(name = "betweenLength"),
+ at Filter(name = "minLength", condition = ":minLength <= length")
+		})
+ at org.hibernate.annotations.Table(appliesTo = "Forest",
+		indexes = {@Index(name = "idx", columnNames = {"name", "length"})})
+public class Forest {
+	private Integer id;
+	private String name;
+	private long length;
+	private String longDescription;
+	private String smallText;
+	private String bigText;
+	private Country country;
+	
+	@OptimisticLock(excluded=true) 
+	@Type(type = "text")
+	public String getLongDescription() {
+		return longDescription;
+	}
+
+	public void setLongDescription(String longDescription) {
+		this.longDescription = longDescription;
+	}
+
+	public long getLength() {
+		return length;
+	}
+
+	public void setLength(long length) {
+		this.length = length;
+	}
+
+	@Id
+	@GeneratedValue
+	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;
+	}
+
+	@Type(type = "caster")
+	public String getSmallText() {
+		return smallText;
+	}
+
+	@Type(type = "caster", parameters = {@Parameter(name = "cast", value = "upper")})
+	public String getBigText() {
+		return bigText;
+	}
+
+	public void setSmallText(String smallText) {
+		this.smallText = smallText;
+	}
+
+	public void setBigText(String bigText) {
+		this.bigText = bigText;
+	}
+
+	@Lob
+	public Country getCountry() {
+		return country;
+	}
+
+	public void setCountry(Country country) {
+		this.country = country;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Java5FeaturesTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Java5FeaturesTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Java5FeaturesTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,125 @@
+//$Id: Java5FeaturesTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.entity;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Java5FeaturesTest extends TestCase {
+	public void testInterface() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Race r = new Race();
+		r.setId( new Integer( 1 ) );
+		r.setLength( new Long( 3 ) );
+		s.persist( r );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		r = (Race) s.get( Race.class, r.getId() );
+		assertEquals( new Long( 3 ), r.getLength() );
+		tx.commit();
+		s.close();
+
+	}
+
+	public void testEnums() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		CommunityBid communityBid = new CommunityBid();
+		communityBid.setId( new Integer( 2 ) );
+		communityBid.setCommunityNote( Starred.OK );
+		Bid bid = new Bid();
+		bid.setId( new Integer( 1 ) );
+		bid.setDescription( "My best one" );
+		bid.setNote( Starred.OK );
+		bid.setEditorsNote( Starred.GOOD );
+		s.persist( bid );
+		s.persist( communityBid );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		//bid = (Bid) s.get( Bid.class, bid.getId() );
+		bid = (Bid)s.createQuery( "select b from Bid b where b.note = " +
+				Starred.class.getName() + ".OK and b.editorsNote = " +
+				Starred.class.getName() + ".GOOD and b.id = :id")
+				.setParameter( "id", bid.getId() ).uniqueResult();
+		//testing constant value
+		assertEquals( Starred.OK, bid.getNote() );
+		assertEquals( Starred.GOOD, bid.getEditorsNote() );
+		bid = (Bid)s.createQuery( "select b from Bid b where b.note = :note" +
+				 " and b.editorsNote = :editorNote " +
+				" and b.id = :id")
+				.setParameter( "id", bid.getId() )
+				.setParameter( "note", Starred.OK )
+				.setParameter( "editorNote", Starred.GOOD )
+				.uniqueResult();
+		//testing constant value
+		assertEquals( Starred.OK, bid.getNote() );
+		assertEquals( Starred.GOOD, bid.getEditorsNote() );
+		bid.setNote( null );
+		tx.commit();
+		s.clear();
+		tx = s.beginTransaction();
+		bid = (Bid) s.get( Bid.class, bid.getId() );
+		communityBid = (CommunityBid) s.get( CommunityBid.class, communityBid.getId() );
+		assertNull( bid.getNote() );
+		assertEquals( Starred.OK, communityBid.getCommunityNote() );
+		s.delete( bid );
+		s.clear();
+		communityBid = (CommunityBid) s.createSQLQuery( "select {b.*} from Bid b where b.id = ?" )
+				.addEntity( "b", CommunityBid.class )
+				.setInteger( 0, communityBid.getId() ).uniqueResult();
+		assertEquals( Starred.OK, communityBid.getCommunityNote() );
+		s.delete( communityBid );
+		tx.commit();
+		s.close();
+	}
+
+	public void testAutoboxing() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Bid bid = new Bid();
+		bid.setId( new Integer( 2 ) );
+		bid.setDescription( "My best one" );
+		bid.setNote( Starred.OK );
+		bid.setEditorsNote( Starred.GOOD );
+		bid.setApproved( null );
+		s.persist( bid );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		bid = (Bid) s.get( Bid.class, bid.getId() );
+		assertEquals( null, bid.getApproved() );
+		s.delete( bid );
+		tx.commit();
+		s.close();
+	}
+
+	public Java5FeaturesTest(String x) {
+		super( x );
+	}
+
+	protected Class[] getMappings() {
+		return new Class[]{
+				Race.class,
+				Bid.class,
+				CommunityBid.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Length.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Length.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Length.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,9 @@
+//$Id: Length.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface Length<Type> {
+	Type getLength();
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/MonetaryAmount.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/MonetaryAmount.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/MonetaryAmount.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,36 @@
+//$Id: MonetaryAmount.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.entity;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Currency;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class MonetaryAmount implements Serializable {
+
+	private BigDecimal amount;
+	private Currency currency;
+
+	public MonetaryAmount(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;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/MonetaryAmountUserType.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/MonetaryAmountUserType.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/MonetaryAmountUserType.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,106 @@
+//$Id: MonetaryAmountUserType.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.entity;
+
+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 Emmanuel Bernard
+ */
+public class MonetaryAmountUserType 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 {
+		MonetaryAmount ma = (MonetaryAmount) component;
+		return property == 0 ? (Object) ma.getAmount() : (Object) ma.getCurrency();
+	}
+
+	public void setPropertyValue(Object component, int property, Object value)
+			throws HibernateException {
+		MonetaryAmount ma = (MonetaryAmount) component;
+		if ( property == 0 ) {
+			ma.setAmount( (BigDecimal) value );
+		}
+		else {
+			ma.setCurrency( (Currency) value );
+		}
+	}
+
+	public Class returnedClass() {
+		return MonetaryAmount.class;
+	}
+
+	public boolean equals(Object x, Object y) throws HibernateException {
+		if ( x == y ) return true;
+		if ( x == null || y == null ) return false;
+		MonetaryAmount mx = (MonetaryAmount) x;
+		MonetaryAmount my = (MonetaryAmount) y;
+		return mx.getAmount().equals( my.getAmount() ) &&
+				mx.getCurrency().equals( my.getCurrency() );
+	}
+
+	public int hashCode(Object x) throws HibernateException {
+		return ( (MonetaryAmount) 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 MonetaryAmount( amt, cur );
+	}
+
+	public void nullSafeSet(
+			PreparedStatement st, Object value, int index,
+			SessionImplementor session
+	) throws HibernateException, SQLException {
+		MonetaryAmount ma = (MonetaryAmount) 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 {
+		MonetaryAmount ma = (MonetaryAmount) value;
+		return new MonetaryAmount( 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
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/PropertyDefaultMappingsTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/PropertyDefaultMappingsTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/PropertyDefaultMappingsTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,62 @@
+//$Id: PropertyDefaultMappingsTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.entity;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class PropertyDefaultMappingsTest extends TestCase {
+	public PropertyDefaultMappingsTest(String x) {
+		super( x );
+	}
+
+	public void testSerializableObject() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Country c = new Country();
+		c.setName( "France" );
+		Address a = new Address();
+		a.setCity( "Paris" );
+		a.setCountry( c );
+		s.persist( a );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		Address reloadedAddress = (Address) s.get( Address.class, a.getId() );
+		assertNotNull( reloadedAddress );
+		assertNotNull( reloadedAddress.getCountry() );
+		assertEquals( a.getCountry().getName(), reloadedAddress.getCountry().getName() );
+		tx.rollback();
+		s.close();
+	}
+
+	public void testTransientField() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		WashingMachine wm = new WashingMachine();
+		wm.setActive( true );
+		s.persist( wm );
+		tx.commit();
+		s.clear();
+		tx = s.beginTransaction();
+		wm = (WashingMachine) s.get( WashingMachine.class, wm.getId() );
+		assertFalse( "transient should not be persistent", wm.isActive() );
+		s.delete( wm );
+		tx.commit();
+		s.close();
+	}
+
+	protected Class[] getMappings() {
+		return new Class[]{
+				Address.class,
+				WashingMachine.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Race.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Race.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Race.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,31 @@
+//$Id: Race.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.entity;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Race implements Length<Long> {
+	private Long length;
+	private Integer id;
+
+	@Id
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public Long getLength() {
+		return length;
+	}
+
+	public void setLength(Long length) {
+		this.length = length;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Ransom.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Ransom.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Ransom.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,61 @@
+//$Id: Ransom.java 15049 2008-08-13 15:32:32Z epbernard $
+package org.hibernate.test.annotations.entity;
+
+import java.util.Date;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+import org.hibernate.annotations.Columns;
+import org.hibernate.annotations.Type;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Ransom {
+	private Integer id;
+	private String kidnapperName;
+	private MonetaryAmount amount;
+	private Date date;
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getKidnapperName() {
+		return kidnapperName;
+	}
+
+	public void setKidnapperName(String kidnapperName) {
+		this.kidnapperName = kidnapperName;
+	}
+
+	@Type(type = "org.hibernate.test.annotations.entity.MonetaryAmountUserType")
+	@Columns(columns = {
+	@Column(name = "r_amount"),
+	@Column(name = "r_currency")
+			})
+	public MonetaryAmount getAmount() {
+		return amount;
+	}
+
+	public void setAmount(MonetaryAmount amount) {
+		this.amount = amount;
+	}
+	@Column(name="ransom_date")
+	public Date getDate() {
+		return date;
+	}
+
+	public void setDate(Date date) {
+		this.date = date;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Starred.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Starred.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Starred.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,10 @@
+package org.hibernate.test.annotations.entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public enum Starred {
+	BAD,
+	OK,
+	GOOD
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Tree.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Tree.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/Tree.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,38 @@
+//$Id: Tree.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.entity;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+import org.hibernate.annotations.Proxy;
+
+/**
+ * Non lazy entity
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Proxy(lazy = false)
+public class Tree {
+	private Integer id;
+	private String name;
+
+	@Id
+	@GeneratedValue
+	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;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/WashingMachine.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/WashingMachine.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/WashingMachine.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,33 @@
+//$Id: WashingMachine.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.entity;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class WashingMachine {
+	@Id
+	@GeneratedValue
+	private Integer id;
+	private transient boolean isActive;
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public boolean isActive() {
+		return isActive;
+	}
+
+	public void setActive(boolean active) {
+		isActive = active;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/ZipCode.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/ZipCode.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/ZipCode.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,19 @@
+//$Id: ZipCode.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.entity;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
+ at Entity
+ at org.hibernate.annotations.Entity(mutable = false)
+public class ZipCode {
+	@Id
+	public String code;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/package-info.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/package-info.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entity/package-info.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,34 @@
+/**
+ * Test package for metatata facilities
+ * It contains an example of filter metadata
+ */
+ at FilterDefs(
+		{
+		@FilterDef(
+				name = "betweenLength",
+				defaultCondition = ":minLength <= length and :maxLength >= length",
+				parameters = {
+				@ParamDef(name = "minLength", type = "integer"),
+				@ParamDef(name = "maxLength", type = "integer")
+						}
+		)
+				}
+)
+ at TypeDefs(
+		{
+		@TypeDef(
+				name = "caster",
+				typeClass = CasterStringType.class,
+				parameters = {
+				@Parameter(name = "cast", value = "lower")
+						}
+		)
+				}
+) package org.hibernate.test.annotations.entity;
+
+import org.hibernate.annotations.FilterDef;
+import org.hibernate.annotations.FilterDefs;
+import org.hibernate.annotations.ParamDef;
+import org.hibernate.annotations.Parameter;
+import org.hibernate.annotations.TypeDef;
+import org.hibernate.annotations.TypeDefs;

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entitynonentity/Cellular.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entitynonentity/Cellular.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entitynonentity/Cellular.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,9 @@
+//$Id: Cellular.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.entitynonentity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Cellular extends Phone {
+	String brand;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entitynonentity/Communication.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entitynonentity/Communication.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entitynonentity/Communication.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,9 @@
+//$Id: Communication.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.entitynonentity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Communication extends Interaction {
+	String species;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entitynonentity/EntityNonEntityTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entitynonentity/EntityNonEntityTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entitynonentity/EntityNonEntityTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,43 @@
+//$Id: EntityNonEntityTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.entitynonentity;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class EntityNonEntityTest extends TestCase {
+	public void testMix() throws Exception {
+		GSM gsm = new GSM();
+		gsm.brand = "Sony";
+		gsm.frequency = 900;
+		gsm.isNumeric = true;
+		gsm.number = 2;
+		gsm.species = "human";
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		s.persist( gsm );
+		tx.commit();
+		s.clear();
+		tx = s.beginTransaction();
+		gsm = (GSM) s.get( GSM.class, gsm.id );
+		assertEquals( "top mapped superclass", 2, gsm.number );
+		assertNull( "non entity between mapped superclass and entity", gsm.species );
+		assertTrue( "mapped superclass under entity", gsm.isNumeric );
+		assertNull( "non entity under entity", gsm.brand );
+		assertEquals( "leaf entity", 900, gsm.frequency );
+		s.delete( gsm );
+		tx.commit();
+		s.close();
+	}
+
+	protected Class[] getMappings() {
+		return new Class[]{
+				Phone.class,
+				Voice.class,
+				GSM.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entitynonentity/GSM.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entitynonentity/GSM.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entitynonentity/GSM.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,12 @@
+//$Id: GSM.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.entitynonentity;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class GSM extends Cellular {
+	int frequency;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entitynonentity/Interaction.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entitynonentity/Interaction.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entitynonentity/Interaction.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,14 @@
+//$Id: Interaction.java 15049 2008-08-13 15:32:32Z epbernard $
+package org.hibernate.test.annotations.entitynonentity;
+
+import javax.persistence.MappedSuperclass;
+import javax.persistence.Column;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MappedSuperclass
+public class Interaction {
+	@Column(name="int_nbr")
+	public int number;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entitynonentity/Phone.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entitynonentity/Phone.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entitynonentity/Phone.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,12 @@
+//$Id: Phone.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.entitynonentity;
+
+import javax.persistence.MappedSuperclass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MappedSuperclass
+public class Phone extends Voice {
+	boolean isNumeric;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entitynonentity/Voice.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entitynonentity/Voice.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/entitynonentity/Voice.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,19 @@
+//$Id: Voice.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.entitynonentity;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Inheritance(strategy = InheritanceType.JOINED)
+public class Voice extends Communication {
+	@Id
+	@GeneratedValue
+	public Integer id;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fetch/Branch.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fetch/Branch.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fetch/Branch.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,40 @@
+//$Id: Branch.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.fetch;
+
+import java.util.Set;
+import java.util.HashSet;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.OneToMany;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Branch {
+	@Id
+	@GeneratedValue
+	private Integer id;
+
+	@OneToMany(mappedBy = "branch", fetch = FetchType.EAGER )
+	private Set<Leaf> leaves = new HashSet<Leaf>();
+
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public Set<Leaf> getLeaves() {
+		return leaves;
+	}
+
+	public void setLeaves(Set<Leaf> leaves) {
+		this.leaves = leaves;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fetch/FetchingTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fetch/FetchingTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fetch/FetchingTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,125 @@
+//$Id: FetchingTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.fetch;
+
+import java.util.Date;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class FetchingTest extends TestCase {
+	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( "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 testExtraLazy() 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.getOrderedStay().add( stay );
+		s.persist( p );
+		tx.commit();
+		s.clear();
+		tx = s.beginTransaction();
+		p = (Person) s.createQuery( "from Person p where p.firstName = :name" )
+				.setParameter( "name", "Gavin" ).uniqueResult();
+		assertFalse( Hibernate.isInitialized( p.getOrderedStay() ) );
+		assertEquals( 1, p.getOrderedStay().size() );
+		assertFalse( Hibernate.isInitialized( p.getOrderedStay() ) );
+		assertEquals( "A380", p.getOrderedStay().get(0).getVessel() );
+		assertFalse( Hibernate.isInitialized( p.getOrderedStay() ) );
+		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( "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();
+	}
+
+	public void testOneToManyFetchEager() throws Exception {
+		Branch b = new Branch();
+		Session s = openSession( );
+		s.getTransaction().begin();
+		s.persist( b );
+		s.flush();
+		Leaf l = new Leaf();
+		l.setBranch( b );
+		s.persist( l );
+		s.flush();
+
+		s.clear();
+
+		s.createCriteria( Branch.class ).list();
+
+		s.getTransaction().rollback();
+		s.close();
+	}
+
+	public FetchingTest(String x) {
+		super( x );
+	}
+
+	protected Class[] getMappings() {
+		return new Class[]{
+				Person.class,
+				Stay.class,
+				Branch.class,
+				Leaf.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fetch/Leaf.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fetch/Leaf.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fetch/Leaf.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,37 @@
+//$Id: Leaf.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.fetch;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Leaf {
+	@Id
+	@GeneratedValue
+	private Integer id;
+
+	@ManyToOne
+	private Branch branch;
+
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public Branch getBranch() {
+		return branch;
+	}
+
+	public void setBranch(Branch branch) {
+		this.branch = branch;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fetch/Person.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fetch/Person.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fetch/Person.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,176 @@
+//$Id: Person.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.fetch;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+import org.hibernate.annotations.Fetch;
+import org.hibernate.annotations.FetchMode;
+import org.hibernate.annotations.LazyCollection;
+import org.hibernate.annotations.LazyCollectionOption;
+import org.hibernate.annotations.IndexColumn;
+
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "Person")
+public class Person implements Serializable {
+
+	// member declaration
+	private int id;
+	private String firstName;
+	private String lastName;
+	private String companyName;
+	private Collection<Stay> stays;
+	private Collection<Stay> oldStays;
+	private Collection<Stay> veryOldStays;
+	private List<Stay> orderedStay = new ArrayList<Stay>();
+
+	// constructors
+	public Person() {
+	}
+
+	public Person(String firstName, String lastName, String companyName) {
+		this.firstName = firstName;
+		this.lastName = lastName;
+		this.companyName = companyName;
+	}
+
+	// properties
+	public String getCompanyName() {
+		return companyName;
+	}
+
+	public void setCompanyName(String companyName) {
+		this.companyName = companyName;
+	}
+
+	public String getFirstName() {
+		return firstName;
+	}
+
+	public void setFirstName(String firstName) {
+		this.firstName = firstName;
+	}
+
+	@Id
+	@GeneratedValue
+	public int getId() {
+		return id;
+	}
+
+	public void setId(int id) {
+		this.id = id;
+	}
+
+	public String getLastName() {
+		return lastName;
+	}
+
+	public void setLastName(String lastName) {
+		this.lastName = lastName;
+	}
+
+	// relationships
+
+	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "person")
+	public Collection<Stay> getStays() {
+		return this.stays;
+	}
+
+	public void setStays(List<Stay> stays) {
+		this.stays = stays;
+	}
+
+	@OneToMany(cascade=CascadeType.ALL, mappedBy = "oldPerson")
+	@LazyCollection(LazyCollectionOption.EXTRA)
+	@Fetch(FetchMode.SUBSELECT)
+	public Collection<Stay> getOldStays() {
+		return oldStays;
+	}
+
+	public void setOldStays(Collection<Stay> oldStays) {
+		this.oldStays = oldStays;
+	}
+
+	@OneToMany(cascade=CascadeType.ALL, mappedBy = "veryOldPerson")
+	@Fetch(FetchMode.SELECT)
+	public Collection<Stay> getVeryOldStays() {
+		return veryOldStays;
+	}
+
+	public void setVeryOldStays(Collection<Stay> veryOldStays) {
+		this.veryOldStays = veryOldStays;
+	}
+
+	@OneToMany(cascade=CascadeType.ALL)
+	@LazyCollection(LazyCollectionOption.EXTRA)
+	@Fetch(FetchMode.SUBSELECT)
+	@IndexColumn(name="orderedStayIndex")
+	public List<Stay> getOrderedStay() {
+		return orderedStay;
+	}
+
+	public void setOrderedStay(List<Stay> orderedStay) {
+		this.orderedStay = orderedStay;
+	}
+
+
+	// 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<Stay> stays = getStays();
+		if ( stays == null ) {
+			stays = new ArrayList<Stay>();
+		}
+		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<Stay> stays = getOldStays();
+		if ( stays == null ) {
+			stays = new ArrayList<Stay>();
+		}
+		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<Stay> stays = getVeryOldStays();
+		if ( stays == null ) {
+			stays = new ArrayList<Stay>();
+		}
+		stays.add( stay );
+
+		this.veryOldStays = stays;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fetch/Stay.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fetch/Stay.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fetch/Stay.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,143 @@
+//$Id: Stay.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.fetch;
+
+import java.io.Serializable;
+import java.util.Date;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+import org.hibernate.annotations.LazyToOne;
+import org.hibernate.annotations.LazyToOneOption;
+import org.hibernate.annotations.Fetch;
+import org.hibernate.annotations.FetchMode;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "Stay")
+public class Stay implements Serializable {
+
+	// member declaration
+	private int 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(int id) {
+		this.id = id;
+	}
+
+	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;
+	}
+
+
+	// properties
+	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;
+	}
+
+	public Date getEndDate() {
+		return endDate;
+	}
+
+	public void setEndDate(Date endDate) {
+		this.endDate = endDate;
+	}
+
+	@Id
+	@GeneratedValue
+	public int getId() {
+		return id;
+	}
+
+	public void setId(int id) {
+		this.id = id;
+	}
+
+	@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+	@JoinColumn(name = "person")
+	public Person getPerson() {
+		return person;
+	}
+
+	public void setPerson(Person person) {
+		this.person = person;
+	}
+
+	@ManyToOne(cascade = CascadeType.ALL)
+	@LazyToOne(LazyToOneOption.PROXY)
+	@Fetch(FetchMode.SELECT)
+	@JoinColumn(name = "oldperson")
+	public Person getOldPerson() {
+		return oldPerson;
+	}
+
+	public void setOldPerson(Person oldPerson) {
+		this.oldPerson = oldPerson;
+	}
+
+	@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+	@LazyToOne(LazyToOneOption.PROXY)
+	@Fetch(FetchMode.JOIN)
+	@JoinColumn(name = "veryoldperson")
+	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 String getVessel() {
+		return vessel;
+	}
+
+	public void setVessel(String vessel) {
+		this.vessel = vessel;
+	}
+
+
+}
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/A.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/A.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/A.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,25 @@
+// $Id: A.java 14777 2008-06-18 17:47:30Z hardy.ferentschik $
+package org.hibernate.test.annotations.fkcircularity;
+
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+
+/**
+ * Test entities ANN-722.
+ * 
+ * @author Hardy Ferentschik
+ *
+ */
+ at Entity
+public class A {
+	private A_PK id;
+
+	@EmbeddedId
+	public A_PK getId() {
+		return id;
+	}
+
+	public void setId(A_PK id) {
+		this.id = id;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/A_PK.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/A_PK.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/A_PK.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,26 @@
+// $Id: A_PK.java 14777 2008-06-18 17:47:30Z hardy.ferentschik $
+package org.hibernate.test.annotations.fkcircularity;
+
+import java.io.Serializable;
+
+import javax.persistence.ManyToOne;
+
+/**
+ * Test entities ANN-722.
+ * 
+ * @author Hardy Ferentschik
+ *
+ */
+ at SuppressWarnings("serial")
+public class A_PK implements Serializable {
+	public D d;
+
+	@ManyToOne
+	public D getD() {
+		return d;
+	}
+
+	public void setD(D d) {
+		this.d = d;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/B.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/B.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/B.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,28 @@
+// $Id: B.java 14777 2008-06-18 17:47:30Z hardy.ferentschik $
+package org.hibernate.test.annotations.fkcircularity;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+
+/**
+ * Test entities ANN-722.
+ * 
+ * @author Hardy Ferentschik
+ *
+ */
+ at Entity
+ at Inheritance(strategy = InheritanceType.JOINED)
+public class B {
+	@Id
+	private int id;
+
+	public int getId() {
+		return id;
+	}
+
+	public void setId(int id) {
+		this.id = id;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/C.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/C.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/C.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,14 @@
+// $Id: C.java 14777 2008-06-18 17:47:30Z hardy.ferentschik $
+package org.hibernate.test.annotations.fkcircularity;
+
+import javax.persistence.Entity;
+
+/**
+ * Test entities ANN-722.
+ * 
+ * @author Hardy Ferentschik
+ *
+ */
+ at Entity
+public class C extends B {
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/ClassA.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/ClassA.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/ClassA.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,33 @@
+// $Id: ClassA.java 14777 2008-06-18 17:47:30Z hardy.ferentschik $
+package org.hibernate.test.annotations.fkcircularity;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.Table;
+
+/**
+ * Test entities ANN-730.
+ * 
+ * @author Hardy Ferentschik
+ * 
+ */
+ at Entity
+ at Table(name = "class_a")
+ at Inheritance(strategy = InheritanceType.JOINED)
+public class ClassA {
+
+	private int id;
+
+	@Id
+	@Column(name = "id")
+	public int getId() {
+		return id;
+	}
+
+	public void setId(int id) {
+		this.id = id;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/ClassB.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/ClassB.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/ClassB.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,18 @@
+// $Id: ClassB.java 14777 2008-06-18 17:47:30Z hardy.ferentschik $
+package org.hibernate.test.annotations.fkcircularity;
+
+import javax.persistence.Entity;
+import javax.persistence.PrimaryKeyJoinColumn;
+import javax.persistence.Table;
+
+/**
+ * Test entities ANN-730.
+ * 
+ * @author Hardy Ferentschik
+ * 
+ */
+ at Entity
+ at Table(name = "class_b")
+ at PrimaryKeyJoinColumn(name = "id", referencedColumnName = "id")
+public class ClassB extends ClassA {
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/ClassC.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/ClassC.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/ClassC.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,18 @@
+// $Id: ClassC.java 14777 2008-06-18 17:47:30Z hardy.ferentschik $
+package org.hibernate.test.annotations.fkcircularity;
+
+import javax.persistence.Entity;
+import javax.persistence.PrimaryKeyJoinColumn;
+import javax.persistence.Table;
+
+/**
+ * Test entities ANN-730.
+ * 
+ * @author Hardy Ferentschik
+ * 
+ */
+ at Entity
+ at Table(name = "class_c")
+ at PrimaryKeyJoinColumn(name = "id", referencedColumnName = "id")
+public class ClassC extends ClassB {
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/ClassD.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/ClassD.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/ClassD.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,18 @@
+// $Id: ClassD.java 14777 2008-06-18 17:47:30Z hardy.ferentschik $
+package org.hibernate.test.annotations.fkcircularity;
+
+import javax.persistence.Entity;
+import javax.persistence.PrimaryKeyJoinColumn;
+import javax.persistence.Table;
+
+/**
+ * Test entities ANN-730.
+ * 
+ * @author Hardy Ferentschik
+ *
+ */
+ at Entity
+ at Table(name = "class_1d")
+ at PrimaryKeyJoinColumn(name = "id", referencedColumnName = "id")
+public class ClassD extends ClassC {
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/D.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/D.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/D.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,25 @@
+// $Id: D.java 14777 2008-06-18 17:47:30Z hardy.ferentschik $
+package org.hibernate.test.annotations.fkcircularity;
+
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+
+/**
+ * Test entities ANN-722.
+ * 
+ * @author Hardy Ferentschik
+ *
+ */
+ at Entity
+public class D {
+	private D_PK id;
+
+	@EmbeddedId
+	public D_PK getId() {
+		return id;
+	}
+
+	public void setId(D_PK id) {
+		this.id = id;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/D_PK.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/D_PK.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/D_PK.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,26 @@
+// $Id: D_PK.java 14777 2008-06-18 17:47:30Z hardy.ferentschik $
+package org.hibernate.test.annotations.fkcircularity;
+
+import java.io.Serializable;
+
+import javax.persistence.ManyToOne;
+
+/**
+ * Test entities ANN-722.
+ * 
+ * @author Hardy Ferentschik
+ *
+ */
+ at SuppressWarnings("serial")
+public class D_PK implements Serializable{
+	private C c;
+	
+	@ManyToOne
+	public C getC() {
+		return c;
+	}
+
+	public void setC(C c) {
+		this.c = c;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/FkCircularityTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/FkCircularityTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/fkcircularity/FkCircularityTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,67 @@
+// $Id: FkCircularityTest.java 14777 2008-06-18 17:47:30Z hardy.ferentschik $
+package org.hibernate.test.annotations.fkcircularity;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+import junit.framework.TestCase;
+
+import org.hibernate.cfg.AnnotationConfiguration;
+import org.hibernate.dialect.HSQLDialect;
+import org.hibernate.dialect.SQLServerDialect;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Test case for ANN-722 and ANN-730.
+ * 
+ * @author Hardy Ferentschik
+ */
+public class FkCircularityTest extends TestCase {
+
+	private Logger log = LoggerFactory.getLogger(FkCircularityTest.class);
+
+	public void testJoinedSublcassesInPK() {
+		try {
+			AnnotationConfiguration config = new AnnotationConfiguration();
+			config.addAnnotatedClass(A.class);
+			config.addAnnotatedClass(B.class);
+			config.addAnnotatedClass(C.class);
+			config.addAnnotatedClass(D.class);
+			config.buildSessionFactory();
+			String[] schema = config
+					.generateSchemaCreationScript(new SQLServerDialect());
+			for (String s : schema) {
+				log.debug(s);
+			}
+			log.debug("success");
+		} catch (Exception e) {
+			StringWriter writer = new StringWriter();
+			e.printStackTrace(new PrintWriter(writer));
+			log.debug(writer.toString());
+			fail(e.getMessage());
+		}
+	}
+
+	public void testDeepJoinedSuclassesHierachy() {
+		try {
+			AnnotationConfiguration config = new AnnotationConfiguration();
+			config.addAnnotatedClass(ClassA.class);
+			config.addAnnotatedClass(ClassB.class);
+			config.addAnnotatedClass(ClassC.class);
+			config.addAnnotatedClass(ClassD.class);
+			config.buildSessionFactory();
+			String[] schema = config
+					.generateSchemaCreationScript(new HSQLDialect());
+			for (String s : schema) {
+				log.debug(s);
+			}
+			log.debug("success");
+		} catch (Exception e) {
+			StringWriter writer = new StringWriter();
+			e.printStackTrace(new PrintWriter(writer));
+			log.debug(writer.toString());
+			fail(e.getMessage());
+		}
+	}
+}
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/Classes.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/Classes.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/Classes.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,47 @@
+package org.hibernate.test.annotations.generics;
+
+/**
+ * A test case for ANN-494.
+ *
+ * @author Edward Costello
+ * @author Paolo Perrotta
+ */
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.Embeddable;
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+import org.hibernate.annotations.CollectionOfElements;
+
+public class Classes {
+
+	@Embeddable
+	public static class Edition<T> {
+		T name;
+	}
+	
+	@Entity
+	public static class Book {
+		@Id
+		@GeneratedValue(strategy=GenerationType.AUTO)
+		Long id;
+		
+		@Embedded
+		Edition<String> edition;
+	}
+	
+	@Entity
+	public static class PopularBook {
+		@Id
+		@GeneratedValue(strategy=GenerationType.AUTO)
+		Long id;
+		
+		@CollectionOfElements
+		Set<Edition<String>> editions = new HashSet<Edition<String>>();
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/DNA.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/DNA.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/DNA.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,25 @@
+//$Id: DNA.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.generics;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Paolo Perrotta
+ */
+ at Entity
+public class DNA {
+
+	private Integer id;
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/Dummy.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/Dummy.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/Dummy.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,36 @@
+//$
+package org.hibernate.test.annotations.generics;
+
+import javax.persistence.Transient;
+import javax.persistence.Id;
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Dummy<K> {
+
+	@Id
+	private Long id;
+
+	@Transient
+	transient private K dummyField;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public K getDummyField() {
+		return dummyField;
+	}
+
+	public void setDummyField(K dummyField) {
+		this.dummyField = dummyField;
+	}
+
+} 
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/EmbeddedGenericsTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/EmbeddedGenericsTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/EmbeddedGenericsTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,73 @@
+package org.hibernate.test.annotations.generics;
+
+/**
+ * A test case for ANN-494.
+ *
+ * @author Edward Costello
+ * @author Paolo Perrotta
+ */
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+public class EmbeddedGenericsTest extends TestCase {
+
+	Session session;
+	Classes.Edition<String> edition;
+
+	public void setUp() throws Exception {
+		super.setUp();
+		session = openSession();
+		session.getTransaction().begin();
+		edition = new Classes.Edition<String>();
+		edition.name = "Second";
+	}
+
+	public void testWorksWithGenericEmbedded() {
+		Classes.Book b = new Classes.Book();
+		b.edition = edition;
+		persist( b );
+		
+		Classes.Book retrieved = (Classes.Book)find( Classes.Book.class, b.id );
+		assertEquals( "Second", retrieved.edition.name );
+		
+		clean( Classes.Book.class, b.id );
+		session.close();
+	}
+
+	public void testWorksWithGenericCollectionOfElements() {
+		Classes.PopularBook b = new Classes.PopularBook();
+		b.editions.add( edition );
+		persist( b );
+
+		Classes.PopularBook retrieved = (Classes.PopularBook)find( Classes.PopularBook.class, b.id );
+		assertEquals( "Second", retrieved.editions.iterator().next().name );
+
+		clean( Classes.PopularBook.class, b.id );
+		session.close();
+	}
+
+	protected Class[] getMappings() {
+		return new Class[]{
+				Classes.Book.class,
+				Classes.PopularBook.class
+		};
+	}
+
+	private void persist(Object data) {
+		session.persist( data );
+		session.getTransaction().commit();
+		session.clear();
+	}
+	
+	private Object find(Class clazz, Long id) {
+		return session.get( clazz, id );
+	}
+
+	private void clean(Class<?> clazz, Long id) {
+		Transaction tx = session.beginTransaction();
+		session.delete( find( clazz, id ) );
+		tx.commit();
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/Gene.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/Gene.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/Gene.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,45 @@
+package org.hibernate.test.annotations.generics;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+
+import org.hibernate.annotations.Type;
+
+/**
+ * @author Paolo Perrotta
+ */
+ at Entity
+public class Gene<T, STE extends Enum> {
+
+	private Integer id;
+	private STE state;
+
+	@Type(type="org.hibernate.test.annotations.generics.StateType")
+	public STE getState() {
+		return state;
+	}
+
+	public void setState(STE state) {
+		this.state = state;
+	}
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	@ManyToOne(targetEntity = DNA.class)
+	public T getGeneticCode() {
+		return null;
+	}
+
+	public void setGeneticCode(T gene) {
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/GenericsTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/GenericsTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/GenericsTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,63 @@
+//$Id: GenericsTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.generics;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class GenericsTest extends TestCase {
+	public void testManyToOneGenerics() throws Exception {
+		Paper white = new Paper();
+		white.setName( "WhiteA4" );
+		PaperType type = new PaperType();
+		type.setName( "A4" );
+		SomeGuy me = new SomeGuy();
+		white.setType( type );
+		white.setOwner( me );
+		Price price = new Price();
+		price.setAmount( new Double( 1 ) );
+		price.setCurrency( "Euro" );
+		white.setValue( price );
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		s.persist( type );
+		s.persist( price );
+		s.persist( me );
+		s.persist( white );
+		tx.commit();
+		//s.close();
+		s = openSession();
+		tx = s.beginTransaction();
+		white = (Paper) s.get( Paper.class, white.getId() );
+		s.delete( white.getType() );
+		s.delete( white.getOwner() );
+		s.delete( white.getValue() );
+		s.delete( white );
+		tx.commit();
+		//s.close();
+	}
+
+	@Override
+	protected void configure(Configuration cfg) {
+		cfg.setProperty( Environment.AUTO_CLOSE_SESSION, "true" );
+		super.configure( cfg );
+	}
+
+	protected Class[] getMappings() {
+		return new Class[]{
+				Paper.class,
+				PaperType.class,
+				SomeGuy.class,
+				Price.class,
+				WildEntity.class,
+
+				//test at deployment only test unbound property when default field access is used
+				Dummy.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/Item.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/Item.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/Item.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,54 @@
+//$Id: Item.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.generics;
+
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+import javax.persistence.MappedSuperclass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MappedSuperclass
+public class Item<Type, Owner> extends PricedStuff {
+	private Integer id;
+	private String name;
+	private Type type;
+	private Owner owner;
+
+	@Id
+	@GeneratedValue
+	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;
+	}
+
+	@ManyToOne
+	public Type getType() {
+		return type;
+	}
+
+	public void setType(Type type) {
+		this.type = type;
+	}
+
+	@ManyToOne
+	public Owner getOwner() {
+		return owner;
+	}
+
+	public void setOwner(Owner owner) {
+		this.owner = owner;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/Paper.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/Paper.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/Paper.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,11 @@
+//$Id: Paper.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.generics;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Paper extends Item<PaperType, SomeGuy> {
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/PaperType.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/PaperType.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/PaperType.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,34 @@
+//$Id: PaperType.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.generics;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class PaperType {
+	private Integer id;
+	private String name;
+
+	@Id
+	@GeneratedValue
+	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;
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/Price.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/Price.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/Price.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,42 @@
+//$Id: Price.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.generics;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Price {
+	private Integer id;
+	private Double amount;
+	private String currency;
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public Double getAmount() {
+		return amount;
+	}
+
+	public void setAmount(Double amount) {
+		this.amount = amount;
+	}
+
+	public String getCurrency() {
+		return currency;
+	}
+
+	public void setCurrency(String currency) {
+		this.currency = currency;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/PricedStuff.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/PricedStuff.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/PricedStuff.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,11 @@
+//$Id: PricedStuff.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.generics;
+
+import javax.persistence.MappedSuperclass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MappedSuperclass
+public class PricedStuff extends Stuff<Price> {
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/SomeGuy.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/SomeGuy.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/SomeGuy.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,24 @@
+//$Id: SomeGuy.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.generics;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class SomeGuy {
+	private Integer id;
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/State.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/State.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/State.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,10 @@
+//$Id: State.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.generics;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public enum State {
+	ACTIVE,
+	DORMANT
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/StateType.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/StateType.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/StateType.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,69 @@
+//$Id: StateType.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.generics;
+
+import java.io.Serializable;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.PreparedStatement;
+import java.sql.Types;
+
+import org.hibernate.usertype.UserType;
+import org.hibernate.HibernateException;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class StateType implements UserType {
+	public int[] sqlTypes() {
+		return new int[] {
+			Types.INTEGER
+		};
+	}
+
+	public Class returnedClass() {
+		return State.class;
+	}
+
+	public boolean equals(Object x, Object y) throws HibernateException {
+		return x == y;
+	}
+
+	public int hashCode(Object x) throws HibernateException {
+		return x.hashCode();
+	}
+
+	public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
+		int result = rs.getInt( names[0] );
+		if ( rs.wasNull() ) return null;
+		return State.values()[result];
+	}
+
+	public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
+		if (value == null) {
+			st.setNull( index, Types.INTEGER );
+		}
+		else {
+			st.setInt( index, ( (State) value ).ordinal() );
+		}
+	}
+
+	public Object deepCopy(Object value) throws HibernateException {
+		return value;
+	}
+
+	public boolean isMutable() {
+		return false;
+	}
+
+	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;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/Stuff.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/Stuff.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/Stuff.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,22 @@
+//$Id: Stuff.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.generics;
+
+import javax.persistence.ManyToOne;
+import javax.persistence.MappedSuperclass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MappedSuperclass
+public class Stuff<Value> {
+	private Value value;
+
+	@ManyToOne
+	public Value getValue() {
+		return value;
+	}
+
+	public void setValue(Value value) {
+		this.value = value;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/UnresolvedTypeTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/UnresolvedTypeTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/UnresolvedTypeTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,43 @@
+package org.hibernate.test.annotations.generics;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Paolo Perrotta
+ */
+public class UnresolvedTypeTest extends TestCase {
+
+	public void testAcceptsUnresolvedPropertyTypesIfATargetEntityIsExplicitlySet() {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Gene item = new Gene();
+		s.persist( item );
+		s.flush();
+		tx.rollback();
+		s.close();
+	}
+
+	public void testAcceptsUnresolvedPropertyTypesIfATypeExplicitlySet() {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Gene item = new Gene();
+		item.setState( State.DORMANT );
+		s.persist( item );
+		s.flush();
+		s.clear();
+		item = (Gene) s.get( Gene.class, item.getId() );
+		assertEquals( State.DORMANT, item.getState() );
+		tx.rollback();
+		s.close();
+	}
+
+	@Override
+	protected Class[] getMappings() {
+		return new Class[]{
+				Gene.class,
+				DNA.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/WildEntity.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/WildEntity.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/generics/WildEntity.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,44 @@
+//$Id: WildEntity.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.generics;
+
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Transient;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class WildEntity implements Serializable {
+
+	private static final long serialVersionUID = -1171578628576139205L;
+
+	private int id;
+
+	private String property;
+
+	@Id
+	@GeneratedValue
+	public int getId() {
+		return id;
+	}
+
+	@Transient
+	public <T extends Object> T someMethod() {
+		return null;
+	}
+
+	public void setId(int id) {
+		this.id = id;
+	}
+
+	public String getProperty() {
+		return property;
+	}
+
+	public void setProperty(String property) {
+		this.property = property;
+	}
+}
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/Child.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/Child.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/Child.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,27 @@
+package org.hibernate.test.annotations.genericsinheritance;
+
+import javax.persistence.MappedSuperclass;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+
+ at MappedSuperclass
+public abstract class Child<P extends Parent> {
+
+	@Id Long id;
+	@ManyToOne P parent;
+	
+	public Long getId() {
+		return id;
+	}
+	public void setId(Long id) {
+		this.id = id;
+	}
+	public P getParent() {
+		return parent;
+	}
+	public void setParent(P parent) {
+		this.parent = parent;
+	}
+	
+	
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy1.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy1.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy1.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,8 @@
+package org.hibernate.test.annotations.genericsinheritance;
+
+import javax.persistence.Entity;
+
+ at Entity
+public class ChildHierarchy1 extends Child<ParentHierarchy1> {
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy2.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy2.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy2.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,8 @@
+package org.hibernate.test.annotations.genericsinheritance;
+
+import javax.persistence.MappedSuperclass;
+
+ at MappedSuperclass
+public class ChildHierarchy2<P extends ParentHierarchy2> extends Child<P> {
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy22.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy22.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy22.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,8 @@
+package org.hibernate.test.annotations.genericsinheritance;
+
+import javax.persistence.Entity;
+
+ at Entity
+public class ChildHierarchy22 extends ChildHierarchy2<ParentHierarchy22> {
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/GenericsInheritanceTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/GenericsInheritanceTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/GenericsInheritanceTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,24 @@
+//$Id: GenericsInheritanceTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.genericsinheritance;
+
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.Session;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class GenericsInheritanceTest extends TestCase {
+	public void testMapping() throws Exception {
+		Session s = openSession();
+		s.close();
+		//mapping is tested
+	}
+	protected Class[] getMappings() {
+		return new Class[] {
+				ChildHierarchy1.class,
+				ParentHierarchy1.class,
+				ChildHierarchy22.class,
+				ParentHierarchy22.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/Parent.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/Parent.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/Parent.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,35 @@
+package org.hibernate.test.annotations.genericsinheritance;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.MapKey;
+import javax.persistence.MappedSuperclass;
+import javax.persistence.OneToMany;
+
+ at MappedSuperclass
+public abstract class Parent<C extends Child> {
+
+	@Id @GeneratedValue Long id;
+	@MapKey @OneToMany(mappedBy="parent") Map<Long,C> children = new HashMap<Long,C>();
+
+	
+	public Long getId() {
+		return id;
+	}
+	public void setId(Long id) {
+		this.id = id;
+	}
+	
+	
+	public Map<Long,C> getChildren() {
+		return children;
+	}
+	public void setChildren(Map<Long,C> children) {
+		this.children = children;
+	}
+	
+	
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy1.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy1.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy1.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,8 @@
+package org.hibernate.test.annotations.genericsinheritance;
+
+import javax.persistence.Entity;
+
+ at Entity
+public class ParentHierarchy1 extends Parent<ChildHierarchy1> {
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy2.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy2.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy2.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,8 @@
+package org.hibernate.test.annotations.genericsinheritance;
+
+import javax.persistence.MappedSuperclass;
+
+ at MappedSuperclass
+public class ParentHierarchy2<C extends ChildHierarchy2> extends Parent<C> {
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy22.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy22.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy22.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,8 @@
+package org.hibernate.test.annotations.genericsinheritance;
+
+import javax.persistence.Entity;
+
+ at Entity
+public class ParentHierarchy22 extends ParentHierarchy2<ChildHierarchy22> {
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/hibernate.cfg.xml
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/hibernate.cfg.xml	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/hibernate.cfg.xml	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,11 @@
+<!DOCTYPE hibernate-configuration PUBLIC
+        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
+
+<hibernate-configuration>
+    <session-factory>
+        <mapping resource="org/hibernate/test/annotations/Boat.hbm.xml"/>
+        <mapping package="org.hibernate.test.annotations"/>
+        <mapping class="org.hibernate.test.annotations.Plane"/>
+    </session-factory>
+</hibernate-configuration>
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/EnumIdTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/EnumIdTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/EnumIdTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,62 @@
+//$Id: EnumIdTest.java 14785 2008-06-19 10:44:33Z hardy.ferentschik $
+package org.hibernate.test.annotations.id;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.test.annotations.id.entities.Planet;
+import org.hibernate.test.annotations.id.entities.PlanetCheatSheet;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Tests for enum type as id.
+ * 
+ * @author Hardy Ferentschik
+ * @see ANN-744
+ */
+ at SuppressWarnings("unchecked")
+public class EnumIdTest extends TestCase {
+
+	private Logger log = LoggerFactory.getLogger(EnumIdTest.class);	
+	
+	public EnumIdTest(String x) {
+		super(x);
+	}
+
+	public void testEnumAsId() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		PlanetCheatSheet mercury = new PlanetCheatSheet();
+		mercury.setPlanet(Planet.MERCURY);
+		mercury.setMass(3.303e+23);
+		mercury.setRadius(2.4397e6);
+		mercury.setNumberOfInhabitants(0);
+		s.persist(mercury);
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		PlanetCheatSheet mercuryFromDb = (PlanetCheatSheet) s.get(PlanetCheatSheet.class, mercury.getPlanet());
+		assertNotNull(mercuryFromDb);
+		log.debug(mercuryFromDb.toString());
+		s.delete(mercuryFromDb);
+		tx.commit();
+		s.close();
+		
+		s = openSession();
+		tx = s.beginTransaction();
+		mercury = (PlanetCheatSheet) s.get(PlanetCheatSheet.class, Planet.MERCURY);
+		assertNull(mercury);
+		tx.commit();
+		s.close();
+	}
+
+	/**
+	 * @see org.hibernate.test.annotations.TestCase#getMappings()
+	 */
+	protected Class[] getMappings() {
+		return new Class[] { PlanetCheatSheet.class };
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/IdClassTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/IdClassTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/IdClassTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,38 @@
+//$Id: IdClassTest.java 14784 2008-06-19 10:42:20Z hardy.ferentschik $
+package org.hibernate.test.annotations.id;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.test.annotations.id.entities.Location;
+import org.hibernate.test.annotations.id.entities.Tower;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at SuppressWarnings("unchecked")
+public class IdClassTest extends TestCase {
+	
+	public void testIdClassInSuperclass() throws Exception {
+		Tower tower = new Tower();
+		tower.latitude = 10.3;
+		tower.longitude = 45.4;
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		s.persist( tower );
+		s.flush();
+		s.clear();
+		Location loc = new Location();
+		loc.latitude = tower.latitude;
+		loc.longitude = tower.longitude;
+		assertNotNull( s.get( Tower.class, loc ) );
+		tx.rollback();
+		s.close();
+	}
+
+	protected Class[] getMappings() {
+		return new Class[]{
+				Tower.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/IdTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/IdTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/IdTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,301 @@
+//$Id: IdTest.java 17735 2009-10-14 05:15:33Z stliu $
+package org.hibernate.test.annotations.id;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.mapping.Column;
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.test.annotations.id.entities.Ball;
+import org.hibernate.test.annotations.id.entities.BreakDance;
+import org.hibernate.test.annotations.id.entities.Computer;
+import org.hibernate.test.annotations.id.entities.Department;
+import org.hibernate.test.annotations.id.entities.Dog;
+import org.hibernate.test.annotations.id.entities.FirTree;
+import org.hibernate.test.annotations.id.entities.Footballer;
+import org.hibernate.test.annotations.id.entities.FootballerPk;
+import org.hibernate.test.annotations.id.entities.Furniture;
+import org.hibernate.test.annotations.id.entities.GoalKeeper;
+import org.hibernate.test.annotations.id.entities.Home;
+import org.hibernate.test.annotations.id.entities.Monkey;
+import org.hibernate.test.annotations.id.entities.Phone;
+import org.hibernate.test.annotations.id.entities.Shoe;
+import org.hibernate.test.annotations.id.entities.SoundSystem;
+import org.hibernate.test.annotations.id.entities.Store;
+import org.hibernate.test.annotations.id.entities.Tree;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at SuppressWarnings("unchecked")
+public class IdTest extends TestCase {
+	public void testGenericGenerator() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		SoundSystem system = new SoundSystem();
+		system.setBrand("Genelec");
+		system.setModel("T234");
+		Furniture fur = new Furniture();
+		s.persist(system);
+		s.persist(fur);
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		system = (SoundSystem) s.get(SoundSystem.class, system.getId());
+		fur = (Furniture) s.get(Furniture.class, fur.getId());
+		assertNotNull(system);
+		assertNotNull(fur);
+		s.delete(system);
+		s.delete(fur);
+		tx.commit();
+		s.close();
+
+	}
+
+	/*
+	 * Ensures that GenericGenerator annotations wrapped inside a
+	 * GenericGenerators holder are bound correctly
+	 */
+	public void testGenericGenerators() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Monkey monkey = new Monkey();
+		s.persist(monkey);
+		s.flush();
+		assertNotNull(monkey.getId());
+		tx.rollback();
+		s.close();
+	}
+
+	public void testTableGenerator() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+
+		Ball b = new Ball();
+		Dog d = new Dog();
+		Computer c = new Computer();
+		s.persist(b);
+		s.persist(d);
+		s.persist(c);
+		tx.commit();
+		s.close();
+		assertEquals("table id not generated", new Integer(1), b.getId());
+		assertEquals("generator should not be shared", new Integer(1), d
+				.getId());
+		assertEquals("default value should work", new Long(1), c.getId());
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.delete(s.get(Ball.class, new Integer(1)));
+		s.delete(s.get(Dog.class, new Integer(1)));
+		s.delete(s.get(Computer.class, new Long(1)));
+		tx.commit();
+		s.close();
+	}
+
+	public void testSequenceGenerator() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Shoe b = new Shoe();
+		s.persist(b);
+		tx.commit();
+		s.close();
+		assertNotNull(b.getId());
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.delete(s.get(Shoe.class, b.getId()));
+		tx.commit();
+		s.close();
+	}
+
+	public void testClassLevelGenerator() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Store b = new Store();
+		s.persist(b);
+		tx.commit();
+		s.close();
+		assertNotNull(b.getId());
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.delete(s.get(Store.class, b.getId()));
+		tx.commit();
+		s.close();
+	}
+
+	public void testMethodLevelGenerator() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Department b = new Department();
+		s.persist(b);
+		tx.commit();
+		s.close();
+		assertNotNull(b.getId());
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.delete(s.get(Department.class, b.getId()));
+		tx.commit();
+		s.close();
+	}
+
+	public void testDefaultSequence() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Home h = new Home();
+		s.persist(h);
+		tx.commit();
+		s.close();
+		assertNotNull(h.getId());
+
+		s = openSession();
+		tx = s.beginTransaction();
+		Home reloadedHome = (Home) s.get(Home.class, h.getId());
+		assertEquals(h.getId(), reloadedHome.getId());
+		s.delete(reloadedHome);
+		tx.commit();
+		s.close();
+	}
+
+	public void testParameterizedAuto() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Home h = new Home();
+		s.persist(h);
+		tx.commit();
+		s.close();
+		assertNotNull(h.getId());
+
+		s = openSession();
+		tx = s.beginTransaction();
+		Home reloadedHome = (Home) s.get(Home.class, h.getId());
+		assertEquals(h.getId(), reloadedHome.getId());
+		s.delete(reloadedHome);
+		tx.commit();
+		s.close();
+	}
+
+	public void testIdInEmbeddableSuperclass() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		FirTree chrismasTree = new FirTree();
+		s.persist(chrismasTree);
+		tx.commit();
+		s.clear();
+		tx = s.beginTransaction();
+		chrismasTree = (FirTree) s.get(FirTree.class, chrismasTree.getId());
+		assertNotNull(chrismasTree);
+		s.delete(chrismasTree);
+		tx.commit();
+		s.close();
+	}
+
+	public void testIdClass() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Footballer fb = new Footballer("David", "Beckam", "Arsenal");
+		GoalKeeper keeper = new GoalKeeper("Fabien", "Bartez", "OM");
+		s.persist(fb);
+		s.persist(keeper);
+		tx.commit();
+		s.clear();
+
+		// lookup by id
+		tx = s.beginTransaction();
+		FootballerPk fpk = new FootballerPk("David", "Beckam");
+		fb = (Footballer) s.get(Footballer.class, fpk);
+		FootballerPk fpk2 = new FootballerPk("Fabien", "Bartez");
+		keeper = (GoalKeeper) s.get(GoalKeeper.class, fpk2);
+		assertNotNull(fb);
+		assertNotNull(keeper);
+		assertEquals("Beckam", fb.getLastname());
+		assertEquals("Arsenal", fb.getClub());
+		assertEquals(1, s.createQuery(
+				"from Footballer f where f.firstname = 'David'").list().size());
+		tx.commit();
+
+		// reattach by merge
+		tx = s.beginTransaction();
+		fb.setClub("Bimbo FC");
+		s.merge(fb);
+		tx.commit();
+
+		// reattach by saveOrUpdate
+		tx = s.beginTransaction();
+		fb.setClub("Bimbo FC SA");
+		s.saveOrUpdate(fb);
+		tx.commit();
+
+		// clean up
+		s.clear();
+		tx = s.beginTransaction();
+		fpk = new FootballerPk("David", "Beckam");
+		fb = (Footballer) s.get(Footballer.class, fpk);
+		assertEquals("Bimbo FC SA", fb.getClub());
+		s.delete(fb);
+		s.delete(keeper);
+		tx.commit();
+		s.close();
+	}
+
+	public void testColumnDefinition() {
+		Column idCol = (Column) getCfg().getClassMapping(Ball.class.getName())
+				.getIdentifierProperty().getValue().getColumnIterator().next();
+		assertEquals("ball_id", idCol.getName());
+	}
+
+	public void testLowAllocationSize() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		int size = 4;
+		BreakDance[] bds = new BreakDance[size];
+		for (int i = 0; i < size; i++) {
+			bds[i] = new BreakDance();
+			s.persist(bds[i]);
+		}
+		s.flush();
+		for (int i = 0; i < size; i++) {
+			assertEquals(i + 1, bds[i].id.intValue());
+		}
+		tx.rollback();
+		s.close();
+	}
+
+	/**
+	 * @see org.hibernate.test.annotations.TestCase#getMappings()
+	 */
+	protected Class[] getMappings() {
+		return new Class[] { Ball.class, Shoe.class, Store.class,
+				Department.class, Dog.class, Computer.class, Home.class,
+				Phone.class, Tree.class, FirTree.class, Footballer.class,
+				SoundSystem.class, Furniture.class, GoalKeeper.class,
+				BreakDance.class, Monkey.class};
+	}
+
+	/**
+	 * @see org.hibernate.test.annotations.TestCase#getAnnotatedPackages()
+	 */
+	protected String[] getAnnotatedPackages() {
+		return new String[] { "org.hibernate.test.annotations",
+				"org.hibernate.test.annotations.id" };
+	}
+
+	@Override
+	protected String[] getXmlFiles() {
+		return new String[] { "org/hibernate/test/annotations/orm.xml" };
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/JoinColumnOverrideTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/JoinColumnOverrideTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/JoinColumnOverrideTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,64 @@
+//$Id: JoinColumnOverrideTest.java 14761 2008-06-11 13:51:06Z hardy.ferentschik $
+package org.hibernate.test.annotations.id;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+import org.hibernate.cfg.AnnotationConfiguration;
+import org.hibernate.dialect.SQLServerDialect;
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.test.annotations.id.entities.Bunny;
+import org.hibernate.test.annotations.id.entities.PointyTooth;
+import org.hibernate.test.annotations.id.entities.TwinkleToes;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Tests for JIRA issue ANN-748.
+ * 
+ * @author Hardy Ferentschik
+ */
+ at SuppressWarnings("unchecked")
+public class JoinColumnOverrideTest extends TestCase {
+
+	private Logger log = LoggerFactory.getLogger(JoinColumnOverrideTest.class);
+	
+	public JoinColumnOverrideTest(String x) {
+		super(x);
+	}
+
+	public void testBlownPrecision() throws Exception {
+		
+		try {
+			AnnotationConfiguration config = new AnnotationConfiguration();
+			config.addAnnotatedClass(Bunny.class);
+			config.addAnnotatedClass(PointyTooth.class);
+			config.addAnnotatedClass(TwinkleToes.class);
+			config.buildSessionFactory();
+			String[] schema = config
+					.generateSchemaCreationScript(new SQLServerDialect());
+			for (String s : schema) {
+				log.debug(s);
+			}
+			String expectedSqlPointyTooth = "create table PointyTooth (id numeric(128,0) not null, " +
+					"bunny_id numeric(128,0) null, primary key (id))";
+			assertEquals("Wrong SQL", expectedSqlPointyTooth, schema[1]);
+			
+			String expectedSqlTwinkleToes = "create table TwinkleToes (id numeric(128,0) not null, " +
+			"bunny_id numeric(128,0) null, primary key (id))";
+			assertEquals("Wrong SQL", expectedSqlTwinkleToes, schema[2]);
+		} catch (Exception e) {
+			StringWriter writer = new StringWriter();
+			e.printStackTrace(new PrintWriter(writer));
+			log.debug(writer.toString());
+			fail(e.getMessage());
+		}		
+	}
+
+	/**
+	 * @see org.hibernate.test.annotations.TestCase#getMappings()
+	 */
+	protected Class[] getMappings() {
+		return new Class[] {};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/UUIDGenerator.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/UUIDGenerator.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/UUIDGenerator.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,34 @@
+package org.hibernate.test.annotations.id;
+
+import java.io.Serializable;
+import java.math.BigInteger;
+import java.util.UUID;
+
+import org.hibernate.HibernateException;
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.id.IdentifierGenerator;
+
+/**
+ * Unlike Hibernate's UUID generator.  This avoids 
+ * meaningless synchronization and has less
+ * than a chance of an asteroid hitting you on the head
+ * even after trillions of rows are inserted.  I know
+ * this to be true because it says so in Wikipedia(haha).
+ * http://en.wikipedia.org/wiki/UUID#Random_UUID_probability_of_duplicates
+ *
+ */
+public class UUIDGenerator implements IdentifierGenerator {
+
+    public Serializable generate(SessionImplementor arg0, Object arg1) throws HibernateException {
+        UUID uuid = UUID.randomUUID();
+        String sud = uuid.toString();
+        System.out.println("uuid="+uuid);
+        sud = sud.replaceAll("-", "");
+        
+        BigInteger integer = new BigInteger(sud,16);
+
+        System.out.println("bi ="+integer.toString() );
+        return integer;
+    }
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Ball.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Ball.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Ball.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,35 @@
+//$Id: Ball.java 14760 2008-06-11 07:33:15Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.entities;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.TableGenerator;
+
+/**
+ * Sample of table generator
+ *
+ * @author Emmanuel Bernard
+ */
+ at TableGenerator(name = "EMP_GEN", table = "GENERATOR_TABLE", pkColumnName = "pkey",
+		valueColumnName = "hi", pkColumnValue = "Ball", allocationSize = 10)
+ at Entity
+ at SuppressWarnings("serial")
+public class Ball implements Serializable {
+	private Integer id;
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.TABLE, generator = "EMP_GEN")
+	@Column(name = "ball_id")
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/BreakDance.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/BreakDance.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/BreakDance.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,27 @@
+//$Id: BreakDance.java 14760 2008-06-11 07:33:15Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.entities;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.TableGenerator;
+import javax.persistence.GenerationType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class BreakDance {
+	@Id
+	@GeneratedValue(generator = "memencoIdGen", strategy = GenerationType.TABLE)
+	@TableGenerator(
+		name = "memencoIdGen",
+		table = "hi_id_key",
+		pkColumnName = "id_key",
+		valueColumnName = "next_hi",
+		pkColumnValue = "issue",
+		allocationSize = 1
+	)
+	public Integer id;
+	public String name;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Bunny.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Bunny.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Bunny.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,46 @@
+//$Id: Bunny.java 14761 2008-06-11 13:51:06Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.entities;
+
+import java.io.Serializable;
+import java.math.BigInteger;
+import java.util.Set;
+
+import javax.persistence.Column;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+import org.hibernate.annotations.GenericGenerator;
+
+/**
+ * Blown precision on related entity when &#064;JoinColumn is used.
+ * 
+ * @see ANN-748
+ * @author Andrew C. Oliver andyspam at osintegrators.com
+ */
+ at Entity
+ at SuppressWarnings("serial")
+public class Bunny implements Serializable {
+	@Id
+	@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "java5_uuid")
+	@GenericGenerator(name = "java5_uuid", strategy = "org.hibernate.test.annotations.id.UUIDGenerator")
+	@Column(name = "id", precision = 128, scale = 0)
+	private BigInteger id;
+
+	@OneToMany(mappedBy = "bunny", cascade = { CascadeType.PERSIST })
+	Set<PointyTooth> teeth;
+	
+	@OneToMany(mappedBy = "bunny", cascade = { CascadeType.PERSIST })
+	Set<TwinkleToes> toes;
+
+	public void setTeeth(Set<PointyTooth> teeth) {
+		this.teeth = teeth;
+	}
+
+	public BigInteger getId() {
+		return id;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Computer.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Computer.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Computer.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,34 @@
+//$Id: Computer.java 14760 2008-06-11 07:33:15Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.entities;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity()
+public class Computer {
+	private Long id;
+	private String serialNumber;
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.TABLE)
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getSerialNumber() {
+		return serialNumber;
+	}
+
+	public void setSerialNumber(String serialNumber) {
+		this.serialNumber = serialNumber;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Department.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Department.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Department.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,29 @@
+//$Id: Department.java 17735 2009-10-14 05:15:33Z stliu $
+package org.hibernate.test.annotations.id.entities;
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * Sample of method generator
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at SuppressWarnings("serial")
+public class Department implements Serializable {
+	private Long id;
+
+	@Id
+	@GeneratedValue
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long long1) {
+		id = long1;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Dog.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Dog.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Dog.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,42 @@
+//$Id: Dog.java 14760 2008-06-11 07:33:15Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.entities;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+
+/**
+ * Share the generator table decribed by the GEN_TABLE GeneratedIdTable
+ * using the Dog key as discriminator
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "tbl_dog")
+ at TableGenerator(name = "DogGen", table = "GENERATOR_TABLE", pkColumnName = "pkey",
+		valueColumnName = "hi", pkColumnValue = "Dog", allocationSize = 10)
+public class Dog {
+	private Integer id;
+	private String name;
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.TABLE, generator = "DogGen")
+	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;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/FirTree.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/FirTree.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/FirTree.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,11 @@
+//$Id: FirTree.java 14760 2008-06-11 07:33:15Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.entities;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class FirTree extends Tree {
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Footballer.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Footballer.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Footballer.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,73 @@
+//$Id: Footballer.java 14760 2008-06-11 07:33:15Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.entities;
+
+import javax.persistence.DiscriminatorColumn;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at IdClass(FootballerPk.class)
+ at DiscriminatorColumn(name = "bibi")
+public class Footballer {
+	private String firstname;
+	private String lastname;
+	private String club;
+
+	public Footballer() {
+	}
+
+	public Footballer(String firstname, String lastname, String club) {
+		this.firstname = firstname;
+		this.lastname = lastname;
+		this.club = club;
+	}
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( !( o instanceof Footballer ) ) return false;
+
+		final Footballer footballer = (Footballer) o;
+
+		if ( !firstname.equals( footballer.firstname ) ) return false;
+		if ( !lastname.equals( footballer.lastname ) ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		int result;
+		result = firstname.hashCode();
+		result = 29 * result + lastname.hashCode();
+		return result;
+	}
+
+	@Id
+	public String getFirstname() {
+		return firstname;
+	}
+
+	public void setFirstname(String firstname) {
+		this.firstname = firstname;
+	}
+
+	@Id
+	public String getLastname() {
+		return lastname;
+	}
+
+	public void setLastname(String lastname) {
+		this.lastname = lastname;
+	}
+
+	public String getClub() {
+		return club;
+	}
+
+	public void setClub(String club) {
+		this.club = club;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/FootballerPk.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/FootballerPk.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/FootballerPk.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,62 @@
+//$Id: FootballerPk.java 14760 2008-06-11 07:33:15Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.entities;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+ at SuppressWarnings("serial")
+public class FootballerPk implements Serializable {
+	private String firstname;
+	private String lastname;
+
+	@Column(name = "fb_fname")
+	public String getFirstname() {
+		return firstname;
+	}
+
+	public String getLastname() {
+		return lastname;
+	}
+
+	public void setFirstname(String firstname) {
+		this.firstname = firstname;
+	}
+
+	public void setLastname(String lastname) {
+		this.lastname = lastname;
+	}
+
+	public FootballerPk() {
+	}
+
+	public FootballerPk(String firstname, String lastname) {
+		this.firstname = firstname;
+		this.lastname = lastname;
+
+	}
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( !( o instanceof FootballerPk ) ) return false;
+
+		final FootballerPk footballerPk = (FootballerPk) o;
+
+		if ( !firstname.equals( footballerPk.firstname ) ) return false;
+		if ( !lastname.equals( footballerPk.lastname ) ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		int result;
+		result = firstname.hashCode();
+		result = 29 * result + lastname.hashCode();
+		return result;
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Furniture.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Furniture.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Furniture.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,33 @@
+//$Id: Furniture.java 14760 2008-06-11 07:33:15Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.entities;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+import org.hibernate.annotations.GenericGenerator;
+import org.hibernate.annotations.Parameter;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Furniture {
+	private Integer id;
+
+	@Id
+	@GeneratedValue(generator = "hibseq")
+	@GenericGenerator(name = "hibseq", strategy = "seqhilo",
+			parameters = {
+			@Parameter(name = "max_lo", value = "5"),
+			@Parameter(name = "sequence", value = "heybabyhey")
+					}
+	)
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/GoalKeeper.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/GoalKeeper.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/GoalKeeper.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,17 @@
+//$Id: GoalKeeper.java 14760 2008-06-11 07:33:15Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.entities;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class GoalKeeper extends Footballer {
+	public GoalKeeper() {
+	}
+
+	public GoalKeeper(String firstname, String lastname, String club) {
+		super( firstname, lastname, club );
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Home.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Home.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Home.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,26 @@
+//$Id: Home.java 14760 2008-06-11 07:33:15Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.entities;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * Default sequence generation usage
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Home {
+	private Long id;
+
+	@Id
+	@GeneratedValue
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Location.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Location.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Location.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,35 @@
+//$Id: Location.java 14760 2008-06-11 07:33:15Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.entities;
+
+import java.io.Serializable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at SuppressWarnings("serial")
+public class Location implements Serializable {
+	public double longitude;
+	public double latitude;
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( o == null || getClass() != o.getClass() ) return false;
+
+		final Location location = (Location) o;
+
+		if ( Double.compare( location.latitude, latitude ) != 0 ) return false;
+		if ( Double.compare( location.longitude, longitude ) != 0 ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		int result;
+		long temp;
+		temp = longitude != +0.0d ? Double.doubleToLongBits( longitude ) : 0L;
+		result = (int) ( temp ^ ( temp >>> 32 ) );
+		temp = latitude != +0.0d ? Double.doubleToLongBits( latitude ) : 0L;
+		result = 29 * result + (int) ( temp ^ ( temp >>> 32 ) );
+		return result;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/MilitaryBuilding.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/MilitaryBuilding.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/MilitaryBuilding.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,18 @@
+//$Id: MilitaryBuilding.java 14760 2008-06-11 07:33:15Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.entities;
+
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.MappedSuperclass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MappedSuperclass
+ at IdClass(Location.class)
+public class MilitaryBuilding {
+	@Id
+	public double longitude;
+	@Id
+	public double latitude;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Monkey.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Monkey.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Monkey.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,24 @@
+//$
+package org.hibernate.test.annotations.id.entities;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Paul Cowan
+ */
+ at Entity
+public class Monkey {
+	private String id;
+
+	@Id
+	@GeneratedValue(generator = "system-uuid-2")
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Phone.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Phone.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Phone.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,24 @@
+//$Id: Phone.java 17735 2009-10-14 05:15:33Z stliu $
+package org.hibernate.test.annotations.id.entities;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity()
+public class Phone {
+	private Integer id;
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Planet.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Planet.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Planet.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,6 @@
+// $Id: Planet.java 14785 2008-06-19 10:44:33Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.entities;
+
+public enum Planet {
+	MERCURY, VENUS, EARTH, MARS, JUPITER, SATURN, URANUS, NEPTUNE, PLUTO;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/PlanetCheatSheet.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/PlanetCheatSheet.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/PlanetCheatSheet.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,85 @@
+package org.hibernate.test.annotations.id.entities;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.Id;
+
+
+/**
+ * Test entity for enum type as id.
+ * 
+ * @author Hardy Ferentschik
+ * @see ANN-744
+ */
+ at Entity
+public class PlanetCheatSheet {
+
+	@Id
+	@Enumerated(EnumType.STRING)
+	@Column(name = "planet")
+	private Planet planet;
+
+	private double mass;
+
+	private double radius;
+
+	private long numberOfInhabitants;
+
+	public Planet getPlanet() {
+		return planet;
+	}
+
+	public void setPlanet(Planet planet) {
+		this.planet = planet;
+	}
+
+	public double getMass() {
+		return mass;
+	}
+
+	public void setMass(double mass) {
+		this.mass = mass;
+	}
+
+	public double getRadius() {
+		return radius;
+	}
+
+	public void setRadius(double radius) {
+		this.radius = radius;
+	}
+
+	public long getNumberOfInhabitants() {
+		return numberOfInhabitants;
+	}
+
+	public void setNumberOfInhabitants(long numberOfInhabitants) {
+		this.numberOfInhabitants = numberOfInhabitants;
+	}
+
+	/**
+	 * Constructs a <code>String</code> with all attributes
+	 * in name = value format.
+	 *
+	 * @return a <code>String</code> representation 
+	 * of this object.
+	 */
+	public String toString()
+	{
+	    final String TAB = "    ";
+	    
+	    String retValue = "";
+	    
+	    retValue = "PlanetCheatSheet ( "
+	        + super.toString() + TAB
+	        + "planet = " + this.planet + TAB
+	        + "mass = " + this.mass + TAB
+	        + "radius = " + this.radius + TAB
+	        + "numberOfInhabitants = " + this.numberOfInhabitants + TAB
+	        + " )";
+	
+	    return retValue;
+	}	
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/PointyTooth.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/PointyTooth.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/PointyTooth.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,44 @@
+//$Id: PointyTooth.java 14761 2008-06-11 13:51:06Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.entities;
+
+import java.io.Serializable;
+import java.math.BigInteger;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+import org.hibernate.annotations.GenericGenerator;
+
+/**
+ * Blown precision on related entity when &#064;JoinColumn is used. 
+ * Does not cause an issue on HyperSonic, but replicates nicely on PGSQL.
+ * 
+ * @see ANN-748
+ * @author Andrew C. Oliver andyspam at osintegrators.com
+ */
+ at Entity
+ at SuppressWarnings("serial")
+public class PointyTooth implements Serializable {
+	@Id
+	@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "java5_uuid")
+	@GenericGenerator(name = "java5_uuid", strategy = "org.hibernate.test.annotations.id.UUIDGenerator")
+	@Column(name = "id", precision = 128, scale = 0)
+	private BigInteger id;
+
+	@ManyToOne
+    @JoinColumn(name = "bunny_id")
+	Bunny bunny;
+
+	public void setBunny(Bunny bunny) {
+		this.bunny = bunny;
+	}
+
+	public BigInteger getId() {
+		return id;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Shoe.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Shoe.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Shoe.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,29 @@
+//$Id: Shoe.java 17735 2009-10-14 05:15:33Z stliu $
+package org.hibernate.test.annotations.id.entities;
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * sample of Sequance generator
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at SuppressWarnings("serial")
+public class Shoe implements Serializable {
+	private Long id;
+
+	@Id
+	@GeneratedValue
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long long1) {
+		id = long1;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/SoundSystem.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/SoundSystem.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/SoundSystem.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,42 @@
+//$Id: SoundSystem.java 14760 2008-06-11 07:33:15Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.entities;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class SoundSystem {
+	private String id;
+	private String brand;
+	private String model;
+
+	@Id
+	@GeneratedValue(generator = "system-uuid")
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	public String getBrand() {
+		return brand;
+	}
+
+	public void setBrand(String brand) {
+		this.brand = brand;
+	}
+
+	public String getModel() {
+		return model;
+	}
+
+	public void setModel(String model) {
+		this.model = model;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Store.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Store.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Store.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,29 @@
+//$Id: Store.java 17735 2009-10-14 05:15:33Z stliu $
+package org.hibernate.test.annotations.id.entities;
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * Sample of class generator
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at SuppressWarnings("serial")
+public class Store implements Serializable {
+	private Long id;
+
+	@Id
+	@GeneratedValue
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long long1) {
+		id = long1;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Tower.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Tower.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Tower.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,14 @@
+//$Id: Tower.java 14760 2008-06-11 07:33:15Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.entities;
+
+import javax.persistence.AttributeOverride;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at AttributeOverride(name = "longitude", column = @Column(name = "fld_longitude"))
+public class Tower extends MilitaryBuilding {
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Tree.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Tree.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/Tree.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,24 @@
+//$Id: Tree.java 14760 2008-06-11 07:33:15Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.entities;
+
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.MappedSuperclass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MappedSuperclass
+public class Tree {
+	private Integer id;
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/TwinkleToes.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/TwinkleToes.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/entities/TwinkleToes.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,42 @@
+//$Id: TwinkleToes.java 14761 2008-06-11 13:51:06Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.entities;
+
+import java.io.Serializable;
+import java.math.BigInteger;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+
+import org.hibernate.annotations.GenericGenerator;
+
+/**
+ * Blown precision on related entity when &#064;JoinColumn is used. 
+ * Does not cause an issue on HyperSonic, but replicates nicely on PGSQL.
+ * 
+ * @see ANN-748
+ * @author Andrew C. Oliver andyspam at osintegrators.com
+ */
+ at Entity
+ at SuppressWarnings("serial")
+public class TwinkleToes implements Serializable {
+	@Id
+	@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "java5_uuid")
+	@GenericGenerator(name = "java5_uuid", strategy = "org.hibernate.test.annotations.id.UUIDGenerator")
+	@Column(name = "id", precision = 128, scale = 0)
+	private BigInteger id;
+
+	@ManyToOne
+	Bunny bunny;
+
+	public void setBunny(Bunny bunny) {
+		this.bunny = bunny;
+	}
+
+	public BigInteger getId() {
+		return id;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/package-info.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/package-info.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/package-info.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,11 @@
+//$Id: package-info.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+/**
+ * Test package for metatata facilities
+ * It contains an example of package level metadata
+ */
+ at org.hibernate.annotations.GenericGenerator(name = "system-uuid", strategy = "uuid")
+ at org.hibernate.annotations.GenericGenerators(
+		@org.hibernate.annotations.GenericGenerator(name = "system-uuid-2", strategy = "uuid")
+)
+package org.hibernate.test.annotations.id;
+

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/EnumIdTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/EnumIdTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/EnumIdTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,62 @@
+//$Id: EnumIdTest.java 14785 2008-06-19 10:44:33Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.sequences;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.test.annotations.id.sequences.entities.Planet;
+import org.hibernate.test.annotations.id.sequences.entities.PlanetCheatSheet;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Tests for enum type as id.
+ * 
+ * @author Hardy Ferentschik
+ * @see ANN-744
+ */
+ at SuppressWarnings("unchecked")
+public class EnumIdTest extends TestCase {
+
+	private Logger log = LoggerFactory.getLogger(EnumIdTest.class);	
+	
+	public EnumIdTest(String x) {
+		super(x);
+	}
+
+	public void testEnumAsId() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		PlanetCheatSheet mercury = new PlanetCheatSheet();
+		mercury.setPlanet(Planet.MERCURY);
+		mercury.setMass(3.303e+23);
+		mercury.setRadius(2.4397e6);
+		mercury.setNumberOfInhabitants(0);
+		s.persist(mercury);
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		PlanetCheatSheet mercuryFromDb = (PlanetCheatSheet) s.get(PlanetCheatSheet.class, mercury.getPlanet());
+		assertNotNull(mercuryFromDb);
+		log.debug(mercuryFromDb.toString());
+		s.delete(mercuryFromDb);
+		tx.commit();
+		s.close();
+		
+		s = openSession();
+		tx = s.beginTransaction();
+		mercury = (PlanetCheatSheet) s.get(PlanetCheatSheet.class, Planet.MERCURY);
+		assertNull(mercury);
+		tx.commit();
+		s.close();
+	}
+
+	/**
+	 * @see org.hibernate.test.annotations.TestCase#getMappings()
+	 */
+	protected Class[] getMappings() {
+		return new Class[] { PlanetCheatSheet.class };
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/IdClassTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/IdClassTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/IdClassTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,39 @@
+//$Id: IdClassTest.java 14784 2008-06-19 10:42:20Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.sequences;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.test.annotations.id.sequences.entities.Location;
+import org.hibernate.test.annotations.id.sequences.entities.Tower;
+
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at SuppressWarnings("unchecked")
+public class IdClassTest extends TestCase {
+	
+	public void testIdClassInSuperclass() throws Exception {
+		Tower tower = new Tower();
+		tower.latitude = 10.3;
+		tower.longitude = 45.4;
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		s.persist( tower );
+		s.flush();
+		s.clear();
+		Location loc = new Location();
+		loc.latitude = tower.latitude;
+		loc.longitude = tower.longitude;
+		assertNotNull( s.get( Tower.class, loc ) );
+		tx.rollback();
+		s.close();
+	}
+
+	protected Class[] getMappings() {
+		return new Class[]{
+				Tower.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/IdTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/IdTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/IdTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,308 @@
+//$Id: IdTest.java 15025 2008-08-11 09:14:39Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.sequences;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.mapping.Column;
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.test.annotations.id.sequences.entities.Ball;
+import org.hibernate.test.annotations.id.sequences.entities.BreakDance;
+import org.hibernate.test.annotations.id.sequences.entities.Computer;
+import org.hibernate.test.annotations.id.sequences.entities.Department;
+import org.hibernate.test.annotations.id.sequences.entities.Dog;
+import org.hibernate.test.annotations.id.sequences.entities.FirTree;
+import org.hibernate.test.annotations.id.sequences.entities.Footballer;
+import org.hibernate.test.annotations.id.sequences.entities.FootballerPk;
+import org.hibernate.test.annotations.id.sequences.entities.Furniture;
+import org.hibernate.test.annotations.id.sequences.entities.GoalKeeper;
+import org.hibernate.test.annotations.id.sequences.entities.Home;
+import org.hibernate.test.annotations.id.sequences.entities.Monkey;
+import org.hibernate.test.annotations.id.sequences.entities.Phone;
+import org.hibernate.test.annotations.id.sequences.entities.Shoe;
+import org.hibernate.test.annotations.id.sequences.entities.SoundSystem;
+import org.hibernate.test.annotations.id.sequences.entities.Store;
+import org.hibernate.test.annotations.id.sequences.entities.Tree;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at SuppressWarnings("unchecked")
+public class IdTest extends TestCase {
+	public void testGenericGenerator() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		SoundSystem system = new SoundSystem();
+		system.setBrand("Genelec");
+		system.setModel("T234");
+		Furniture fur = new Furniture();
+		s.persist(system);
+		s.persist(fur);
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		system = (SoundSystem) s.get(SoundSystem.class, system.getId());
+		fur = (Furniture) s.get(Furniture.class, fur.getId());
+		assertNotNull(system);
+		assertNotNull(fur);
+		s.delete(system);
+		s.delete(fur);
+		tx.commit();
+		s.close();
+
+	}
+
+	/*
+	 * Ensures that GenericGenerator annotations wrapped inside a
+	 * GenericGenerators holder are bound correctly
+	 */
+	public void testGenericGenerators() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Monkey monkey = new Monkey();
+		s.persist(monkey);
+		s.flush();
+		assertNotNull(monkey.getId());
+		tx.rollback();
+		s.close();
+	}
+
+	public void testTableGenerator() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+
+		Ball b = new Ball();
+		Dog d = new Dog();
+		Computer c = new Computer();
+		s.persist(b);
+		s.persist(d);
+		s.persist(c);
+		tx.commit();
+		s.close();
+		assertEquals("table id not generated", new Integer(1), b.getId());
+		assertEquals("generator should not be shared", new Integer(1), d
+				.getId());
+		assertEquals("default value should work", new Long(1), c.getId());
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.delete(s.get(Ball.class, new Integer(1)));
+		s.delete(s.get(Dog.class, new Integer(1)));
+		s.delete(s.get(Computer.class, new Long(1)));
+		tx.commit();
+		s.close();
+	}
+
+	public void testSequenceGenerator() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Shoe b = new Shoe();
+		s.persist(b);
+		tx.commit();
+		s.close();
+		assertNotNull(b.getId());
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.delete(s.get(Shoe.class, b.getId()));
+		tx.commit();
+		s.close();
+	}
+
+	public void testClassLevelGenerator() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Store b = new Store();
+		s.persist(b);
+		tx.commit();
+		s.close();
+		assertNotNull(b.getId());
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.delete(s.get(Store.class, b.getId()));
+		tx.commit();
+		s.close();
+	}
+
+	public void testMethodLevelGenerator() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Department b = new Department();
+		s.persist(b);
+		tx.commit();
+		s.close();
+		assertNotNull(b.getId());
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.delete(s.get(Department.class, b.getId()));
+		tx.commit();
+		s.close();
+	}
+
+	public void testDefaultSequence() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Home h = new Home();
+		s.persist(h);
+		tx.commit();
+		s.close();
+		assertNotNull(h.getId());
+
+		s = openSession();
+		tx = s.beginTransaction();
+		Home reloadedHome = (Home) s.get(Home.class, h.getId());
+		assertEquals(h.getId(), reloadedHome.getId());
+		s.delete(reloadedHome);
+		tx.commit();
+		s.close();
+	}
+
+	public void testParameterizedAuto() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Home h = new Home();
+		s.persist(h);
+		tx.commit();
+		s.close();
+		assertNotNull(h.getId());
+
+		s = openSession();
+		tx = s.beginTransaction();
+		Home reloadedHome = (Home) s.get(Home.class, h.getId());
+		assertEquals(h.getId(), reloadedHome.getId());
+		s.delete(reloadedHome);
+		tx.commit();
+		s.close();
+	}
+
+	public void testIdInEmbeddableSuperclass() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		FirTree chrismasTree = new FirTree();
+		s.persist(chrismasTree);
+		tx.commit();
+		s.clear();
+		tx = s.beginTransaction();
+		chrismasTree = (FirTree) s.get(FirTree.class, chrismasTree.getId());
+		assertNotNull(chrismasTree);
+		s.delete(chrismasTree);
+		tx.commit();
+		s.close();
+	}
+
+	public void testIdClass() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Footballer fb = new Footballer("David", "Beckam", "Arsenal");
+		GoalKeeper keeper = new GoalKeeper("Fabien", "Bartez", "OM");
+		s.persist(fb);
+		s.persist(keeper);
+		tx.commit();
+		s.clear();
+
+		// lookup by id
+		tx = s.beginTransaction();
+		FootballerPk fpk = new FootballerPk("David", "Beckam");
+		fb = (Footballer) s.get(Footballer.class, fpk);
+		FootballerPk fpk2 = new FootballerPk("Fabien", "Bartez");
+		keeper = (GoalKeeper) s.get(GoalKeeper.class, fpk2);
+		assertNotNull(fb);
+		assertNotNull(keeper);
+		assertEquals("Beckam", fb.getLastname());
+		assertEquals("Arsenal", fb.getClub());
+		assertEquals(1, s.createQuery(
+				"from Footballer f where f.firstname = 'David'").list().size());
+		tx.commit();
+
+		// reattach by merge
+		tx = s.beginTransaction();
+		fb.setClub("Bimbo FC");
+		s.merge(fb);
+		tx.commit();
+
+		// reattach by saveOrUpdate
+		tx = s.beginTransaction();
+		fb.setClub("Bimbo FC SA");
+		s.saveOrUpdate(fb);
+		tx.commit();
+
+		// clean up
+		s.clear();
+		tx = s.beginTransaction();
+		fpk = new FootballerPk("David", "Beckam");
+		fb = (Footballer) s.get(Footballer.class, fpk);
+		assertEquals("Bimbo FC SA", fb.getClub());
+		s.delete(fb);
+		s.delete(keeper);
+		tx.commit();
+		s.close();
+	}
+
+	public void testColumnDefinition() {
+		Column idCol = (Column) getCfg().getClassMapping(Ball.class.getName())
+				.getIdentifierProperty().getValue().getColumnIterator().next();
+		assertEquals("ball_id", idCol.getName());
+	}
+
+	public void testLowAllocationSize() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		int size = 4;
+		BreakDance[] bds = new BreakDance[size];
+		for (int i = 0; i < size; i++) {
+			bds[i] = new BreakDance();
+			s.persist(bds[i]);
+		}
+		s.flush();
+		for (int i = 0; i < size; i++) {
+			assertEquals(i + 1, bds[i].id.intValue());
+		}
+		tx.rollback();
+		s.close();
+	}
+	
+	
+	
+	@Override
+	protected boolean runForCurrentDialect() {
+		return super.runForCurrentDialect() && getDialect().supportsSequences();
+	}
+
+	/**
+	 * @see org.hibernate.test.annotations.TestCase#getMappings()
+	 */
+	protected Class[] getMappings() {
+		return new Class[] { Ball.class, Shoe.class, Store.class,
+				Department.class, Dog.class, Computer.class, Home.class,
+				Phone.class, Tree.class, FirTree.class, Footballer.class,
+				SoundSystem.class, Furniture.class, GoalKeeper.class,
+				BreakDance.class, Monkey.class};
+	}
+	
+	/**
+	 * @see org.hibernate.test.annotations.TestCase#getAnnotatedPackages()
+	 */
+	protected String[] getAnnotatedPackages() {
+		return new String[] { "org.hibernate.test.annotations",
+				"org.hibernate.test.annotations.id" };
+	}
+
+	@Override
+	protected String[] getXmlFiles() {
+		return new String[] { "org/hibernate/test/annotations/orm.xml" };
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/JoinColumnOverrideTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/JoinColumnOverrideTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/JoinColumnOverrideTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,64 @@
+//$Id: JoinColumnOverrideTest.java 14761 2008-06-11 13:51:06Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.sequences;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+import org.hibernate.cfg.AnnotationConfiguration;
+import org.hibernate.dialect.SQLServerDialect;
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.test.annotations.id.sequences.entities.Bunny;
+import org.hibernate.test.annotations.id.sequences.entities.PointyTooth;
+import org.hibernate.test.annotations.id.sequences.entities.TwinkleToes;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Tests for JIRA issue ANN-748.
+ * 
+ * @author Hardy Ferentschik
+ */
+ at SuppressWarnings("unchecked")
+public class JoinColumnOverrideTest extends TestCase {
+
+	private Logger log = LoggerFactory.getLogger(JoinColumnOverrideTest.class);
+	
+	public JoinColumnOverrideTest(String x) {
+		super(x);
+	}
+
+	public void testBlownPrecision() throws Exception {
+		
+		try {
+			AnnotationConfiguration config = new AnnotationConfiguration();
+			config.addAnnotatedClass(Bunny.class);
+			config.addAnnotatedClass(PointyTooth.class);
+			config.addAnnotatedClass(TwinkleToes.class);
+			config.buildSessionFactory();
+			String[] schema = config
+					.generateSchemaCreationScript(new SQLServerDialect());
+			for (String s : schema) {
+				log.debug(s);
+			}
+			String expectedSqlPointyTooth = "create table PointyTooth (id numeric(128,0) not null, " +
+					"bunny_id numeric(128,0) null, primary key (id))";
+			assertEquals("Wrong SQL", expectedSqlPointyTooth, schema[1]);
+			
+			String expectedSqlTwinkleToes = "create table TwinkleToes (id numeric(128,0) not null, " +
+			"bunny_id numeric(128,0) null, primary key (id))";
+			assertEquals("Wrong SQL", expectedSqlTwinkleToes, schema[2]);
+		} catch (Exception e) {
+			StringWriter writer = new StringWriter();
+			e.printStackTrace(new PrintWriter(writer));
+			log.debug(writer.toString());
+			fail(e.getMessage());
+		}		
+	}
+
+	/**
+	 * @see org.hibernate.test.annotations.TestCase#getMappings()
+	 */
+	protected Class[] getMappings() {
+		return new Class[] {};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/UUIDGenerator.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/UUIDGenerator.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/UUIDGenerator.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,34 @@
+package org.hibernate.test.annotations.id.sequences;
+
+import java.io.Serializable;
+import java.math.BigInteger;
+import java.util.UUID;
+
+import org.hibernate.HibernateException;
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.id.IdentifierGenerator;
+
+/**
+ * Unlike Hibernate's UUID generator.  This avoids 
+ * meaningless synchronization and has less
+ * than a chance of an asteroid hitting you on the head
+ * even after trillions of rows are inserted.  I know
+ * this to be true because it says so in Wikipedia(haha).
+ * http://en.wikipedia.org/wiki/UUID#Random_UUID_probability_of_duplicates
+ *
+ */
+public class UUIDGenerator implements IdentifierGenerator {
+
+    public Serializable generate(SessionImplementor arg0, Object arg1) throws HibernateException {
+        UUID uuid = UUID.randomUUID();
+        String sud = uuid.toString();
+        System.out.println("uuid="+uuid);
+        sud = sud.replaceAll("-", "");
+        
+        BigInteger integer = new BigInteger(sud,16);
+
+        System.out.println("bi ="+integer.toString() );
+        return integer;
+    }
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Ball.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Ball.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Ball.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,35 @@
+//$Id: Ball.java 14760 2008-06-11 07:33:15Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.sequences.entities;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.TableGenerator;
+
+/**
+ * Sample of table generator
+ *
+ * @author Emmanuel Bernard
+ */
+ at TableGenerator(name = "EMP_GEN", table = "GENERATOR_TABLE", pkColumnName = "pkey",
+		valueColumnName = "hi", pkColumnValue = "Ball", allocationSize = 10)
+ at Entity
+ at SuppressWarnings("serial")
+public class Ball implements Serializable {
+	private Integer id;
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.TABLE, generator = "EMP_GEN")
+	@Column(name = "ball_id")
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/BreakDance.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/BreakDance.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/BreakDance.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,27 @@
+//$Id: BreakDance.java 14760 2008-06-11 07:33:15Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.sequences.entities;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.TableGenerator;
+import javax.persistence.GenerationType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class BreakDance {
+	@Id
+	@GeneratedValue(generator = "memencoIdGen", strategy = GenerationType.TABLE)
+	@TableGenerator(
+		name = "memencoIdGen",
+		table = "hi_id_key",
+		pkColumnName = "id_key",
+		valueColumnName = "next_hi",
+		pkColumnValue = "issue",
+		allocationSize = 1
+	)
+	public Integer id;
+	public String name;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Bunny.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Bunny.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Bunny.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,46 @@
+//$Id: Bunny.java 14761 2008-06-11 13:51:06Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.sequences.entities;
+
+import java.io.Serializable;
+import java.math.BigInteger;
+import java.util.Set;
+
+import javax.persistence.Column;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+import org.hibernate.annotations.GenericGenerator;
+
+/**
+ * Blown precision on related entity when &#064;JoinColumn is used.
+ * 
+ * @see ANN-748
+ * @author Andrew C. Oliver andyspam at osintegrators.com
+ */
+ at Entity
+ at SuppressWarnings("serial")
+public class Bunny implements Serializable {
+	@Id
+	@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "java5_uuid")
+	@GenericGenerator(name = "java5_uuid", strategy = "org.hibernate.test.annotations.id.UUIDGenerator")
+	@Column(name = "id", precision = 128, scale = 0)
+	private BigInteger id;
+
+	@OneToMany(mappedBy = "bunny", cascade = { CascadeType.PERSIST })
+	Set<PointyTooth> teeth;
+	
+	@OneToMany(mappedBy = "bunny", cascade = { CascadeType.PERSIST })
+	Set<TwinkleToes> toes;
+
+	public void setTeeth(Set<PointyTooth> teeth) {
+		this.teeth = teeth;
+	}
+
+	public BigInteger getId() {
+		return id;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Computer.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Computer.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Computer.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,34 @@
+//$Id: Computer.java 14760 2008-06-11 07:33:15Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.sequences.entities;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity()
+public class Computer {
+	private Long id;
+	private String serialNumber;
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.TABLE)
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getSerialNumber() {
+		return serialNumber;
+	}
+
+	public void setSerialNumber(String serialNumber) {
+		this.serialNumber = serialNumber;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Department.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Department.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Department.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,33 @@
+//$Id: Department.java 14760 2008-06-11 07:33:15Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.sequences.entities;
+
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+/**
+ * Sample of method generator
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at SuppressWarnings("serial")
+public class Department implements Serializable {
+	private Long id;
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_DEPT")
+	@javax.persistence.SequenceGenerator(
+			name = "SEQ_DEPT",
+			sequenceName = "my_sequence"
+	)
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long long1) {
+		id = long1;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Dog.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Dog.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Dog.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,42 @@
+//$Id: Dog.java 14760 2008-06-11 07:33:15Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.sequences.entities;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+
+/**
+ * Share the generator table decribed by the GEN_TABLE GeneratedIdTable
+ * using the Dog key as discriminator
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "tbl_dog")
+ at TableGenerator(name = "DogGen", table = "GENERATOR_TABLE", pkColumnName = "pkey",
+		valueColumnName = "hi", pkColumnValue = "Dog", allocationSize = 10)
+public class Dog {
+	private Integer id;
+	private String name;
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.TABLE, generator = "DogGen")
+	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;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/FirTree.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/FirTree.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/FirTree.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,11 @@
+//$Id: FirTree.java 14760 2008-06-11 07:33:15Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.sequences.entities;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class FirTree extends Tree {
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Footballer.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Footballer.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Footballer.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,73 @@
+//$Id: Footballer.java 14760 2008-06-11 07:33:15Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.sequences.entities;
+
+import javax.persistence.DiscriminatorColumn;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at IdClass(FootballerPk.class)
+ at DiscriminatorColumn(name = "bibi")
+public class Footballer {
+	private String firstname;
+	private String lastname;
+	private String club;
+
+	public Footballer() {
+	}
+
+	public Footballer(String firstname, String lastname, String club) {
+		this.firstname = firstname;
+		this.lastname = lastname;
+		this.club = club;
+	}
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( !( o instanceof Footballer ) ) return false;
+
+		final Footballer footballer = (Footballer) o;
+
+		if ( !firstname.equals( footballer.firstname ) ) return false;
+		if ( !lastname.equals( footballer.lastname ) ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		int result;
+		result = firstname.hashCode();
+		result = 29 * result + lastname.hashCode();
+		return result;
+	}
+
+	@Id
+	public String getFirstname() {
+		return firstname;
+	}
+
+	public void setFirstname(String firstname) {
+		this.firstname = firstname;
+	}
+
+	@Id
+	public String getLastname() {
+		return lastname;
+	}
+
+	public void setLastname(String lastname) {
+		this.lastname = lastname;
+	}
+
+	public String getClub() {
+		return club;
+	}
+
+	public void setClub(String club) {
+		this.club = club;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/FootballerPk.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/FootballerPk.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/FootballerPk.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,62 @@
+//$Id: FootballerPk.java 14760 2008-06-11 07:33:15Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.sequences.entities;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+ at SuppressWarnings("serial")
+public class FootballerPk implements Serializable {
+	private String firstname;
+	private String lastname;
+
+	@Column(name = "fb_fname")
+	public String getFirstname() {
+		return firstname;
+	}
+
+	public String getLastname() {
+		return lastname;
+	}
+
+	public void setFirstname(String firstname) {
+		this.firstname = firstname;
+	}
+
+	public void setLastname(String lastname) {
+		this.lastname = lastname;
+	}
+
+	public FootballerPk() {
+	}
+
+	public FootballerPk(String firstname, String lastname) {
+		this.firstname = firstname;
+		this.lastname = lastname;
+
+	}
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( !( o instanceof FootballerPk ) ) return false;
+
+		final FootballerPk footballerPk = (FootballerPk) o;
+
+		if ( !firstname.equals( footballerPk.firstname ) ) return false;
+		if ( !lastname.equals( footballerPk.lastname ) ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		int result;
+		result = firstname.hashCode();
+		result = 29 * result + lastname.hashCode();
+		return result;
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Furniture.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Furniture.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Furniture.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,33 @@
+//$Id: Furniture.java 14760 2008-06-11 07:33:15Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.sequences.entities;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+import org.hibernate.annotations.GenericGenerator;
+import org.hibernate.annotations.Parameter;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Furniture {
+	private Integer id;
+
+	@Id
+	@GeneratedValue(generator = "hibseq")
+	@GenericGenerator(name = "hibseq", strategy = "seqhilo",
+			parameters = {
+			@Parameter(name = "max_lo", value = "5"),
+			@Parameter(name = "sequence", value = "heybabyhey")
+					}
+	)
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/GoalKeeper.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/GoalKeeper.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/GoalKeeper.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,17 @@
+//$Id: GoalKeeper.java 14760 2008-06-11 07:33:15Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.sequences.entities;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class GoalKeeper extends Footballer {
+	public GoalKeeper() {
+	}
+
+	public GoalKeeper(String firstname, String lastname, String club) {
+		super( firstname, lastname, club );
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Home.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Home.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Home.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,26 @@
+//$Id: Home.java 14760 2008-06-11 07:33:15Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.sequences.entities;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * Default sequence generation usage
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Home {
+	private Long id;
+
+	@Id
+	@GeneratedValue
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Location.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Location.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Location.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,35 @@
+//$Id: Location.java 14760 2008-06-11 07:33:15Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.sequences.entities;
+
+import java.io.Serializable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at SuppressWarnings("serial")
+public class Location implements Serializable {
+	public double longitude;
+	public double latitude;
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( o == null || getClass() != o.getClass() ) return false;
+
+		final Location location = (Location) o;
+
+		if ( Double.compare( location.latitude, latitude ) != 0 ) return false;
+		if ( Double.compare( location.longitude, longitude ) != 0 ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		int result;
+		long temp;
+		temp = longitude != +0.0d ? Double.doubleToLongBits( longitude ) : 0L;
+		result = (int) ( temp ^ ( temp >>> 32 ) );
+		temp = latitude != +0.0d ? Double.doubleToLongBits( latitude ) : 0L;
+		result = 29 * result + (int) ( temp ^ ( temp >>> 32 ) );
+		return result;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/MilitaryBuilding.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/MilitaryBuilding.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/MilitaryBuilding.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,18 @@
+//$Id: MilitaryBuilding.java 14760 2008-06-11 07:33:15Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.sequences.entities;
+
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.MappedSuperclass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MappedSuperclass
+ at IdClass(Location.class)
+public class MilitaryBuilding {
+	@Id
+	public double longitude;
+	@Id
+	public double latitude;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Monkey.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Monkey.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Monkey.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,24 @@
+//$
+package org.hibernate.test.annotations.id.sequences.entities;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Paul Cowan
+ */
+ at Entity
+public class Monkey {
+	private String id;
+
+	@Id
+	@GeneratedValue(generator = "system-uuid-2")
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Phone.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Phone.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Phone.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,29 @@
+//$Id: Phone.java 14760 2008-06-11 07:33:15Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.sequences.entities;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity()
+public class Phone {
+	private Integer id;
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "Phone_Gen")
+	@javax.persistence.SequenceGenerator(
+			name = "Phone_Gen",
+			sequenceName = "phone_seq"
+	)
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Planet.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Planet.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Planet.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,6 @@
+// $Id: Planet.java 14785 2008-06-19 10:44:33Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.sequences.entities;
+
+public enum Planet {
+	MERCURY, VENUS, EARTH, MARS, JUPITER, SATURN, URANUS, NEPTUNE, PLUTO;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/PlanetCheatSheet.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/PlanetCheatSheet.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/PlanetCheatSheet.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,85 @@
+package org.hibernate.test.annotations.id.sequences.entities;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.Id;
+
+
+/**
+ * Test entity for enum type as id.
+ * 
+ * @author Hardy Ferentschik
+ * @see ANN-744
+ */
+ at Entity
+public class PlanetCheatSheet {
+
+	@Id
+	@Enumerated(EnumType.STRING)
+	@Column(name = "planet")
+	private Planet planet;
+
+	private double mass;
+
+	private double radius;
+
+	private long numberOfInhabitants;
+
+	public Planet getPlanet() {
+		return planet;
+	}
+
+	public void setPlanet(Planet planet) {
+		this.planet = planet;
+	}
+
+	public double getMass() {
+		return mass;
+	}
+
+	public void setMass(double mass) {
+		this.mass = mass;
+	}
+
+	public double getRadius() {
+		return radius;
+	}
+
+	public void setRadius(double radius) {
+		this.radius = radius;
+	}
+
+	public long getNumberOfInhabitants() {
+		return numberOfInhabitants;
+	}
+
+	public void setNumberOfInhabitants(long numberOfInhabitants) {
+		this.numberOfInhabitants = numberOfInhabitants;
+	}
+
+	/**
+	 * Constructs a <code>String</code> with all attributes
+	 * in name = value format.
+	 *
+	 * @return a <code>String</code> representation 
+	 * of this object.
+	 */
+	public String toString()
+	{
+	    final String TAB = "    ";
+	    
+	    String retValue = "";
+	    
+	    retValue = "PlanetCheatSheet ( "
+	        + super.toString() + TAB
+	        + "planet = " + this.planet + TAB
+	        + "mass = " + this.mass + TAB
+	        + "radius = " + this.radius + TAB
+	        + "numberOfInhabitants = " + this.numberOfInhabitants + TAB
+	        + " )";
+	
+	    return retValue;
+	}	
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/PointyTooth.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/PointyTooth.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/PointyTooth.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,44 @@
+//$Id: PointyTooth.java 14761 2008-06-11 13:51:06Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.sequences.entities;
+
+import java.io.Serializable;
+import java.math.BigInteger;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+import org.hibernate.annotations.GenericGenerator;
+
+/**
+ * Blown precision on related entity when &#064;JoinColumn is used. 
+ * Does not cause an issue on HyperSonic, but replicates nicely on PGSQL.
+ * 
+ * @see ANN-748
+ * @author Andrew C. Oliver andyspam at osintegrators.com
+ */
+ at Entity
+ at SuppressWarnings("serial")
+public class PointyTooth implements Serializable {
+	@Id
+	@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "java5_uuid")
+	@GenericGenerator(name = "java5_uuid", strategy = "org.hibernate.test.annotations.id.UUIDGenerator")
+	@Column(name = "id", precision = 128, scale = 0)
+	private BigInteger id;
+
+	@ManyToOne
+    @JoinColumn(name = "bunny_id")
+	Bunny bunny;
+
+	public void setBunny(Bunny bunny) {
+		this.bunny = bunny;
+	}
+
+	public BigInteger getId() {
+		return id;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Shoe.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Shoe.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Shoe.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,29 @@
+//$Id: Shoe.java 14760 2008-06-11 07:33:15Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.sequences.entities;
+
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+/**
+ * sample of Sequance generator
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at SuppressWarnings("serial")
+public class Shoe implements Serializable {
+	private Long id;
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_GEN")
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long long1) {
+		id = long1;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/SoundSystem.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/SoundSystem.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/SoundSystem.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,42 @@
+//$Id: SoundSystem.java 14760 2008-06-11 07:33:15Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.sequences.entities;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class SoundSystem {
+	private String id;
+	private String brand;
+	private String model;
+
+	@Id
+	@GeneratedValue(generator = "system-uuid")
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	public String getBrand() {
+		return brand;
+	}
+
+	public void setBrand(String brand) {
+		this.brand = brand;
+	}
+
+	public String getModel() {
+		return model;
+	}
+
+	public void setModel(String model) {
+		this.model = model;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Store.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Store.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Store.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,33 @@
+//$Id: Store.java 14760 2008-06-11 07:33:15Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.sequences.entities;
+
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+/**
+ * Sample of class generator
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at javax.persistence.SequenceGenerator(
+		name = "SEQ_STORE",
+		sequenceName = "my_sequence"
+)
+ at SuppressWarnings("serial")
+public class Store implements Serializable {
+	private Long id;
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_STORE")
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long long1) {
+		id = long1;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Tower.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Tower.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Tower.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,14 @@
+//$Id: Tower.java 14760 2008-06-11 07:33:15Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.sequences.entities;
+
+import javax.persistence.AttributeOverride;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at AttributeOverride(name = "longitude", column = @Column(name = "fld_longitude"))
+public class Tower extends MilitaryBuilding {
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Tree.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Tree.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/Tree.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,24 @@
+//$Id: Tree.java 14760 2008-06-11 07:33:15Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.sequences.entities;
+
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.MappedSuperclass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MappedSuperclass
+public class Tree {
+	private Integer id;
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/TwinkleToes.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/TwinkleToes.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/entities/TwinkleToes.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,42 @@
+//$Id: TwinkleToes.java 14761 2008-06-11 13:51:06Z hardy.ferentschik $
+package org.hibernate.test.annotations.id.sequences.entities;
+
+import java.io.Serializable;
+import java.math.BigInteger;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+
+import org.hibernate.annotations.GenericGenerator;
+
+/**
+ * Blown precision on related entity when &#064;JoinColumn is used. 
+ * Does not cause an issue on HyperSonic, but replicates nicely on PGSQL.
+ * 
+ * @see ANN-748
+ * @author Andrew C. Oliver andyspam at osintegrators.com
+ */
+ at Entity
+ at SuppressWarnings("serial")
+public class TwinkleToes implements Serializable {
+	@Id
+	@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "java5_uuid")
+	@GenericGenerator(name = "java5_uuid", strategy = "org.hibernate.test.annotations.id.UUIDGenerator")
+	@Column(name = "id", precision = 128, scale = 0)
+	private BigInteger id;
+
+	@ManyToOne
+	Bunny bunny;
+
+	public void setBunny(Bunny bunny) {
+		this.bunny = bunny;
+	}
+
+	public BigInteger getId() {
+		return id;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/package-info.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/package-info.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/id/sequences/package-info.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,11 @@
+//$Id: package-info.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+/**
+ * Test package for metatata facilities
+ * It contains an example of package level metadata
+ */
+ at org.hibernate.annotations.GenericGenerator(name = "system-uuid", strategy = "uuid")
+ at org.hibernate.annotations.GenericGenerators(
+		@org.hibernate.annotations.GenericGenerator(name = "system-uuid-2", strategy = "uuid")
+)
+package org.hibernate.test.annotations.id.sequences;
+

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/identifiercollection/IdentifierCollectionTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/identifiercollection/IdentifierCollectionTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/identifiercollection/IdentifierCollectionTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,45 @@
+//$Id: IdentifierCollectionTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.identifiercollection;
+
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class IdentifierCollectionTest extends TestCase {
+	public void testIdBag() throws Exception {
+		Passport passport = new Passport();
+		passport.setName( "Emmanuel Bernard" );
+		Stamp canada = new Stamp();
+		canada.setCountry( "Canada" );
+		passport.getStamps().add( canada );
+		passport.getVisaStamp().add( canada );
+		Stamp norway = new Stamp();
+		norway.setCountry( "Norway" );
+		passport.getStamps().add( norway );
+		passport.getStamps().add(canada);
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		s.persist( passport );
+		s.flush();
+		//s.clear();
+		passport = (Passport) s.get( Passport.class, passport.getId() );
+		int canadaCount = 0;
+		for ( Stamp stamp : passport.getStamps() ) {
+			if ( "Canada".equals( stamp.getCountry() ) ) canadaCount++;
+		}
+		assertEquals( 2, canadaCount );
+		assertEquals( 1, passport.getVisaStamp().size() );
+		tx.rollback();
+		s.close();
+	}
+	protected Class[] getMappings() {
+		return new Class[] {
+				Passport.class,
+				Stamp.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/identifiercollection/Passport.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/identifiercollection/Passport.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/identifiercollection/Passport.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,70 @@
+//$Id: Passport.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.identifiercollection;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+import javax.persistence.TableGenerator;
+
+import org.hibernate.annotations.CollectionId;
+import org.hibernate.annotations.Type;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at TableGenerator(name="ids_generator", table="IDS")
+public class Passport {
+	@Id @GeneratedValue @Column(name="passport_id") private Long id;
+	private String name;
+
+	@ManyToMany(cascade = CascadeType.ALL)
+	@JoinTable(name="PASSPORT_STAMP")
+	@CollectionId(columns = @Column(name="COLLECTION_ID"), type=@Type(type="long"), generator = "generator")
+	@TableGenerator(name="generator", table="IDSTAMP")
+	private Collection<Stamp> stamps = new ArrayList();
+
+	@ManyToMany(cascade = CascadeType.ALL)
+	@JoinTable(name="PASSPORT_VISASTAMP")
+	@CollectionId(columns = @Column(name="COLLECTION_ID"), type=@Type(type="long"), generator = "ids_generator")
+	//TODO test identity generator
+	private Collection<Stamp> visaStamp = new ArrayList();
+
+	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<Stamp> getStamps() {
+		return stamps;
+	}
+
+	public void setStamps(Collection<Stamp> stamps) {
+		this.stamps = stamps;
+	}
+
+	public Collection<Stamp> getVisaStamp() {
+		return visaStamp;
+	}
+
+	public void setVisaStamp(Collection<Stamp> visaStamp) {
+		this.visaStamp = visaStamp;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/identifiercollection/Stamp.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/identifiercollection/Stamp.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/identifiercollection/Stamp.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,31 @@
+//$Id: Stamp.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.identifiercollection;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Stamp {
+	@Id @GeneratedValue private Long id;
+	private String country;
+
+	public String getCountry() {
+		return country;
+	}
+
+	public void setCountry(String country) {
+		this.country = country;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/BasketItems.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/BasketItems.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/BasketItems.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,56 @@
+//$
+package org.hibernate.test.annotations.idmanytoone;
+
+import java.io.Serializable;
+import javax.persistence.IdClass;
+import javax.persistence.Id;
+import javax.persistence.Column;
+import javax.persistence.CascadeType;
+import javax.persistence.FetchType;
+import javax.persistence.JoinColumn;
+import javax.persistence.Table;
+import javax.persistence.ManyToOne;
+import javax.persistence.Basic;
+import javax.persistence.JoinColumns;
+import javax.persistence.Entity;
+
+ at Entity
+ at Table(name="BasketItems")
+ at org.hibernate.annotations.Proxy(lazy=false)
+ at IdClass(BasketItemsPK.class)
+public class BasketItems implements Serializable {
+
+	private static final long serialVersionUID = -4580497316918713849L;
+
+	@Id
+	@ManyToOne(cascade={ CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH })
+	@JoinColumns({ @JoinColumn(name="basketDatetime", referencedColumnName="basketDatetime"), @JoinColumn(name="customerID", referencedColumnName="customerID") })
+	@Basic(fetch= FetchType.LAZY)
+	private ShoppingBaskets shoppingBaskets;
+
+	@Column(name="cost", nullable=false)
+	@Id
+	private Double cost;
+
+	public void setCost(double value) {
+		setCost(new Double(value));
+	}
+
+	public void setCost(Double value) {
+		this.cost = value;
+	}
+
+	public Double getCost() {
+		return cost;
+	}
+
+	public void setShoppingBaskets(ShoppingBaskets value) {
+		this.shoppingBaskets = value;
+	}
+
+	public ShoppingBaskets getShoppingBaskets() {
+		return shoppingBaskets;
+	}
+
+}
+

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/BasketItemsPK.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/BasketItemsPK.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/BasketItemsPK.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,72 @@
+//$
+package org.hibernate.test.annotations.idmanytoone;
+
+import java.io.Serializable;
+import javax.persistence.CascadeType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
+import javax.persistence.Column;
+import javax.persistence.ManyToOne;
+import javax.persistence.Basic;
+import javax.persistence.Embeddable;
+import javax.persistence.FetchType;
+
+ at Embeddable
+public class BasketItemsPK implements Serializable {
+
+	private static final long serialVersionUID = 3585214409096105241L;
+
+	public boolean equals(Object aObj) {
+		if (aObj == this)
+			return true;
+		if (!(aObj instanceof BasketItemsPK))
+			return false;
+		BasketItemsPK basketitemspk = (BasketItemsPK)aObj;
+		if (getShoppingBaskets() == null && basketitemspk.getShoppingBaskets() != null)
+			return false;
+		if (!getShoppingBaskets().equals(basketitemspk.getShoppingBaskets()))
+			return false;
+		if ((getCost() != null && !getCost().equals(basketitemspk.getCost())) || (getCost() == null && basketitemspk.getCost() != null))
+			return false;
+		return true;
+	}
+
+	public int hashCode() {
+		int hashcode = 0;
+		if (getShoppingBaskets() != null) {
+			hashcode = hashcode + (getShoppingBaskets().getOwner() == null ? 0 : getShoppingBaskets().getOwner().hashCode());
+			hashcode = hashcode + (getShoppingBaskets().getBasketDatetime() == null ? 0 : getShoppingBaskets().getBasketDatetime().hashCode());
+		}
+		hashcode = hashcode + (getCost() == null ? 0 : getCost().hashCode());
+		return hashcode;
+	}
+
+	@Id
+	@ManyToOne(cascade={ CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH })
+	@JoinColumns({ @JoinColumn(name="basketDatetime", referencedColumnName="basketDatetime"), @JoinColumn(name="customerID", referencedColumnName="customerID") })
+	@Basic(fetch= FetchType.LAZY)
+	private ShoppingBaskets shoppingBaskets;
+
+	public void setShoppingBaskets(ShoppingBaskets value)  {
+		this.shoppingBaskets =  value;
+	}
+
+	public ShoppingBaskets getShoppingBaskets()  {
+		return this.shoppingBaskets;
+	}
+
+	@Column(name="cost", nullable=false)
+	@Id
+	private Double cost;
+
+	public void setCost(Double value)  {
+		this.cost =  value;
+	}
+
+	public Double getCost()  {
+		return this.cost;
+	}
+
+}
+

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/Card.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/Card.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/Card.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,70 @@
+//$Id: Card.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.idmanytoone;
+
+import java.io.Serializable;
+import java.util.Set;
+import javax.persistence.Embeddable;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+import javax.persistence.CascadeType;
+import javax.persistence.FetchType;
+import javax.persistence.OneToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Card {
+
+	@Id
+	private CardPrimaryKey primaryKey = new CardPrimaryKey();
+
+	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "primaryKey.card")
+	private Set<CardField> fields;
+
+	@ManyToOne
+	private CardField mainCardField;
+
+	@Embeddable
+	public static class CardPrimaryKey implements Serializable {
+
+		public CardPrimaryKey() {}
+
+		@ManyToOne(optional = false)
+		private Project project;
+
+		public Project getProject() {
+			return project;
+		}
+
+		public void setProject(Project project) {
+			this.project = project;
+		}
+
+	}
+
+	public Set<CardField> getFields() {
+		return fields;
+	}
+
+	public void setFields(Set<CardField> fields) {
+		this.fields = fields;
+	}
+
+	public CardPrimaryKey getPrimaryKey() {
+		return primaryKey;
+	}
+
+	public void setPrimaryKey(CardPrimaryKey primaryKey) {
+		this.primaryKey = primaryKey;
+	}
+
+	public CardField getMainCardField() {
+		return mainCardField;
+	}
+
+	public void setMainCardField(CardField mainCardField) {
+		this.mainCardField = mainCardField;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/CardField.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/CardField.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/CardField.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,64 @@
+//$Id: CardField.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.idmanytoone;
+
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class CardField {
+
+	@Id
+	private PrimaryKey primaryKey = new PrimaryKey();
+
+	@ManyToOne
+	private Card cardtmp;
+
+	@Embeddable
+	public static class PrimaryKey implements Serializable {
+
+		@ManyToOne(optional = false)
+		private Card card;
+
+		@ManyToOne(optional = false)
+		private CardKey key;
+
+		public Card getCard() {
+			return card;
+		}
+
+		public void setCard(Card card) {
+			this.card = card;
+		}
+
+		public CardKey getKey() {
+			return key;
+		}
+
+		public void setKey(CardKey key) {
+			this.key = key;
+		}
+	}
+
+	public Card getCardtmp() {
+		return cardtmp;
+	}
+
+	public void setCardtmp(Card cardtmp) {
+		this.cardtmp = cardtmp;
+	}
+
+	public PrimaryKey getPrimaryKey() {
+		return primaryKey;
+	}
+
+	public void setPrimaryKey(PrimaryKey primaryKey) {
+		this.primaryKey = primaryKey;
+	}
+}
+

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/CardKey.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/CardKey.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/CardKey.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,24 @@
+//$Id: CardKey.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.idmanytoone;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class CardKey {
+	@Id
+	@GeneratedValue
+	private int id;
+
+	public int getId() {
+		return id;
+	}
+
+	public void setId(int id) {
+		this.id = id;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/Customer.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/Customer.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/Customer.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,28 @@
+//$Id: Customer.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.idmanytoone;
+
+import java.io.Serializable;
+import java.util.Set;
+import javax.persistence.Table;
+import javax.persistence.Entity;
+import javax.persistence.OneToMany;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+
+
+
+ at Entity
+ at Table(name = "Bs")
+public class Customer implements Serializable {
+    @Id @GeneratedValue
+	public Integer id;
+
+    @OneToMany(mappedBy = "customer")
+    public Set<StoreCustomer> stores;
+
+    private static final long serialVersionUID = 3818501706063039923L;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/Customers.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/Customers.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/Customers.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,48 @@
+//$
+package org.hibernate.test.annotations.idmanytoone;
+
+import java.io.Serializable;
+import javax.persistence.Id;
+import javax.persistence.Column;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+ at Entity
+ at Table(name="Customers")
+ at org.hibernate.annotations.Proxy(lazy=false)
+public class Customers implements Serializable {
+
+	private static final long serialVersionUID = -885167444315163039L;
+
+	@Column(name="customerID", nullable=false)
+	@Id
+	private int customerID;
+
+	@OneToMany(mappedBy="owner", cascade= CascadeType.ALL, targetEntity=ShoppingBaskets.class)
+	@org.hibernate.annotations.LazyCollection(org.hibernate.annotations.LazyCollectionOption.TRUE)
+	private java.util.Set shoppingBasketses = new java.util.HashSet();
+
+	public void setCustomerID(int value) {
+		this.customerID = value;
+	}
+
+	public int getCustomerID() {
+		return customerID;
+	}
+
+	public int getORMID() {
+		return getCustomerID();
+	}
+
+	public void setShoppingBasketses(java.util.Set value) {
+		this.shoppingBasketses = value;
+	}
+
+	public java.util.Set getShoppingBasketses() {
+		return shoppingBasketses;
+	}
+
+}
+

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/IdManyToOneTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/IdManyToOneTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/IdManyToOneTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,82 @@
+//$Id: IdManyToOneTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.idmanytoone;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class IdManyToOneTest extends TestCase {
+	public void testFkCreationOrdering() throws Exception {
+		//no real test case, the sessionFactory building is tested
+		Session s = openSession();
+		s.close();
+	}
+
+	public void getBiDirOneToManyInId() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		CardKey key = new CardKey();
+		s.persist( key );
+		Project project = new Project();
+		s.persist( project );
+		Card card = new Card();
+		card.getPrimaryKey().setProject( project );
+		s.persist( card );
+		CardField field = new CardField();
+		field.getPrimaryKey().setKey( key );
+		field.getPrimaryKey().setCard( card );
+		s.persist( field );
+		card.setMainCardField( field );
+		s.flush();
+		s.clear();
+		card = (Card) s.createQuery( "from Card c").list().get(0);
+		assertEquals( 1, card.getFields().size() );
+		assertEquals( card.getMainCardField(), card.getFields().iterator().next() );
+		tx.rollback();
+		s.close();
+	}
+
+	public void testIdClassManyToOne() {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Store store = new Store();
+		Customer customer = new Customer();
+		s.persist( store );
+		s.persist( customer );
+		StoreCustomer sc = new StoreCustomer( store, customer );
+		s.persist( sc );
+		s.flush();
+		s.clear();
+
+		store = (Store) s.get(Store.class, store.id );
+		assertEquals( 1, store.customers.size() );
+		assertEquals( customer.id, store.customers.iterator().next().customer.id );
+		tx.rollback();
+
+		//TODO test Customers / ShoppingBaskets / BasketItems testIdClassManyToOneWithReferenceColumn
+		s.close();
+	}
+
+	protected Class[] getMappings() {
+		return new Class[] {
+				Store.class,
+				Customer.class,
+				StoreCustomer.class,
+				CardKey.class,
+				CardField.class,
+				Card.class,
+				Project.class,
+
+				//tested only through deployment
+				//ANN-590 testIdClassManyToOneWithReferenceColumn 
+				Customers.class,
+				ShoppingBaskets.class,
+				ShoppingBasketsPK.class,
+				BasketItems.class,
+				BasketItemsPK.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/Project.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/Project.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/Project.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,25 @@
+//$Id: Project.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.idmanytoone;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Project {
+
+	@Id
+	@GeneratedValue
+	private int id;
+
+	public int getId() {
+		return id;
+	}
+
+	public void setId(int id) {
+		this.id = id;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/ShoppingBaskets.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/ShoppingBaskets.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/ShoppingBaskets.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,66 @@
+//$
+package org.hibernate.test.annotations.idmanytoone;
+
+import java.io.Serializable;
+
+import javax.persistence.Basic;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+ at Entity
+ at Table(name="ShoppingBasket")
+ at org.hibernate.annotations.Proxy(lazy=false)
+ at IdClass(ShoppingBasketsPK.class)
+public class ShoppingBaskets implements Serializable {
+
+	private static final long serialVersionUID = 4739240471638885734L;
+
+	@Id
+	@ManyToOne(cascade={ CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH })
+	@JoinColumns({ @JoinColumn(name="customerID", referencedColumnName="customerID") })
+	@Basic(fetch=FetchType.LAZY)
+	private Customers owner;
+
+	@Column(name="basketDatetime", nullable=false)
+	@Id
+	private java.util.Date basketDatetime;
+
+	@OneToMany(mappedBy="shoppingBaskets", cascade=CascadeType.ALL, targetEntity=BasketItems.class)
+	@org.hibernate.annotations.LazyCollection(org.hibernate.annotations.LazyCollectionOption.TRUE)
+	private java.util.Set items = new java.util.HashSet();
+	
+	public void setBasketDatetime(java.util.Date value) {
+		this.basketDatetime = value;
+	}
+
+	public java.util.Date getBasketDatetime() {
+		return basketDatetime;
+	}
+
+	public void setOwner(Customers value) {
+		this.owner = value;
+	}
+
+	public Customers getOwner() {
+		return owner;
+	}
+
+	public void setItems(java.util.Set value) {
+		this.items = value;
+	}
+
+	public java.util.Set getItems() {
+		return items;
+	}
+
+}
+

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/ShoppingBasketsPK.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/ShoppingBasketsPK.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/ShoppingBasketsPK.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,70 @@
+//$
+package org.hibernate.test.annotations.idmanytoone;
+
+import java.io.Serializable;
+import javax.persistence.CascadeType;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+import javax.persistence.JoinColumns;
+import javax.persistence.FetchType;
+import javax.persistence.Basic;
+import javax.persistence.JoinColumn;
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+
+ at Embeddable
+public class ShoppingBasketsPK implements Serializable {
+	private static final long serialVersionUID = 4121297376338222776L;
+
+	public boolean equals(Object aObj) {
+		if (aObj == this)
+			return true;
+		if (!(aObj instanceof ShoppingBasketsPK))
+			return false;
+		ShoppingBasketsPK shoppingbasketspk = (ShoppingBasketsPK)aObj;
+		if (getOwner() == null && shoppingbasketspk.getOwner() != null)
+			return false;
+		if (!getOwner().equals(shoppingbasketspk.getOwner()))
+			return false;
+		if (getBasketDatetime() != shoppingbasketspk.getBasketDatetime())
+			return false;
+		return true;
+	}
+
+	public int hashCode() {
+		int hashcode = 0;
+		if (getOwner() != null) {
+			hashcode = hashcode + (int) getOwner().getORMID();
+		}
+		hashcode = hashcode + (getBasketDatetime() == null ? 0 : getBasketDatetime().hashCode());
+		return hashcode;
+	}
+
+	@Id
+	@ManyToOne(cascade={ CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH })
+	@JoinColumns({ @JoinColumn(name="customerID", referencedColumnName="customerID") })
+	@Basic(fetch= FetchType.LAZY)
+	private Customers owner;
+
+	public void setOwner(Customers value)  {
+		this.owner =  value;
+	}
+
+	public Customers getOwner()  {
+		return this.owner;
+	}
+
+	@Column(name="basketDatetime", nullable=false)
+	@Id
+	private java.util.Date basketDatetime;
+
+	public void setBasketDatetime(java.util.Date value)  {
+		this.basketDatetime =  value;
+	}
+
+	public java.util.Date getBasketDatetime()  {
+		return this.basketDatetime;
+	}
+
+}
+

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/Store.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/Store.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/Store.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,27 @@
+//$Id: Store.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.idmanytoone;
+
+import java.io.Serializable;
+import java.util.Set;
+import javax.persistence.Table;
+import javax.persistence.Entity;
+import javax.persistence.OneToMany;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "`As`")
+public class Store implements Serializable {
+    @Id @GeneratedValue
+	public Integer id;
+
+    @OneToMany(mappedBy = "store")
+    public Set<StoreCustomer> customers;
+
+
+    private static final long serialVersionUID = 1748046699322502790L;
+}
+

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/StoreCustomer.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/StoreCustomer.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/StoreCustomer.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,38 @@
+//$Id: StoreCustomer.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.idmanytoone;
+
+import java.io.Serializable;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.IdClass;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "ABs")
+ at IdClass( StoreCustomerPK.class)
+public class StoreCustomer implements Serializable {
+	StoreCustomer() {}
+	@Id
+    @ManyToOne(optional = false)
+    @JoinColumn(name = "idA")
+    public Store store;
+
+    @Id
+	@ManyToOne(optional = false)
+    @JoinColumn(name = "idB")
+    public Customer customer;
+
+
+    public StoreCustomer(Store store, Customer customer) {
+	this.store = store;
+	this.customer = customer;
+    }
+
+
+    private static final long serialVersionUID = -8295955012787627232L;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/StoreCustomerPK.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/StoreCustomerPK.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/StoreCustomerPK.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,32 @@
+//$Id: StoreCustomerPK.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.idmanytoone;
+
+import java.io.Serializable;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class StoreCustomerPK implements Serializable {
+	StoreCustomerPK() {}
+	@Id
+    @ManyToOne(optional = false)
+    @JoinColumn(name = "idA")
+    public Store store;
+
+    @Id
+	@ManyToOne(optional = false)
+    @JoinColumn(name = "idB")
+    public Customer customer;
+
+
+    public StoreCustomerPK(Store store, Customer customer) {
+	this.store = store;
+	this.customer = customer;
+    }
+
+
+    private static final long serialVersionUID = -1102111921432271459L;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/A.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/A.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/A.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,39 @@
+//$
+package org.hibernate.test.annotations.idmanytoone.alphabetical;
+
+import java.util.List;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+ at Entity
+public class A {
+
+	@Id
+	private int id;
+
+	@OneToMany( mappedBy = "parent" )
+	List<C> children;
+
+	public A() {
+	}
+
+	public int getId() {
+		return id;
+	}
+
+	public void setId(int id) {
+		this.id = id;
+	}
+
+	public List<C> getChildren() {
+		return children;
+	}
+
+	public void setChildren(List<C> children) {
+		this.children = children;
+	}
+
+
+}
+

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/Acces.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/Acces.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/Acces.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,17 @@
+//$
+package org.hibernate.test.annotations.idmanytoone.alphabetical;
+
+import java.io.Serializable;
+import java.math.BigInteger;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+
+ at Entity
+public class Acces implements Serializable {
+	@Id
+	private BigInteger idpk;
+
+	@ManyToOne
+	private Droitacces idpkdracc;
+}
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/AlphabeticalIdManyToOneTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/AlphabeticalIdManyToOneTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/AlphabeticalIdManyToOneTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,24 @@
+//$
+package org.hibernate.test.annotations.idmanytoone.alphabetical;
+
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class AlphabeticalIdManyToOneTest extends TestCase {
+	public void testAlphabeticalTest() throws Exception {
+		//test through deployment
+	}
+
+
+	protected Class[] getMappings() {
+		return new Class[] {
+				B.class,
+				C.class,
+				A.class
+
+
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/AlphabeticalManyToOneTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/AlphabeticalManyToOneTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/AlphabeticalManyToOneTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,22 @@
+//$
+package org.hibernate.test.annotations.idmanytoone.alphabetical;
+
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class AlphabeticalManyToOneTest extends TestCase {
+	public void testAlphabeticalTest() throws Exception {
+		//test through deployment
+	}
+
+	protected Class[] getMappings() {
+		return new Class[] {
+				Acces.class,
+				Droitacces.class,
+				Benefserv.class,
+				Service.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/B.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/B.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/B.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,39 @@
+//$
+package org.hibernate.test.annotations.idmanytoone.alphabetical;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+
+ at Entity
+ at IdClass( BId.class )
+public class B {
+
+	@Id
+	private C parent;
+
+	@Id
+	private int sequenceNumber;
+
+	public B() {
+	}
+
+	public C getParent() {
+		return parent;
+	}
+
+	public void setParent(C parent) {
+		this.parent = parent;
+	}
+
+	public int getSequenceNumber() {
+		return sequenceNumber;
+	}
+
+	public void setSequenceNumber(int sequenceNumber) {
+		this.sequenceNumber = sequenceNumber;
+	}
+
+
+}
+

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/BId.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/BId.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/BId.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,69 @@
+//$
+package org.hibernate.test.annotations.idmanytoone.alphabetical;
+
+import java.io.Serializable;
+import javax.persistence.Embeddable;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
+import javax.persistence.ManyToOne;
+
+ at Embeddable
+public class BId implements Serializable {
+
+	@ManyToOne
+	@JoinColumns( {
+	@JoinColumn( name = "aId", nullable = false ),
+	@JoinColumn( name = "bSequenceNumber", nullable = false )
+			} )
+	private C parent;
+
+	private int sequenceNumber;
+
+	public BId() {
+	}
+
+	public C getParent() {
+		return parent;
+	}
+
+	public void setParent(C parent) {
+		this.parent = parent;
+	}
+
+	public int getSequenceNumber() {
+		return sequenceNumber;
+	}
+
+	public void setSequenceNumber(int sequenceNumber) {
+		this.sequenceNumber = sequenceNumber;
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + ( ( parent == null ) ? 0 : parent.hashCode() );
+		result = prime * result + sequenceNumber;
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if ( this == obj )
+			return true;
+		if ( obj == null )
+			return false;
+		if ( getClass() != obj.getClass() )
+			return false;
+		final BId other = (BId) obj;
+		if ( parent == null ) {
+			if ( other.parent != null )
+				return false;
+		}
+		else if ( !parent.equals( other.parent ) )
+			return false;
+		if ( sequenceNumber != other.sequenceNumber )
+			return false;
+		return true;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/Benefserv.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/Benefserv.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/Benefserv.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,17 @@
+//$
+package org.hibernate.test.annotations.idmanytoone.alphabetical;
+
+import java.math.BigInteger;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+
+ at Entity
+public class Benefserv {
+	@Id
+	private BigInteger idpk;
+
+	@ManyToOne
+	private Service idpkser;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/C.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/C.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/C.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,52 @@
+//$
+package org.hibernate.test.annotations.idmanytoone.alphabetical;
+
+import java.util.List;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.OneToMany;
+
+ at Entity
+ at IdClass( CId.class )
+public class C {
+
+	@Id
+	private A parent;
+
+	@Id
+	private int sequenceNumber;
+
+	@OneToMany( mappedBy = "parent" )
+	List<B> children;
+
+	public C() {
+	}
+
+	public A getParent() {
+		return parent;
+	}
+
+	public void setParent(A parent) {
+		this.parent = parent;
+	}
+
+	public int getSequenceNumber() {
+		return sequenceNumber;
+	}
+
+	public void setSequenceNumber(int sequenceNumber) {
+		this.sequenceNumber = sequenceNumber;
+	}
+
+	public List<B> getChildren() {
+		return children;
+	}
+
+	public void setChildren(List<B> children) {
+		this.children = children;
+	}
+
+
+}
+

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/CId.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/CId.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/CId.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,67 @@
+//$
+package org.hibernate.test.annotations.idmanytoone.alphabetical;
+
+import java.io.Serializable;
+import javax.persistence.Embeddable;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+ at Embeddable
+public class CId implements Serializable {
+
+	@ManyToOne
+	@JoinColumn( name = "aId", nullable = false )
+	private A parent;
+
+	private int sequenceNumber;
+
+	public CId() {
+	}
+
+	public A getParent() {
+		return parent;
+	}
+
+	public void setParent(A parent) {
+		this.parent = parent;
+	}
+
+	public int getSequenceNumber() {
+		return sequenceNumber;
+	}
+
+	public void setSequenceNumber(int sequenceNumber) {
+		this.sequenceNumber = sequenceNumber;
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + ( ( parent == null ) ? 0 : parent.hashCode() );
+		result = prime * result + sequenceNumber;
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if ( this == obj )
+			return true;
+		if ( obj == null )
+			return false;
+		if ( getClass() != obj.getClass() )
+			return false;
+		final CId other = (CId) obj;
+		if ( parent == null ) {
+			if ( other.parent != null )
+				return false;
+		}
+		else if ( !parent.equals( other.parent ) )
+			return false;
+		if ( sequenceNumber != other.sequenceNumber )
+			return false;
+		return true;
+	}
+
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/Droitacces.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/Droitacces.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/Droitacces.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,17 @@
+//$
+package org.hibernate.test.annotations.idmanytoone.alphabetical;
+
+import java.math.BigInteger;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+
+ at Entity
+public class Droitacces {
+	@Id
+	private BigInteger idpk;
+
+	@ManyToOne
+	private Benefserv idpkbenef;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/Service.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/Service.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/idmanytoone/alphabetical/Service.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,14 @@
+//$
+package org.hibernate.test.annotations.idmanytoone.alphabetical;
+
+import java.math.BigInteger;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+
+ at Entity
+public class Service {
+    @Id
+    private BigInteger idpk;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/immutable/Country.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/immutable/Country.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/immutable/Country.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,57 @@
+//$Id: Country.java 14801 2008-06-24 19:03:32Z hardy.ferentschik $
+package org.hibernate.test.annotations.immutable;
+
+/**
+ * @author Hardy Ferentschik
+ */
+import java.io.Serializable;
+import java.util.List;
+
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+import org.hibernate.annotations.Cascade;
+import org.hibernate.annotations.Immutable;
+
+ at Entity
+ at Immutable
+ at SuppressWarnings("serial")
+public class Country implements Serializable {
+	private Integer id;
+	
+	private String name;
+	
+	private List<State> states;
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setId(Integer integer) {
+		id = integer;
+	}
+
+	public void setName(String string) {
+		name = string;
+	}
+
+	@OneToMany(fetch = FetchType.LAZY)
+	@Cascade(org.hibernate.annotations.CascadeType.ALL)
+	@Immutable
+	public List<State> getStates() {
+		return states;
+	}
+	
+	public void setStates(List<State> states) {
+		this.states = states;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/immutable/Foobar.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/immutable/Foobar.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/immutable/Foobar.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,37 @@
+// $Id: Foobar.java 14801 2008-06-24 19:03:32Z hardy.ferentschik $
+package org.hibernate.test.annotations.immutable;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+import org.hibernate.annotations.Immutable;
+
+/**
+ * @author Hardy Ferentschik
+ */
+ at Entity
+public class Foobar {
+	@Id
+	@GeneratedValue
+	private Integer id;
+	
+	@Immutable
+	private String 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;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/immutable/ImmutableTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/immutable/ImmutableTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/immutable/ImmutableTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,165 @@
+//$Id: ImmutableTest.java 16426 2009-04-23 16:01:18Z jcosta at redhat.com $
+package org.hibernate.test.annotations.immutable;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.hibernate.AnnotationException;
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.AnnotationConfiguration;
+import org.hibernate.dialect.SQLServerDialect;
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.test.annotations.fkcircularity.A;
+import org.hibernate.test.annotations.fkcircularity.B;
+import org.hibernate.test.annotations.fkcircularity.C;
+import org.hibernate.test.annotations.fkcircularity.D;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Tests for <code>Immutable</code> annotation.
+ * 
+ * @author Hardy Ferentschik
+ */
+ at SuppressWarnings("unchecked")
+public class ImmutableTest extends TestCase {
+
+	private Logger log = LoggerFactory.getLogger(ImmutableTest.class);
+
+	public ImmutableTest(String x) {
+		super(x);
+	}
+
+	public void testImmutableEntity() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Country country = new Country();
+		country.setName("Germany");
+		s.persist(country);
+		tx.commit();
+		s.close();
+
+		// try changing the entity
+		s = openSession();
+		tx = s.beginTransaction();
+		Country germany = (Country) s.get(Country.class, country.getId());
+		assertNotNull(germany);
+		germany.setName("France");
+		assertEquals("Local name can be changed", "France", germany.getName());
+		s.save(germany);
+		tx.commit();
+		s.close();
+		
+		// retrieving the country again - it should be unmodified
+		s = openSession();
+		tx = s.beginTransaction();
+		germany = (Country) s.get(Country.class, country.getId());
+		assertNotNull(germany);
+		assertEquals("Name should not have changed", "Germany", germany.getName());
+		tx.commit();
+		s.close();
+		
+//		// try deletion
+//		s = openSession();
+//		tx = s.beginTransaction();
+//		s.delete(germany);
+//		tx.commit();
+//		s.close();
+//		
+//		s = openSession();
+//		tx = s.beginTransaction();
+//		germany = (Country) s.get(Country.class, country.getId());
+//		assertNotNull(germany);
+//		assertEquals("Name should not have changed", "Germany", germany.getName());
+//		s.close();
+	}
+	
+	public void testImmutableCollection() {
+		Country country = new Country();
+		country.setName("Germany");
+		List states = new ArrayList<State>();
+		State bayern = new State();
+		bayern.setName("Bayern");
+		State hessen = new State();
+		hessen.setName("Hessen");
+		State sachsen = new State();
+		sachsen.setName("Sachsen");
+		states.add(bayern);
+		states.add(hessen);
+		states.add(sachsen);
+		country.setStates(states);
+		
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		s.persist(country);
+		tx.commit();
+		s.close();
+		
+		s = openSession();
+		tx = s.beginTransaction();
+		Country germany = (Country) s.get(Country.class, country.getId());
+		assertNotNull(germany);
+		assertEquals("Wrong number of states", 3, germany.getStates().size());
+		
+		// try adding a state
+		State foobar = new State();
+		foobar.setName("foobar");
+		s.save(foobar);
+		germany.getStates().add(foobar);
+		try {
+			tx.commit();
+			fail();
+		} catch (HibernateException e) {
+			assertTrue(e.getMessage().contains("changed an immutable collection instance"));
+			log.debug("success");
+		}
+		s.close();
+		
+		s = openSession();
+		tx = s.beginTransaction();
+		germany = (Country) s.get(Country.class, country.getId());
+		assertNotNull(germany);
+		assertEquals("Wrong number of states", 3, germany.getStates().size());
+		
+		// try deleting a state
+		germany.getStates().remove(0);
+		try {
+			tx.commit();
+			fail();
+		} catch (HibernateException e) {
+			assertTrue(e.getMessage().contains("changed an immutable collection instance"));
+			log.debug("success");
+		}	
+		s.close();	
+		
+		s = openSession();
+		tx = s.beginTransaction();
+		germany = (Country) s.get(Country.class, country.getId());
+		assertNotNull(germany);
+		assertEquals("Wrong number of states", 3, germany.getStates().size());
+		tx.commit();
+		s.close();
+	}
+	
+	public void testMiscplacedImmutableAnnotation() {
+		try {
+			AnnotationConfiguration config = new AnnotationConfiguration();
+			config.addAnnotatedClass(Foobar.class);
+			config.buildSessionFactory();
+			fail();
+		} catch (AnnotationException ae) {
+			log.debug("succes");
+		}
+	}
+	
+	/**
+	 * @see org.hibernate.test.annotations.TestCase#getMappings()
+	 */
+	protected Class[] getMappings() {
+		return new Class[] { Country.class, State.class};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/immutable/State.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/immutable/State.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/immutable/State.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,34 @@
+// $Id: State.java 14801 2008-06-24 19:03:32Z hardy.ferentschik $
+package org.hibernate.test.annotations.immutable;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Hardy Ferentschik
+ */
+ at Entity
+public class State {
+	@Id
+	@GeneratedValue
+	private Integer id;
+	
+	private String 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;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/AddressBook.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/AddressBook.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/AddressBook.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,75 @@
+//$Id: AddressBook.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.indexcoll;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.MapKey;
+import javax.persistence.OneToMany;
+import javax.persistence.JoinTable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class AddressBook {
+	private Integer id;
+	private String owner;
+	private Map<AddressEntryPk, AddressEntry> entries = new HashMap<AddressEntryPk, AddressEntry>();
+	private Map<String, AddressEntry> lastNameEntries = new HashMap<String, AddressEntry>();
+	private Map<AlphabeticalDirectory, AddressEntry> directoryEntries = new HashMap<AlphabeticalDirectory, AddressEntry>();
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getOwner() {
+		return owner;
+	}
+
+	public void setOwner(String owner) {
+		this.owner = owner;
+	}
+
+	@MapKey
+	@OneToMany(mappedBy = "book", cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE})
+	@JoinTable(name="AddRegEntry")
+	public Map<AddressEntryPk, AddressEntry> getEntries() {
+		return entries;
+	}
+
+	public void setEntries(Map<AddressEntryPk, AddressEntry> entries) {
+		this.entries = entries;
+	}
+
+	@MapKey(name = "person.lastname")
+	@OneToMany(mappedBy = "book")
+	public Map<String, AddressEntry> getLastNameEntries() {
+		return lastNameEntries;
+	}
+
+	public void setLastNameEntries(Map<String, AddressEntry> lastNameEntries) {
+		this.lastNameEntries = lastNameEntries;
+	}
+
+	@MapKey(name = "directory")
+	@OneToMany(mappedBy = "book")
+	@JoinTable(name="Dir_Entry")
+	public Map<AlphabeticalDirectory, AddressEntry> getDirectoryEntries() {
+		return directoryEntries;
+	}
+
+	public void setDirectoryEntries(Map<AlphabeticalDirectory, AddressEntry> directoryEntries) {
+		this.directoryEntries = directoryEntries;
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/AddressEntry.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/AddressEntry.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/AddressEntry.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,76 @@
+//$Id: AddressEntry.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.indexcoll;
+
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class AddressEntry {
+	private AddressEntryPk person;
+	private String street;
+	private String city;
+	private AddressBook book;
+	private AlphabeticalDirectory directory;
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( !( o instanceof AddressEntry ) ) return false;
+
+		final AddressEntry addressEntry = (AddressEntry) o;
+
+		if ( !person.equals( addressEntry.person ) ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		return person.hashCode();
+	}
+
+	@EmbeddedId
+	public AddressEntryPk getPerson() {
+		return person;
+	}
+
+	public void setPerson(AddressEntryPk person) {
+		this.person = person;
+	}
+
+	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;
+	}
+
+	@ManyToOne
+	public AddressBook getBook() {
+		return book;
+	}
+
+	public void setBook(AddressBook book) {
+		this.book = book;
+	}
+
+	@ManyToOne
+	public AlphabeticalDirectory getDirectory() {
+		return directory;
+	}
+
+	public void setDirectory(AlphabeticalDirectory directory) {
+		this.directory = directory;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/AddressEntryPk.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/AddressEntryPk.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/AddressEntryPk.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,57 @@
+//$Id: AddressEntryPk.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.indexcoll;
+
+import java.io.Serializable;
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class AddressEntryPk implements Serializable {
+	private String firstname;
+	private String lastname;
+
+	public AddressEntryPk() {
+	}
+
+	public AddressEntryPk(String firstname, String lastname) {
+		this.firstname = firstname;
+		this.lastname = lastname;
+	}
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( !( o instanceof AddressEntryPk ) ) return false;
+
+		final AddressEntryPk addressEntryPk = (AddressEntryPk) o;
+
+		if ( !firstname.equals( addressEntryPk.firstname ) ) return false;
+		if ( !lastname.equals( addressEntryPk.lastname ) ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		int result;
+		result = firstname.hashCode();
+		result = 29 * result + lastname.hashCode();
+		return result;
+	}
+
+	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;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/AlphabeticalDirectory.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/AlphabeticalDirectory.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/AlphabeticalDirectory.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,31 @@
+//$Id: AlphabeticalDirectory.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.indexcoll;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class AlphabeticalDirectory {
+	@Id @GeneratedValue private Integer id;
+	private String 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;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Atmosphere.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Atmosphere.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Atmosphere.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,42 @@
+//$Id: Atmosphere.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.indexcoll;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToMany;
+import javax.persistence.Column;
+import javax.persistence.JoinTable;
+import javax.persistence.JoinColumn;
+
+import org.hibernate.annotations.MapKey;
+import org.hibernate.annotations.CollectionOfElements;
+import org.hibernate.annotations.MapKeyManyToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Atmosphere {
+	@Id
+	@GeneratedValue
+	public Integer id;
+
+	@ManyToMany(cascade = CascadeType.ALL)
+	@MapKey(columns = {@Column(name="gas_name")})
+	public Map<String, Gas> gases = new HashMap<String, Gas>();
+
+	@ManyToMany(cascade = CascadeType.ALL)
+	@MapKeyManyToMany(joinColumns = @JoinColumn(name="gas_id") )
+	@JoinTable(name = "Gas_per_key")
+	public Map<GasKey, Gas> gasesPerKey = new HashMap<GasKey, Gas>();
+
+	@CollectionOfElements
+	@Column(name="composition_rate")
+	@MapKeyManyToMany(joinColumns = @JoinColumn(name="gas_id"))
+	@JoinTable(name = "Composition", joinColumns = @JoinColumn(name = "atmosphere_id"))
+	public Map<Gas, Double> composition = new HashMap<Gas, Double>();
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Drawer.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Drawer.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Drawer.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,59 @@
+//$Id: Drawer.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.indexcoll;
+
+import java.util.List;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+import org.hibernate.annotations.IndexColumn;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Drawer {
+	private Long id;
+	private List<Dress> dresses;
+
+	@Id
+	@GeneratedValue
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	/**
+	 * Unidirectional one to many list
+	 *
+	 * @return
+	 */
+	@OneToMany
+	@IndexColumn(name = "from_bottom_position")
+	public List<Dress> getDresses() {
+		return dresses;
+	}
+
+	public void setDresses(List<Dress> dresses) {
+		this.dresses = dresses;
+	}
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( !( o instanceof Drawer ) ) return false;
+
+		final Drawer drawer = (Drawer) o;
+
+		if ( !getId().equals( drawer.getId() ) ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		return getId().hashCode();
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Dress.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Dress.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Dress.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,41 @@
+//$Id: Dress.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.indexcoll;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Dress {
+	private Integer id;
+
+	@Id
+	@GeneratedValue
+	@Column(name = "dress_id")
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( !( o instanceof Dress ) ) return false;
+
+		final Dress dress = (Dress) o;
+
+		if ( !getId().equals( dress.getId() ) ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		return getId().hashCode();
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Gas.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Gas.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Gas.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,18 @@
+//$Id: Gas.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.indexcoll;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Gas {
+	@Id
+	@GeneratedValue
+	public Integer id;
+	public String name;
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/GasKey.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/GasKey.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/GasKey.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,21 @@
+//$Id: GasKey.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.indexcoll;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class GasKey {
+	@Id private String name;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Generation.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Generation.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Generation.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,27 @@
+//$Id: Generation.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.indexcoll;
+
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class Generation {
+
+	private String age;
+	private String culture;
+
+	public String getAge() {
+		return age;
+	}
+	public void setAge(String age) {
+		this.age = age;
+	}
+	public String getCulture() {
+		return culture;
+	}
+	public void setCulture(String culture) {
+		this.culture = culture;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/GenerationGroup.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/GenerationGroup.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/GenerationGroup.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,37 @@
+//$Id: GenerationGroup.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.indexcoll;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class GenerationGroup {
+
+	@Id
+	@GeneratedValue
+	private int id;
+
+	private Generation generation;
+
+	public int getId() {
+		return id;
+	}
+
+	public void setId(int id) {
+		this.id = id;
+	}
+
+	public Generation getGeneration() {
+		return generation;
+	}
+
+	public void setGeneration(Generation generation) {
+		this.generation = generation;
+	}
+
+
+}
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/GenerationUser.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/GenerationUser.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/GenerationUser.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,43 @@
+//$Id: GenerationUser.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.indexcoll;
+
+import java.util.Map;
+import java.util.HashMap;
+import javax.persistence.OneToMany;
+import javax.persistence.Id;
+import javax.persistence.Entity;
+import javax.persistence.MapKey;
+import javax.persistence.GeneratedValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class GenerationUser {
+
+	@Id
+	@GeneratedValue
+	private int id;
+
+	@OneToMany
+	@MapKey(name="generation")
+	private Map<Generation, GenerationGroup> ref = new HashMap<Generation, GenerationGroup>();
+
+	public int getId() {
+		return id;
+	}
+
+	public void setId(int id) {
+		this.id = id;
+	}
+
+	public Map<Generation, GenerationGroup> getRef() {
+		return ref;
+	}
+
+	public void setRef(Map<Generation, GenerationGroup> ref) {
+		this.ref = ref;
+	}
+
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/IndexedCollectionTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/IndexedCollectionTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/IndexedCollectionTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,549 @@
+//$Id: IndexedCollectionTest.java 15025 2008-08-11 09:14:39Z hardy.ferentschik $
+package org.hibernate.test.annotations.indexcoll;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.Hibernate;
+import org.hibernate.dialect.HSQLDialect;
+import org.hibernate.test.annotations.RequiresDialect;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * Test index collections
+ *
+ * @author Emmanuel Bernard
+ */
+public class IndexedCollectionTest extends TestCase {
+	public void testFkList() throws Exception {
+		Wardrobe w = new Wardrobe();
+		Drawer d1 = new Drawer();
+		Drawer d2 = new Drawer();
+		w.setDrawers( new ArrayList<Drawer>() );
+		w.getDrawers().add( d1 );
+		w.getDrawers().add( d2 );
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		s.persist( w );
+
+		s.flush();
+		s.clear();
+
+		w = (Wardrobe) s.get( Wardrobe.class, w.getId() );
+		assertNotNull( w );
+		assertNotNull( w.getDrawers() );
+		List<Drawer> result = w.getDrawers();
+		assertEquals( 2, result.size() );
+		assertEquals( d2.getId(), result.get( 1 ).getId() );
+		result.remove( d1 );
+		s.flush();
+		d1 = (Drawer) s.merge( d1 );
+		result.add( d1 );
+
+		s.flush();
+		s.clear();
+
+		w = (Wardrobe) s.get( Wardrobe.class, w.getId() );
+		assertNotNull( w );
+		assertNotNull( w.getDrawers() );
+		result = w.getDrawers();
+		assertEquals( 2, result.size() );
+		assertEquals( d1.getId(), result.get( 1 ).getId() );
+		s.delete( result.get( 0 ) );
+		s.delete( result.get( 1 ) );
+		s.delete( w );
+		s.flush();
+		tx.rollback();
+		s.close();
+	}
+
+	public void testJoinedTableList() throws Exception {
+		Wardrobe w = new Wardrobe();
+		w.setDrawers( new ArrayList<Drawer>() );
+		Drawer d = new Drawer();
+		w.getDrawers().add( d );
+		Dress d1 = new Dress();
+		Dress d2 = new Dress();
+		d.setDresses( new ArrayList<Dress>() );
+		d.getDresses().add( d1 );
+		d.getDresses().add( d2 );
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		s.persist( d1 );
+		s.persist( d2 );
+		s.persist( w );
+
+		s.flush();
+		s.clear();
+
+		d = (Drawer) s.get( Drawer.class, d.getId() );
+		assertNotNull( d );
+		assertNotNull( d.getDresses() );
+		List<Dress> result = d.getDresses();
+		assertEquals( 2, result.size() );
+		assertEquals( d2.getId(), result.get( 1 ).getId() );
+		result.remove( d1 );
+		s.flush();
+		d1 = (Dress) s.merge( d1 );
+		result.add( d1 );
+
+		s.flush();
+		s.clear();
+
+		d = (Drawer) s.get( Drawer.class, d.getId() );
+		assertNotNull( d );
+		assertNotNull( d.getDresses() );
+		result = d.getDresses();
+		assertEquals( 2, result.size() );
+		assertEquals( d1.getId(), result.get( 1 ).getId() );
+		s.delete( result.get( 0 ) );
+		s.delete( result.get( 1 ) );
+		s.delete( d );
+		s.flush();
+		tx.rollback();
+		s.close();
+	}
+
+	public void testMapKey() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Software hibernate = new Software();
+		hibernate.setName( "Hibernate" );
+		Version v1 = new Version();
+		v1.setCodeName( "HumbaHumba" );
+		v1.setNumber( "1.0" );
+		v1.setSoftware( hibernate );
+		Version v2 = new Version();
+		v2.setCodeName( "Copacabana" );
+		v2.setNumber( "2.0" );
+		v2.setSoftware( hibernate );
+		Version v4 = new Version();
+		v4.setCodeName( "Dreamland" );
+		v4.setNumber( "4.0" );
+		v4.setSoftware( hibernate );
+		Map<String, Version> link = new HashMap<String, Version>();
+		link.put( v1.getCodeName(), v1 );
+		link.put( v2.getCodeName(), v2 );
+		link.put( v4.getCodeName(), v4 );
+		hibernate.setVersions( link );
+		s.persist( hibernate );
+		s.persist( v1 );
+		s.persist( v2 );
+		s.persist( v4 );
+
+		s.flush();
+		s.clear();
+
+		hibernate = (Software) s.get( Software.class, "Hibernate" );
+		assertEquals( 3, hibernate.getVersions().size() );
+		assertEquals( "1.0", hibernate.getVersions().get( "HumbaHumba" ).getNumber() );
+		assertEquals( "2.0", hibernate.getVersions().get( "Copacabana" ).getNumber() );
+		hibernate.getVersions().remove( v4.getCodeName() );
+
+		s.flush();
+		s.clear();
+
+		hibernate = (Software) s.get( Software.class, "Hibernate" );
+		assertEquals( "So effect on collection changes", 3, hibernate.getVersions().size() );
+		for ( Version v : hibernate.getVersions().values() ) {
+			s.delete( v );
+		}
+		s.delete( hibernate );
+
+		s.flush();
+
+		tx.rollback();
+		s.close();
+	}
+
+	public void testDefaultMapKey() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		AddressBook book = new AddressBook();
+		book.setOwner( "Emmanuel" );
+		AddressEntryPk helene = new AddressEntryPk( "Helene", "Michau" );
+		AddressEntry heleneEntry = new AddressEntry();
+		heleneEntry.setBook( book );
+		heleneEntry.setCity( "Levallois" );
+		heleneEntry.setStreet( "Louis Blanc" );
+		heleneEntry.setPerson( helene );
+		AddressEntryPk primeMinister = new AddressEntryPk( "Dominique", "Villepin" );
+		AddressEntry primeMinisterEntry = new AddressEntry();
+		primeMinisterEntry.setBook( book );
+		primeMinisterEntry.setCity( "Paris" );
+		primeMinisterEntry.setStreet( "Hotel Matignon" );
+		primeMinisterEntry.setPerson( primeMinister );
+		book.getEntries().put( helene, heleneEntry );
+		book.getEntries().put( primeMinister, primeMinisterEntry );
+		s.persist( book );
+
+		s.flush();
+		s.clear();
+
+		book = (AddressBook) s.get( AddressBook.class, book.getId() );
+		assertEquals( 2, book.getEntries().size() );
+		assertEquals( heleneEntry.getCity(), book.getEntries().get( helene ).getCity() );
+		AddressEntryPk fake = new AddressEntryPk( "Fake", "Fake" );
+		book.getEntries().put( fake, primeMinisterEntry );
+
+		s.flush();
+		s.clear();
+
+		book = (AddressBook) s.get( AddressBook.class, book.getId() );
+		assertEquals( 2, book.getEntries().size() );
+		assertNull( book.getEntries().get( fake ) );
+		s.delete( book );
+
+		s.flush();
+		tx.rollback();
+		s.close();
+	}
+
+	public void testMapKeyToEntity() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		AlphabeticalDirectory m = new AlphabeticalDirectory();
+		m.setName( "M" );
+		AlphabeticalDirectory v = new AlphabeticalDirectory();
+		v.setName( "V" );
+		s.persist( m );
+		s.persist( v );
+
+		AddressBook book = new AddressBook();
+		book.setOwner( "Emmanuel" );
+		AddressEntryPk helene = new AddressEntryPk( "Helene", "Michau" );
+		AddressEntry heleneEntry = new AddressEntry();
+		heleneEntry.setBook( book );
+		heleneEntry.setCity( "Levallois" );
+		heleneEntry.setStreet( "Louis Blanc" );
+		heleneEntry.setPerson( helene );
+		heleneEntry.setDirectory( m );
+		AddressEntryPk primeMinister = new AddressEntryPk( "Dominique", "Villepin" );
+		AddressEntry primeMinisterEntry = new AddressEntry();
+		primeMinisterEntry.setBook( book );
+		primeMinisterEntry.setCity( "Paris" );
+		primeMinisterEntry.setStreet( "Hotel Matignon" );
+		primeMinisterEntry.setPerson( primeMinister );
+		primeMinisterEntry.setDirectory( v );
+		book.getEntries().put( helene, heleneEntry );
+		book.getEntries().put( primeMinister, primeMinisterEntry );
+		s.persist( book );
+
+		s.flush();
+		s.clear();
+
+		book = (AddressBook) s.get( AddressBook.class, book.getId() );
+		assertEquals( 2, book.getEntries().size() );
+		assertEquals( heleneEntry.getCity(), book.getEntries().get( helene ).getCity() );
+		assertEquals( "M", book.getEntries().get( helene ).getDirectory().getName() );
+
+		s.delete( book );
+		tx.rollback();
+		s.close();
+	}
+
+	@RequiresDialect(HSQLDialect.class)
+	public void testComponentSubPropertyMapKey() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		AddressBook book = new AddressBook();
+		book.setOwner( "Emmanuel" );
+		AddressEntryPk helene = new AddressEntryPk( "Helene", "Michau" );
+		AddressEntry heleneEntry = new AddressEntry();
+		heleneEntry.setBook( book );
+		heleneEntry.setCity( "Levallois" );
+		heleneEntry.setStreet( "Louis Blanc" );
+		heleneEntry.setPerson( helene );
+		AddressEntryPk primeMinister = new AddressEntryPk( "Dominique", "Villepin" );
+		AddressEntry primeMinisterEntry = new AddressEntry();
+		primeMinisterEntry.setBook( book );
+		primeMinisterEntry.setCity( "Paris" );
+		primeMinisterEntry.setStreet( "Hotel Matignon" );
+		primeMinisterEntry.setPerson( primeMinister );
+		book.getEntries().put( helene, heleneEntry );
+		book.getEntries().put( primeMinister, primeMinisterEntry );
+		s.persist( book );
+
+		s.flush();
+		s.clear();
+
+		book = (AddressBook) s.get( AddressBook.class, book.getId() );
+		assertEquals( 2, book.getLastNameEntries().size() );
+		assertEquals( heleneEntry.getCity(), book.getLastNameEntries().get( "Michau" ).getCity() );
+		AddressEntryPk fake = new AddressEntryPk( "Fake", "Fake" );
+		book.getEntries().put( fake, primeMinisterEntry );
+
+		s.flush();
+		s.clear();
+
+		book = (AddressBook) s.get( AddressBook.class, book.getId() );
+		assertEquals( 2, book.getEntries().size() );
+		assertNull( book.getEntries().get( fake ) );
+		s.delete( book );
+		tx.rollback();
+		s.close();
+	}
+
+	public void testMapKeyOnManyToMany() throws Exception {
+		Session s;
+		s = openSession();
+		s.getTransaction().begin();
+		News airplane = new News();
+		airplane.setTitle( "Crash!" );
+		airplane.setDetail( "An airplaned crashed." );
+		s.persist( airplane );
+		Newspaper lemonde = new Newspaper();
+		lemonde.setName( "Lemonde" );
+		lemonde.getNews().put( airplane.getTitle(), airplane );
+		s.persist( lemonde );
+
+		s.flush();
+		s.clear();
+
+		lemonde = (Newspaper) s.get( Newspaper.class, lemonde.getId() );
+		assertEquals( 1, lemonde.getNews().size() );
+		News news = lemonde.getNews().get( airplane.getTitle() );
+		assertNotNull( news );
+		assertEquals( airplane.getTitle(), news.getTitle() );
+		s.delete( lemonde );
+		s.delete( news );
+
+		s.getTransaction().rollback();
+		s.close();
+	}
+
+	public void testMapKeyOnManyToManyOnId() throws Exception {
+		Session s;
+		s = openSession();
+		s.getTransaction().begin();
+		News hibernate1 = new News();
+		hibernate1.setTitle( "#1 ORM solution in the Java world" );
+		hibernate1.setDetail( "Well, that's no news ;-)" );
+		s.persist( hibernate1 );
+		PressReleaseAgency schwartz = new PressReleaseAgency();
+		schwartz.setName( "Schwartz" );
+		schwartz.getProvidedNews().put( hibernate1.getId(), hibernate1 );
+		s.persist( schwartz );
+
+		s.flush();
+		s.clear();
+
+		schwartz = (PressReleaseAgency) s.get( PressReleaseAgency.class, schwartz.getId() );
+		assertEquals( 1, schwartz.getProvidedNews().size() );
+		News news = schwartz.getProvidedNews().get( hibernate1.getId() );
+		assertNotNull( news );
+		assertEquals( hibernate1.getTitle(), news.getTitle() );
+		s.delete( schwartz );
+		s.delete( news );
+
+		s.getTransaction().rollback();
+		s.close();
+	}
+
+	public void testMapKeyAndIdClass() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Painter picasso = new Painter();
+		Painting laVie = new Painting( "La Vie", "Picasso", 50, 20 );
+		picasso.getPaintings().put( "La Vie", laVie );
+		Painting famille = new Painting( "La Famille du Saltimbanque", "Picasso", 50, 20 );
+		picasso.getPaintings().put( "La Famille du Saltimbanque", famille );
+		s.persist( picasso );
+
+		s.flush();
+		s.clear();
+
+		picasso = (Painter) s.get( Painter.class, picasso.getId() );
+		Painting painting = picasso.getPaintings().get( famille.getName() );
+		assertNotNull( painting );
+		assertEquals( painting.getName(), famille.getName() );
+		s.delete( picasso );
+		tx.rollback();
+		s.close();
+	}
+
+	public void testRealMap() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Atmosphere atm = new Atmosphere();
+		Atmosphere atm2 = new Atmosphere();
+		GasKey key = new GasKey();
+		key.setName( "O2" );
+		Gas o2 = new Gas();
+		o2.name = "oxygen";
+		atm.gases.put( "100%", o2 );
+		atm.gasesPerKey.put( key, o2 );
+		atm2.gases.put( "100%", o2 );
+		atm2.gasesPerKey.put( key, o2 );
+		s.persist( key );
+		s.persist( atm );
+		s.persist( atm2 );
+
+		s.flush();
+		s.clear();
+
+		atm = (Atmosphere) s.get( Atmosphere.class, atm.id );
+		key = (GasKey) s.get( GasKey.class, key.getName() );
+		assertEquals( 1, atm.gases.size() );
+		assertEquals( o2.name, atm.gases.get( "100%" ).name );
+		assertEquals( o2.name, atm.gasesPerKey.get( key ).name );
+		tx.rollback();
+		s.close();
+	}
+
+	public void testMapKeyEntityEntity() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		AddressBook book = new AddressBook();
+		s.persist( book );
+		AddressEntry entry = new AddressEntry();
+		entry.setCity( "Atlanta");
+		AddressEntryPk pk = new AddressEntryPk("Coca", "Cola" );
+		entry.setPerson( pk );
+		entry.setBook( book );
+		AlphabeticalDirectory ad = new AlphabeticalDirectory();
+		ad.setName( "C");
+		s.persist( ad );
+		entry.setDirectory( ad );
+		s.persist( entry );
+		book.getDirectoryEntries().put( ad, entry );
+
+		s.flush();
+		s.clear();
+
+		book = (AddressBook) s.get( AddressBook.class, book.getId() );
+		assertEquals( 1, book.getDirectoryEntries().size() );
+		assertEquals( "C", book.getDirectoryEntries().keySet().iterator().next().getName() );
+		tx.rollback();
+		s.close();
+	}
+
+	public void testEntityKeyElementTarget() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Atmosphere atm = new Atmosphere();
+		Gas o2 = new Gas();
+		o2.name = "oxygen";
+		atm.composition.put( o2, 94.3 );
+		s.persist( o2 );
+		s.persist( atm );
+
+		s.flush();
+		s.clear();
+
+		atm = (Atmosphere) s.get( Atmosphere.class, atm.id );
+		assertTrue( ! Hibernate.isInitialized( atm.composition ) );
+		assertEquals( 1, atm.composition.size() );
+		assertEquals( o2.name, atm.composition.keySet().iterator().next().name );
+		tx.rollback();
+		s.close();
+	}
+
+	public void testSortedMap() {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Training training = new Training();
+		Trainee trainee = new Trainee();
+		trainee.setName( "Jim" );
+		Trainee trainee2 = new Trainee();
+		trainee2.setName( "Emmanuel" );
+		s.persist( trainee );
+		s.persist( trainee2 );
+		training.getTrainees().put( "Jim", trainee );
+		training.getTrainees().put( "Emmanuel", trainee2 );
+		s.persist( training );
+
+		s.flush();
+		s.clear();
+
+		training = (Training) s.get( Training.class, training.getId() );
+		assertEquals( "Emmanuel", training.getTrainees().firstKey() );
+		assertEquals( "Jim", training.getTrainees().lastKey() );
+		tx.rollback();
+		s.close();
+	}
+
+	public void testMapKeyLoad() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Software hibernate = new Software();
+		hibernate.setName( "Hibernate" );
+		Version v1 = new Version();
+		v1.setCodeName( "HumbaHumba" );
+		v1.setNumber( "1.0" );
+		v1.setSoftware( hibernate );
+		hibernate.addVersion( v1 );
+		s.persist( hibernate );
+		s.persist( v1 );
+
+		s.flush();
+		s.clear();
+
+		hibernate = (Software) s.get( Software.class, "Hibernate" );
+		assertEquals(1, hibernate.getVersions().size() );
+		Version v2 = new Version();
+		v2.setCodeName( "HumbaHumba2" );
+		v2.setNumber( "2.0" );
+		v2.setSoftware( hibernate );
+		hibernate.addVersion( v2 );
+		assertEquals( "One loaded persisted version, and one just added", 2, hibernate.getVersions().size() );
+
+		s.flush();
+		s.clear();
+
+		hibernate = (Software) s.get( Software.class, "Hibernate" );
+		for ( Version v : hibernate.getVersions().values() ) {
+			s.delete( v );
+		}
+		s.delete( hibernate );
+		tx.rollback();
+		s.close();
+	}
+
+
+	public IndexedCollectionTest(String x) {
+		super( x );
+	}
+
+	protected Class[] getMappings() {
+		return new Class[]{
+				Wardrobe.class,
+				Drawer.class,
+				Dress.class,
+				Software.class,
+				Version.class,
+				AddressBook.class,
+				AddressEntry.class,
+				AddressEntryPk.class, //should be silently ignored
+				Newspaper.class,
+				News.class,
+				PressReleaseAgency.class,
+				Painter.class,
+				Painting.class,
+				Atmosphere.class,
+				Gas.class,
+				AlphabeticalDirectory.class,
+				GasKey.class,
+				Trainee.class,
+				Training.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/MapKeyTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/MapKeyTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/MapKeyTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,40 @@
+//$Id: MapKeyTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.indexcoll;
+
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class MapKeyTest extends TestCase {
+
+	public void testMapKeyOnEmbeddedId() {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Generation c = new Generation();
+		c.setAge( "a" );
+		c.setCulture( "b" );
+		GenerationGroup r = new GenerationGroup();
+		r.setGeneration( c );
+		s.persist( r );
+		GenerationUser m = new GenerationUser();
+		s.persist( m );
+		m.getRef().put( c, r );
+		s.flush();
+		s.clear();
+
+		m = (GenerationUser) s.get( GenerationUser.class, m.getId() );
+		assertEquals( "a", m.getRef().keySet().iterator().next().getAge() );
+		tx.rollback();
+		s.close();
+	}
+
+	protected Class[] getMappings() {
+		return new Class[] {
+				GenerationUser.class,
+				GenerationGroup.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/News.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/News.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/News.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,44 @@
+//$Id: News.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.indexcoll;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class News {
+	private Integer id;
+	private String title;
+	private String detail;
+
+	@Id
+	@GeneratedValue
+	@Column(name = "news_id")
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getTitle() {
+		return title;
+	}
+
+	public void setTitle(String title) {
+		this.title = title;
+	}
+
+	public String getDetail() {
+		return detail;
+	}
+
+	public void setDetail(String detail) {
+		this.detail = detail;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Newspaper.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Newspaper.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Newspaper.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,48 @@
+//$Id: Newspaper.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.indexcoll;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToMany;
+import javax.persistence.MapKey;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Newspaper {
+	private Integer id;
+	private String name;
+	private Map<String, News> news = new HashMap<String, News>();
+
+	@Id
+	@GeneratedValue
+	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;
+	}
+
+	@ManyToMany
+	@MapKey(name = "title")
+	public Map<String, News> getNews() {
+		return news;
+	}
+
+	public void setNews(Map<String, News> news) {
+		this.news = news;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Painter.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Painter.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Painter.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,42 @@
+//$Id: Painter.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.indexcoll;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.MapKey;
+import javax.persistence.OneToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Painter {
+	private Integer id;
+	private Map<String, Painting> paintings = new HashMap<String, Painting>();
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	@OneToMany(cascade = {CascadeType.ALL})
+	@MapKey(name = "name")
+	@JoinColumn
+	public Map<String, Painting> getPaintings() {
+		return paintings;
+	}
+
+	public void setPaintings(Map<String, Painting> paintings) {
+		this.paintings = paintings;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Painting.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Painting.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Painting.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,82 @@
+//$Id: Painting.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.indexcoll;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at IdClass(PaintingPk.class)
+public class Painting {
+
+	private int sizeX;
+	private int sizeY;
+	private String name;
+	private String painter;
+
+	public Painting() {
+	}
+
+	public Painting(String name, String painter, int sizeX, int sizeY) {
+		this.name = name;
+		this.painter = painter;
+		this.sizeX = sizeX;
+		this.sizeY = sizeY;
+	}
+
+	@Id
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	@Id
+	public String getPainter() {
+		return painter;
+	}
+
+	public void setPainter(String painter) {
+		this.painter = painter;
+	}
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( o == null || getClass() != o.getClass() ) return false;
+
+		final PaintingPk that = (PaintingPk) o;
+
+		if ( !name.equals( that.getName() ) ) return false;
+		if ( !painter.equals( that.getPainter() ) ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		int result;
+		result = name.hashCode();
+		result = 29 * result + painter.hashCode();
+		return result;
+	}
+
+	public int getSizeX() {
+		return sizeX;
+	}
+
+	public void setSizeX(int sizeX) {
+		this.sizeX = sizeX;
+	}
+
+	public int getSizeY() {
+		return sizeY;
+	}
+
+	public void setSizeY(int sizeY) {
+		this.sizeY = sizeY;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/PaintingPk.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/PaintingPk.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/PaintingPk.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,49 @@
+//$Id: PaintingPk.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.indexcoll;
+
+import java.io.Serializable;
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class PaintingPk implements Serializable {
+	private String name;
+	private String painter;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getPainter() {
+		return painter;
+	}
+
+	public void setPainter(String painter) {
+		this.painter = painter;
+	}
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( o == null || getClass() != o.getClass() ) return false;
+
+		final PaintingPk that = (PaintingPk) o;
+
+		if ( !name.equals( that.name ) ) return false;
+		if ( !painter.equals( that.painter ) ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		int result;
+		result = name.hashCode();
+		result = 29 * result + painter.hashCode();
+		return result;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/PressReleaseAgency.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/PressReleaseAgency.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/PressReleaseAgency.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,54 @@
+//$Id: PressReleaseAgency.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.indexcoll;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+import javax.persistence.MapKey;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class PressReleaseAgency {
+	private Integer id;
+	private String name;
+	private Map<Integer, News> providedNews = new HashMap<Integer, News>();
+
+	@Id
+	@GeneratedValue
+	@Column(name = "PressReleaseAgency_id")
+	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;
+	}
+
+	@ManyToMany
+	@JoinTable(joinColumns = @JoinColumn(name = "PressReleaseAgency_id"),
+			inverseJoinColumns = @JoinColumn(name = "News_id"))
+	@MapKey
+	public Map<Integer, News> getProvidedNews() {
+		return providedNews;
+	}
+
+	public void setProvidedNews(Map<Integer, News> providedNews) {
+		this.providedNews = providedNews;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Software.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Software.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Software.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,41 @@
+//$Id: Software.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.indexcoll;
+
+import java.util.Map;
+import java.util.HashMap;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.MapKey;
+import javax.persistence.OneToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Software {
+	private String name;
+	private Map<String, Version> versions = new HashMap<String, Version>();
+
+	@Id
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	@OneToMany(mappedBy = "software")
+	@MapKey(name = "codeName")
+	public Map<String, Version> getVersions() {
+		return versions;
+	}
+
+	public void setVersions(Map<String, Version> versions) {
+		this.versions = versions;
+	}
+
+	public void addVersion(Version version) {
+		this.versions.put(version.getCodeName(), version);
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Trainee.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Trainee.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Trainee.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,31 @@
+//$Id: Trainee.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.indexcoll;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Trainee {
+	@Id @GeneratedValue 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;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Training.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Training.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Training.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,39 @@
+//$Id: Training.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.indexcoll;
+
+import java.util.SortedMap;
+import java.util.TreeMap;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.MapKey;
+import javax.persistence.ManyToMany;
+
+import org.hibernate.annotations.Sort;
+import org.hibernate.annotations.SortType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Training {
+	@Id @GeneratedValue private Long id;
+	@Sort(type= SortType.NATURAL)
+	@MapKey(name="name") @ManyToMany SortedMap<String, Trainee> trainees = new TreeMap<String, Trainee>();
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public SortedMap<String, Trainee> getTrainees() {
+		return trainees;
+	}
+
+	public void setTrainees(SortedMap<String, Trainee> trainees) {
+		this.trainees = trainees;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Version.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Version.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Version.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,58 @@
+//$Id: Version.java 15049 2008-08-13 15:32:32Z epbernard $
+package org.hibernate.test.annotations.indexcoll;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+import javax.persistence.Column;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "tbl_version")
+public class Version {
+	private Integer id;
+	private String codeName;
+	private String number;
+	private Software software;
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	@Column(name="`code_name`")
+	public String getCodeName() {
+		return codeName;
+	}
+
+	public void setCodeName(String codeName) {
+		this.codeName = codeName;
+	}
+
+	@Column(name="version_nbr")
+	public String getNumber() {
+		return number;
+	}
+
+	public void setNumber(String number) {
+		this.number = number;
+	}
+
+	@ManyToOne
+	public Software getSoftware() {
+		return software;
+	}
+
+	public void setSoftware(Software software) {
+		this.software = software;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Wardrobe.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Wardrobe.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/indexcoll/Wardrobe.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,47 @@
+//$Id: Wardrobe.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.indexcoll;
+
+import java.util.List;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToMany;
+
+import org.hibernate.annotations.IndexColumn;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Wardrobe {
+
+	private Long id;
+	private List<Drawer> drawers;
+
+	@Id
+	@GeneratedValue
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	/**
+	 * unidirectional one to many list  with non null foreign key (mapping
+	 * not recommended).
+	 */
+	@OneToMany(cascade = CascadeType.ALL)
+	@IndexColumn(name = "drawer_position", base = 1)
+	@JoinColumn(name = "wardrobe_id", nullable = false)
+	public List<Drawer> getDrawers() {
+		return drawers;
+	}
+
+	public void setDrawers(List<Drawer> drawers) {
+		this.drawers = drawers;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/Apple.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/Apple.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/Apple.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,11 @@
+//$Id: Apple.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.inheritance;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Apple extends Fruit {
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/Carrot.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/Carrot.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/Carrot.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,33 @@
+//$Id: Carrot.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.inheritance;
+
+import javax.persistence.Entity;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.PrimaryKeyJoinColumn;
+import javax.persistence.PrimaryKeyJoinColumns;
+
+import org.hibernate.annotations.OnDelete;
+import org.hibernate.annotations.OnDeleteAction;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Inheritance(strategy = InheritanceType.JOINED)
+ at PrimaryKeyJoinColumns(
+		{@PrimaryKeyJoinColumn(name = "carrot_farmer", referencedColumnName = "farmer"),
+		@PrimaryKeyJoinColumn(name = "harvest", referencedColumnName = "harvestDate")
+				})
+ at OnDelete(action = OnDeleteAction.CASCADE)
+public class Carrot extends Vegetable {
+	private int length;
+
+	public int getLength() {
+		return length;
+	}
+
+	public void setLength(int length) {
+		this.length = length;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/Fruit.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/Fruit.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/Fruit.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,25 @@
+//$Id: Fruit.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.inheritance;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Fruit {
+	private Integer id;
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/SubclassTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/SubclassTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/SubclassTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,170 @@
+//$Id: SubclassTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.inheritance;
+
+import java.util.List;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.A320;
+import org.hibernate.test.annotations.A320b;
+import org.hibernate.test.annotations.Plane;
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.test.annotations.inheritance.singletable.Funk;
+import org.hibernate.test.annotations.inheritance.singletable.Music;
+import org.hibernate.test.annotations.inheritance.singletable.Noise;
+import org.hibernate.test.annotations.inheritance.singletable.Rock;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class SubclassTest extends TestCase {
+
+	public SubclassTest(String x) {
+		super( x );
+	}
+
+	public void testPolymorphism() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Plane p = new Plane();
+		p.setNbrOfSeats( 10 );
+		A320 a = new A320();
+		a.setJavaEmbeddedVersion( "5.0" );
+		a.setNbrOfSeats( 300 );
+		s.persist( a );
+		s.persist( p );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		Query q = s.createQuery( "from " + A320.class.getName() );
+		List a320s = q.list();
+		assertNotNull( a320s );
+		assertEquals( 1, a320s.size() );
+		assertTrue( a320s.get( 0 ) instanceof A320 );
+		assertEquals( "5.0", ( (A320) a320s.get( 0 ) ).getJavaEmbeddedVersion() );
+		q = s.createQuery( "from " + Plane.class.getName() );
+		List planes = q.list();
+		assertNotNull( planes );
+		assertEquals( 2, planes.size() );
+		tx.commit();
+		s.close();
+	}
+
+	public void test2ndLevelSubClass() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		A320b a = new A320b();
+		a.setJavaEmbeddedVersion( "Elephant" );
+		a.setNbrOfSeats( 300 );
+		s.persist( a );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		Query q = s.createQuery( "from " + A320.class.getName() + " as a where a.javaEmbeddedVersion = :version" );
+		q.setString( "version", "Elephant" );
+		List a320s = q.list();
+		assertNotNull( a320s );
+		assertEquals( 1, a320s.size() );
+		tx.commit();
+		s.close();
+	}
+
+	public void testEmbeddedSuperclass() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Plane p = new Plane();
+		p.setAlive( true ); //sic
+		p.setAltitude( 10000 );
+		p.setMetricAltitude( 3000 );
+		p.setNbrOfSeats( 150 );
+		p.setSerial( "0123456789" );
+		s.persist( p );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		p = (Plane) s.get( Plane.class, p.getId() );
+		assertNotNull( p );
+		assertEquals( true, p.isAlive() );
+		assertEquals( 150, p.getNbrOfSeats() );
+		assertEquals( 10000, p.getAltitude() );
+		assertEquals( "0123456789", p.getSerial() );
+		assertFalse( 3000 == p.getMetricAltitude() );
+		s.delete( p );
+		tx.commit();
+		s.close();
+	}
+
+	public void testFormula() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Rock guns = new Rock();
+		guns.setAvgBeat( 90 );
+		guns.setType( 2 );
+		Noise white = new Noise();
+		white.setAvgBeat( 0 );
+		white.setType( null );
+
+		s.persist( guns );
+		s.persist( white );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		List result = s.createCriteria( Noise.class ).list();
+		assertNotNull( result );
+		assertEquals( 1, result.size() );
+		white = (Noise) result.get( 0 );
+		assertNull( white.getType() );
+		s.delete( white );
+		result = s.createCriteria( Rock.class ).list();
+		assertEquals( 1, result.size() );
+		s.delete( result.get( 0 ) );
+		result = s.createCriteria( Funk.class ).list();
+		assertEquals( 0, result.size() );
+
+		tx.commit();
+		s.close();
+	}
+
+	private void checkClassType(Fruit fruitToTest, Fruit f, Apple a) {
+		if ( fruitToTest.getId().equals( f.getId() ) ) {
+			assertFalse( fruitToTest instanceof Apple );
+		}
+		else if ( fruitToTest.getId().equals( a.getId() ) ) {
+			assertTrue( fruitToTest instanceof Apple );
+		}
+		else {
+			fail( "Result does not contains the previously inserted elements" );
+		}
+	}
+
+	/**
+	 * @see org.hibernate.test.annotations.TestCase#getMappings()
+	 */
+	protected Class[] getMappings() {
+		return new Class[]{
+				A320b.class, //subclasses should be properly reordered
+				Plane.class,
+				A320.class,
+				Fruit.class,
+				//FlyingObject.class, //had to declare embedded superclasses
+				//Thing.class,
+				Apple.class,
+				Music.class,
+				Rock.class,
+				Funk.class,
+				Noise.class
+		};
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/Tomato.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/Tomato.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/Tomato.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,33 @@
+//$Id: Tomato.java 15056 2008-08-13 18:15:05Z epbernard $
+package org.hibernate.test.annotations.inheritance;
+
+import javax.persistence.Entity;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.Column;
+
+import org.hibernate.annotations.OnDelete;
+import org.hibernate.annotations.OnDeleteAction;
+
+/**
+ * @author Emmanuel Bernard
+ */
+//FIXME HBX-55 default for composite PK does not work yet
+//FIXME Tomato is a fruit
+ at Entity()
+ at Inheritance(
+		strategy = InheritanceType.JOINED
+)
+ at OnDelete(action = OnDeleteAction.CASCADE)
+public class Tomato extends Vegetable {
+	private int size;
+
+	@Column(name="tom_size")
+	public int getSize() {
+		return size;
+	}
+
+	public void setSize(int size) {
+		this.size = size;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/Vegetable.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/Vegetable.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/Vegetable.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,51 @@
+//$Id: Vegetable.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.inheritance;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity()
+ at Inheritance(
+		strategy = InheritanceType.JOINED
+)
+public class Vegetable {
+	private VegetablePk id;
+	private long priceInCent;
+
+	@Id
+	public VegetablePk getId() {
+		return id;
+	}
+
+	public void setId(VegetablePk id) {
+		this.id = id;
+	}
+
+	public long getPriceInCent() {
+		return priceInCent;
+	}
+
+	public void setPriceInCent(long priceInCent) {
+		this.priceInCent = priceInCent;
+	}
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( !( o instanceof Vegetable ) ) return false;
+
+		final Vegetable vegetable = (Vegetable) o;
+
+		if ( !id.equals( vegetable.id ) ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		return id.hashCode();
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/VegetablePk.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/VegetablePk.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/VegetablePk.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,50 @@
+//$Id: VegetablePk.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.inheritance;
+
+import java.io.Serializable;
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class VegetablePk implements Serializable {
+	private String farmer;
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( !( o instanceof VegetablePk ) ) return false;
+
+		final VegetablePk vegetablePk = (VegetablePk) o;
+
+		if ( !farmer.equals( vegetablePk.farmer ) ) return false;
+		if ( !harvestDate.equals( vegetablePk.harvestDate ) ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		int result;
+		result = farmer.hashCode();
+		result = 29 * result + harvestDate.hashCode();
+		return result;
+	}
+
+	public String getFarmer() {
+		return farmer;
+	}
+
+	public void setFarmer(String farmer) {
+		this.farmer = farmer;
+	}
+
+	public String getHarvestDate() {
+		return harvestDate;
+	}
+
+	public void setHarvestDate(String harvestDate) {
+		this.harvestDate = harvestDate;
+	}
+
+	private String harvestDate;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Alarm.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Alarm.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Alarm.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,40 @@
+//$Id: Alarm.java 15074 2008-08-14 17:38:00Z epbernard $
+package org.hibernate.test.annotations.inheritance.joined;
+
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
+import javax.persistence.OneToOne;
+
+ at Entity
+ at DiscriminatorValue("AlarmT")
+public class Alarm extends EventInformation {
+
+	protected EventInformation eventInfo;
+
+	@OneToOne
+	@JoinColumns({@JoinColumn(name = "EVENTINFO_NOTIFICATIONID",
+			referencedColumnName = "NOTIFICATIONID")})
+	public EventInformation getEventInfo() {
+		return eventInfo;
+	}
+
+	public void setEventInfo(EventInformation value) {
+		this.eventInfo = value;
+	}
+
+
+	@Override
+	public String toString() {
+		StringBuilder sb = new StringBuilder();
+		String eventId = ( getEventInfo() != null ?
+				getEventInfo().getNotificationId() : null );
+		sb.append(
+				"AlarmT: id = " + getNotificationId() + "\t" +
+						"has event id = " + eventId
+		);
+		return sb.toString();
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Asset.hbm.xml
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Asset.hbm.xml	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Asset.hbm.xml	2009-11-24 21:03:15 UTC (rev 18049)
@@ -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.annotations.inheritance.joined">
+
+    <class name="Parent">
+        <id name="id">
+            <generator class="native"/>
+        </id>
+        <set name="financialAssets" fetch="join" cascade="refresh" inverse="true">
+            <key column="PARENT_ID"/>
+            <one-to-many class="FinancialAsset"/>
+        </set>
+        <set name="propertyAssets" fetch="join" cascade="refresh" inverse="true">
+            <key column="PARENT_ID"/>
+            <one-to-many class="PropertyAsset"/>
+        </set>
+    </class>
+    <class name="Asset">
+        <id name="id">
+            <generator class="native"/>
+        </id>
+        <many-to-one name="parent" column="PARENT_ID" property-ref="parent"/>
+        <joined-subclass name="FinancialAsset">
+            <key column="ID"/>
+            <property name="price"/>
+        </joined-subclass>
+        <joined-subclass name="PropertyAsset">
+            <key column="ID"/>
+            <property name="price"/>
+        </joined-subclass>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Asset.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Asset.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Asset.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,41 @@
+//$Id: Asset.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.inheritance.joined;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Inheritance(strategy = InheritanceType.JOINED)
+ at Table(name = "TBLASSET")
+public class Asset {
+	private Integer id;
+
+	private Parent parent = null;
+
+	@Id @GeneratedValue public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	@ManyToOne(targetEntity = Parent.class)
+	@JoinColumn(name = "PARENTID")
+	public Parent getParent() {
+		return parent;
+	}
+
+	public void setParent(Parent parent) {
+		this.parent = parent;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Clothing.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Clothing.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Clothing.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,48 @@
+//$Id: Clothing.java 15075 2008-08-14 17:43:43Z epbernard $
+package org.hibernate.test.annotations.inheritance.joined;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.Column;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Inheritance(strategy = InheritanceType.JOINED)
+public abstract class Clothing {
+	private long id;
+	private int size;
+	private String color;
+
+	@Id
+	@GeneratedValue
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	@Column(name = "cloth_size")
+	public int getSize() {
+		return size;
+	}
+
+	public void setSize(int size) {
+		this.size = size;
+	}
+
+	public String getColor() {
+		return color;
+	}
+
+	public void setColor(String color) {
+		this.color = color;
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Document.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Document.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Document.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,33 @@
+//$Id: Document.java 16296 2009-04-10 20:21:48Z gbadner $
+package org.hibernate.test.annotations.inheritance.joined;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+
+import org.hibernate.annotations.ForeignKey;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at ForeignKey(name = "FK_DOCU_FILE")
+public class Document extends File {
+	@Column(nullable = false, name="xsize")
+	private int size;
+
+	Document() {
+	}
+
+	Document(String name, int size) {
+		super( name );
+		this.size = size;
+	}
+
+	public int getSize() {
+		return size;
+	}
+
+	public void setSize(int size) {
+		this.size = size;
+	}
+}


Property changes on: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Document.java
___________________________________________________________________
Name: svn:executable
   + *

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/EventInformation.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/EventInformation.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/EventInformation.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,38 @@
+//$Id: EventInformation.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.inheritance.joined;
+
+import javax.persistence.DiscriminatorColumn;
+import javax.persistence.DiscriminatorType;
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+
+
+ at Entity
+ at Inheritance(strategy = InheritanceType.JOINED)
+ at DiscriminatorColumn(name = "DTYPE", discriminatorType = DiscriminatorType.STRING, length = 80)
+ at DiscriminatorValue("EventInformationT")
+public class EventInformation implements java.io.Serializable {
+
+
+	protected String notificationId;
+
+	@Id
+	public String getNotificationId() {
+		return notificationId;
+	}
+
+	public void setNotificationId(String value) {
+		this.notificationId = value;
+	}
+
+	@Override
+	public String toString() {
+		StringBuilder sb = new StringBuilder();
+		sb.append( "EventInformationT: id = " + getNotificationId() );
+		return sb.toString();
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/File.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/File.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/File.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,48 @@
+//$Id: File.java 15050 2008-08-13 15:34:39Z epbernard $
+package org.hibernate.test.annotations.inheritance.joined;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.ManyToOne;
+import javax.persistence.Column;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Inheritance(strategy = InheritanceType.JOINED)
+ at Table(name="joined_file")
+public abstract class File {
+	@Id @Column(name="filename")
+	private String name;
+	@ManyToOne
+	private Folder parent;
+
+	File() {
+	}
+
+	public File(String name) {
+		this.name = name;
+	}
+
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String id) {
+		this.name = id;
+	}
+
+	public Folder getParent() {
+		return parent;
+	}
+
+	public void setParent(Folder parent) {
+		this.parent = parent;
+	}
+
+}


Property changes on: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/File.java
___________________________________________________________________
Name: svn:executable
   + *

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/FinancialAsset.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/FinancialAsset.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/FinancialAsset.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,20 @@
+//$Id: FinancialAsset.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.inheritance.joined;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class FinancialAsset extends Asset {
+	private double price;
+
+	public double getPrice() {
+		return price;
+	}
+
+	public void setPrice(double price) {
+		this.price = price;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Folder.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Folder.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Folder.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,31 @@
+//$Id: Folder.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.inheritance.joined;
+
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.OneToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Folder extends File {
+	@OneToMany(mappedBy = "parent")
+	private Set<File> children = new HashSet<File>();
+
+	Folder() {
+	}
+
+	public Folder(String name) {
+		super( name );
+	}
+
+	public Set<File> getChildren() {
+		return children;
+	}
+
+	public void setChildren(Set children) {
+		this.children = children;
+	}
+}


Property changes on: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Folder.java
___________________________________________________________________
Name: svn:executable
   + *

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/JoinedSubclassAndSecondaryTable.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/JoinedSubclassAndSecondaryTable.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/JoinedSubclassAndSecondaryTable.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,33 @@
+//$Id: JoinedSubclassAndSecondaryTable.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.inheritance.joined;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class JoinedSubclassAndSecondaryTable extends TestCase {
+
+	public void testSecondaryTableAndJoined() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		SwimmingPool sp = new SwimmingPool();
+		sp.setAddress( "Park Avenue" );
+		s.persist( sp );
+		tx.rollback();
+		s.close();
+	}
+
+	/**
+	 * @see org.hibernate.test.annotations.TestCase#getMappings()
+	 */
+	protected Class[] getMappings() {
+		return new Class[]{
+				Pool.class,
+				SwimmingPool.class
+		};
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/JoinedSubclassTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/JoinedSubclassTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/JoinedSubclassTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,178 @@
+//$Id: JoinedSubclassTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.inheritance.joined;
+
+import java.util.List;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class JoinedSubclassTest extends TestCase {
+
+	public JoinedSubclassTest(String x) {
+		super( x );
+	}
+
+	public void testDefault() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		File doc = new Document( "Enron Stuff To Shred", 1000 );
+		Folder folder = new Folder( "Enron" );
+		s.persist( doc );
+		s.persist( folder );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		List result = s.createCriteria( File.class ).list();
+		assertNotNull( result );
+		assertEquals( 2, result.size() );
+		File f2 = (File) result.get( 0 );
+		checkClassType( f2, doc, folder );
+		f2 = (File) result.get( 1 );
+		checkClassType( f2, doc, folder );
+		s.delete( result.get( 0 ) );
+		s.delete( result.get( 1 ) );
+		tx.commit();
+		s.close();
+	}
+
+	public void testManyToOneOnAbstract() throws Exception {
+		Folder f = new Folder();
+		f.setName( "data" );
+		ProgramExecution remove = new ProgramExecution();
+		remove.setAction( "remove" );
+		remove.setAppliesOn( f );
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		s.persist( f );
+		s.persist( remove );
+		tx.commit();
+		s.clear();
+		tx = s.beginTransaction();
+		remove = (ProgramExecution) s.get( ProgramExecution.class, remove.getId() );
+		assertNotNull( remove );
+		assertNotNull( remove.getAppliesOn().getName() );
+		s.delete( remove );
+		s.delete( remove.getAppliesOn() );
+		tx.commit();
+		s.close();
+
+	}
+
+	private void checkClassType(File fruitToTest, File f, Folder a) {
+		if ( fruitToTest.getName().equals( f.getName() ) ) {
+			assertFalse( fruitToTest instanceof Folder );
+		}
+		else if ( fruitToTest.getName().equals( a.getName() ) ) {
+			assertTrue( fruitToTest instanceof Folder );
+		}
+		else {
+			fail( "Result does not contains the previously inserted elements" );
+		}
+	}
+
+	public void testJoinedAbstractClass() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		s.getTransaction().begin();
+		Sweater sw = new Sweater();
+		sw.setColor( "Black" );
+		sw.setSize( 2 );
+		sw.setSweat( true );
+		s.persist( sw );
+		s.getTransaction().commit();
+		s.clear();
+
+		s = openSession();
+		s.getTransaction().begin();
+		sw = (Sweater) s.get( Sweater.class, sw.getId() );
+		s.delete( sw );
+		s.getTransaction().commit();
+		s.close();
+	}
+
+	public void testInheritance() throws Exception {
+		Session session = openSession();
+		Transaction transaction = session.beginTransaction();
+		String eventPK = "event1";
+		EventInformation event = (EventInformation) session.get( EventInformation.class, eventPK );
+		if ( event == null ) {
+			event = new EventInformation();
+			event.setNotificationId( eventPK );
+			session.persist( event );
+		}
+		String alarmPK = "alarm1";
+		Alarm alarm = (Alarm) session.get( Alarm.class, alarmPK );
+		if ( alarm == null ) {
+			alarm = new Alarm();
+			alarm.setNotificationId( alarmPK );
+			alarm.setEventInfo( event );
+			session.persist( alarm );
+		}
+		transaction.commit();
+		session.close();
+	}
+
+//	public void testManyToOneAndJoin() throws Exception {
+//		Session session = openSession();
+//		Transaction transaction = session.beginTransaction();
+//		Parent parent = new Parent();
+//		session.persist( parent );
+//		PropertyAsset property = new PropertyAsset();
+//		property.setParent( parent );
+//		property.setPrice( 230000d );
+//		FinancialAsset financial = new FinancialAsset();
+//		financial.setParent( parent );
+//		financial.setPrice( 230000d );
+//		session.persist( financial );
+//		session.persist( property );
+//		session.flush();
+//		session.clear();
+//		parent = (Parent) session.get( Parent.class, parent.getId() );
+//		assertNotNull( parent );
+//		assertEquals( 1, parent.getFinancialAssets().size() );
+//		assertEquals( 1, parent.getPropertyAssets().size() );
+//		assertEquals( property.getId(), parent.getPropertyAssets().iterator().next() );
+//		transaction.rollback();
+//		session.close();
+//	}
+
+	@Override
+	protected String[] getXmlFiles() {
+		return new String[] {
+				//"org/hibernate/test/annotations/inheritance/joined/Asset.hbm.xml"
+		};
+	}
+
+	/**
+	 * @see org.hibernate.test.annotations.TestCase#getMappings()
+	 */
+	protected Class[] getMappings() {
+		return new Class[]{
+				File.class,
+				Folder.class,
+				Document.class,
+				SymbolicLink.class,
+				ProgramExecution.class,
+				Clothing.class,
+				Sweater.class,
+				EventInformation.class,
+				Alarm.class,
+				//Asset.class,
+				//Parent.class,
+				//PropertyAsset.class,
+				//FinancialAsset.class
+		};
+	}
+
+}


Property changes on: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/JoinedSubclassTest.java
___________________________________________________________________
Name: svn:executable
   + *

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Parent.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Parent.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Parent.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,49 @@
+//$Id: Parent.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.inheritance.joined;
+
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "Parent")
+public class Parent {
+	private Integer id;
+	private Set propertyAssets = new HashSet();
+	private Set financialAssets = new HashSet();
+
+	@Id @GeneratedValue public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	@OneToMany(cascade = CascadeType.REFRESH, fetch = FetchType.EAGER, mappedBy = "parent", targetEntity = PropertyAsset.class)
+	public Set getPropertyAssets() {
+		return this.propertyAssets;
+	}
+
+	public void setPropertyAssets(Set propertyAssets) {
+		this.propertyAssets = propertyAssets;
+	}
+
+	@OneToMany(cascade = CascadeType.REFRESH, fetch = FetchType.EAGER, mappedBy = "parent", targetEntity = FinancialAsset.class)
+	public Set getFinancialAssets() {
+		return this.financialAssets;
+	}
+
+	public void setFinancialAssets(Set financialAssets) {
+		this.financialAssets = financialAssets;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Pool.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Pool.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Pool.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,38 @@
+//$Id: Pool.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.inheritance.joined;
+
+import javax.persistence.Entity;
+import javax.persistence.SecondaryTable;
+import javax.persistence.Column;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Inheritance(strategy = InheritanceType.JOINED)
+ at SecondaryTable(name="POOL_ADDRESS")
+public class Pool {
+	@Id @GeneratedValue private Integer id;
+	@Column(table = "POOL_ADDRESS")
+	private String address;
+
+	public String getAddress() {
+		return address;
+	}
+
+	public void setAddress(String address) {
+		this.address = address;
+	}
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/ProgramExecution.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/ProgramExecution.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/ProgramExecution.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,47 @@
+//$Id: ProgramExecution.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.inheritance.joined;
+
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class ProgramExecution {
+	@Id
+	@GeneratedValue
+	private Integer id;
+	private String action;
+	@ManyToOne(fetch = FetchType.LAZY)
+	private File appliesOn;
+
+
+	public File getAppliesOn() {
+		return appliesOn;
+	}
+
+	public void setAppliesOn(File appliesOn) {
+		this.appliesOn = appliesOn;
+	}
+
+	public String getAction() {
+		return action;
+	}
+
+	public void setAction(String action) {
+		this.action = action;
+	}
+
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/PropertyAsset.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/PropertyAsset.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/PropertyAsset.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,20 @@
+//$Id: PropertyAsset.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.inheritance.joined;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class PropertyAsset extends Asset {
+	private double price;
+
+	public double getPrice() {
+		return price;
+	}
+
+	public void setPrice(double price) {
+		this.price = price;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Sweater.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Sweater.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/Sweater.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,22 @@
+//$Id: Sweater.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.inheritance.joined;
+
+import javax.persistence.Entity;
+import javax.persistence.PrimaryKeyJoinColumn;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at PrimaryKeyJoinColumn(name = "clothing_id")
+public class Sweater extends Clothing {
+	private boolean isSweat;
+
+	public boolean isSweat() {
+		return isSweat;
+	}
+
+	public void setSweat(boolean sweat) {
+		isSweat = sweat;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/SwimmingPool.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/SwimmingPool.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/SwimmingPool.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,11 @@
+//$Id: SwimmingPool.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.inheritance.joined;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class SwimmingPool extends Pool {
+}
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/SymbolicLink.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/SymbolicLink.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/SymbolicLink.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,29 @@
+//$Id: SymbolicLink.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.inheritance.joined;
+
+import javax.persistence.Entity;
+import javax.persistence.ManyToOne;
+
+ at Entity
+public class SymbolicLink extends File {
+
+	@ManyToOne(optional = false)
+	File target;
+
+	SymbolicLink() {
+	}
+
+	public SymbolicLink(File target) {
+		this.target = target;
+	}
+
+	public File getTarget() {
+		return target;
+	}
+
+	public void setTarget(File target) {
+		this.target = target;
+	}
+
+
+}


Property changes on: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/joined/SymbolicLink.java
___________________________________________________________________
Name: svn:executable
   + *

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/mixed/Document.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/mixed/Document.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/mixed/Document.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,36 @@
+//$Id: Document.java 15056 2008-08-13 18:15:05Z epbernard $
+package org.hibernate.test.annotations.inheritance.mixed;
+
+import javax.persistence.Column;
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+import javax.persistence.SecondaryTable;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at DiscriminatorValue("D")
+ at SecondaryTable(name = "DocumentMixed")
+ at Table(name="Document_Wrong") //illegal use, a warn is raised
+public class Document extends File {
+	private int size;
+
+	Document() {
+	}
+
+	Document(String name, int size) {
+		super( name );
+		this.size = size;
+	}
+
+	@Column(table = "DocumentMixed", name="doc_size", nullable = false)
+	public int getSize() {
+		return size;
+	}
+
+	public void setSize(int size) {
+		this.size = size;
+	}
+}


Property changes on: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/mixed/Document.java
___________________________________________________________________
Name: svn:executable
   + *

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/mixed/File.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/mixed/File.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/mixed/File.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,52 @@
+//$Id: File.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.inheritance.mixed;
+
+import javax.persistence.DiscriminatorColumn;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.SecondaryTable;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Inheritance(strategy = InheritanceType.SINGLE_TABLE)
+ at Table(name = "FileMixed")
+ at SecondaryTable(name = "FileFolderMixed")
+ at DiscriminatorColumn(length = 1)
+public abstract class File {
+	private String name;
+	private Folder parent;
+
+	File() {
+	}
+
+	public File(String name) {
+		this.name = name;
+	}
+
+	@Id
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String id) {
+		this.name = id;
+	}
+
+	@ManyToOne
+	@JoinColumn(table = "FileFolderMixed")
+	public Folder getParent() {
+		return parent;
+	}
+
+	public void setParent(Folder parent) {
+		this.parent = parent;
+	}
+
+}


Property changes on: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/mixed/File.java
___________________________________________________________________
Name: svn:executable
   + *

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/mixed/Folder.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/mixed/Folder.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/mixed/Folder.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,33 @@
+//$Id: Folder.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.inheritance.mixed;
+
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+import javax.persistence.OneToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at DiscriminatorValue("F")
+public class Folder extends File {
+	private Set<File> children = new HashSet<File>();
+
+	Folder() {
+	}
+
+	public Folder(String name) {
+		super( name );
+	}
+
+	@OneToMany(mappedBy = "parent")
+	public Set<File> getChildren() {
+		return children;
+	}
+
+	public void setChildren(Set children) {
+		this.children = children;
+	}
+}


Property changes on: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/mixed/Folder.java
___________________________________________________________________
Name: svn:executable
   + *

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/mixed/SubclassTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/mixed/SubclassTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/mixed/SubclassTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,76 @@
+//$Id: SubclassTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.inheritance.mixed;
+
+import java.util.List;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.exception.SQLGrammarException;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class SubclassTest extends TestCase {
+
+	public SubclassTest(String x) {
+		super( x );
+	}
+
+	public void testDefault() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		File doc = new Document( "Enron Stuff To Shred", 1000 );
+		Folder folder = new Folder( "Enron" );
+		s.persist( doc );
+		s.persist( folder );
+		try {
+			tx.commit();
+		}
+		catch (SQLGrammarException e) {
+			System.err.println( e.getSQLException().getNextException() );
+		}
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		List result = s.createCriteria( File.class ).list();
+		assertNotNull( result );
+		assertEquals( 2, result.size() );
+		File f2 = (File) result.get( 0 );
+		checkClassType( f2, doc, folder );
+		f2 = (File) result.get( 1 );
+		checkClassType( f2, doc, folder );
+		s.delete( result.get( 0 ) );
+		s.delete( result.get( 1 ) );
+		tx.commit();
+		s.close();
+	}
+
+	private void checkClassType(File fruitToTest, File f, Folder a) {
+		if ( fruitToTest.getName().equals( f.getName() ) ) {
+			assertFalse( fruitToTest instanceof Folder );
+		}
+		else if ( fruitToTest.getName().equals( a.getName() ) ) {
+			assertTrue( fruitToTest instanceof Folder );
+		}
+		else {
+			fail( "Result does not contains the previously inserted elements" );
+		}
+	}
+
+	/**
+	 * @see org.hibernate.test.annotations.TestCase#getMappings()
+	 */
+	protected Class[] getMappings() {
+		return new Class[]{
+				File.class,
+				Folder.class,
+				Document.class,
+				SymbolicLink.class
+		};
+	}
+
+}


Property changes on: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/mixed/SubclassTest.java
___________________________________________________________________
Name: svn:executable
   + *

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/mixed/SymbolicLink.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/mixed/SymbolicLink.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/mixed/SymbolicLink.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,35 @@
+//$Id: SymbolicLink.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.inheritance.mixed;
+
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.SecondaryTable;
+
+ at Entity
+ at DiscriminatorValue("L")
+ at SecondaryTable(name = "SymbolicLinkMixed")
+public class SymbolicLink extends File {
+
+	File target;
+
+	SymbolicLink() {
+	}
+
+	public SymbolicLink(File target) {
+		this.target = target;
+	}
+
+	@ManyToOne(optional = false)
+	@JoinColumn(table = "SymbolicLinkMixed")
+	public File getTarget() {
+		return target;
+	}
+
+	public void setTarget(File target) {
+		this.target = target;
+	}
+
+
+}


Property changes on: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/mixed/SymbolicLink.java
___________________________________________________________________
Name: svn:executable
   + *

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/singletable/Building.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/singletable/Building.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/singletable/Building.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,43 @@
+//$Id: Building.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.inheritance.singletable;
+
+import javax.persistence.Column;
+import javax.persistence.DiscriminatorColumn;
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+import org.hibernate.annotations.ForceDiscriminator;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at DiscriminatorColumn(name = "discriminator_disc")
+ at ForceDiscriminator
+ at DiscriminatorValue("B")
+public class Building {
+	@Id
+	@GeneratedValue
+	@Column(name = "discriminator_id")
+	private Integer id;
+	@Column(name = "discriminator_street")
+	private String street;
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getStreet() {
+		return street;
+	}
+
+	public void setStreet(String street) {
+		this.street = street;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/singletable/Funk.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/singletable/Funk.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/singletable/Funk.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,22 @@
+//$Id: Funk.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.inheritance.singletable;
+
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at DiscriminatorValue("1")
+public class Funk extends Music {
+	private int starred;
+
+	public int getStarred() {
+		return starred;
+	}
+
+	public void setStarred(int starred) {
+		this.starred = starred;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/singletable/House.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/singletable/House.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/singletable/House.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,13 @@
+//$Id: House.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.inheritance.singletable;
+
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at DiscriminatorValue("H")
+public class House extends Building {
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/singletable/Music.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/singletable/Music.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/singletable/Music.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,53 @@
+//$Id: Music.java 16303 2009-04-11 04:42:16Z gbadner $
+package org.hibernate.test.annotations.inheritance.singletable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.DiscriminatorColumn;
+import javax.persistence.DiscriminatorType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.UniqueConstraint;
+
+import org.hibernate.annotations.DiscriminatorFormula;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at DiscriminatorColumn(discriminatorType=DiscriminatorType.INTEGER)
+ at DiscriminatorFormula("case when zik_type is null then 0 else zik_type end")
+ at Table(uniqueConstraints = @UniqueConstraint(columnNames = {"avgBeat", "starred"} ))
+public abstract class Music {
+	private Integer id;
+	private int avgBeat;
+	private Integer type;
+
+	@Column(name = "zik_type")
+	public Integer getType() {
+		return type;
+	}
+
+	public void setType(Integer type) {
+		this.type = type;
+	}
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public int getAvgBeat() {
+		return avgBeat;
+	}
+
+	public void setAvgBeat(int avgBeat) {
+		this.avgBeat = avgBeat;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/singletable/Noise.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/singletable/Noise.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/singletable/Noise.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,13 @@
+//$Id: Noise.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.inheritance.singletable;
+
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at DiscriminatorValue("0")
+public class Noise extends Music {
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/singletable/PaperTrash.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/singletable/PaperTrash.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/singletable/PaperTrash.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,11 @@
+//$Id: PaperTrash.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.inheritance.singletable;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class PaperTrash extends Trash {
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/singletable/Rock.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/singletable/Rock.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/singletable/Rock.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,13 @@
+//$Id: Rock.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.inheritance.singletable;
+
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at DiscriminatorValue("2")
+public class Rock extends Music {
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/singletable/Trash.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/singletable/Trash.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/singletable/Trash.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,19 @@
+//$Id: Trash.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.inheritance.singletable;
+
+import javax.persistence.DiscriminatorColumn;
+import javax.persistence.DiscriminatorType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at DiscriminatorColumn(discriminatorType = DiscriminatorType.INTEGER)
+public class Trash {
+	@Id
+	@GeneratedValue
+	private Integer id;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/union/Document.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/union/Document.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/union/Document.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,32 @@
+//$Id: Document.java 16293 2009-04-10 19:17:45Z gbadner $
+package org.hibernate.test.annotations.inheritance.union;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "DocumentUnion")
+public class Document extends File {
+	private int size;
+
+	Document() {
+	}
+
+	Document(String name, int size) {
+		super( name );
+		this.size = size;
+	}
+
+	@Column(name="xsize")
+	public int getSize() {
+		return size;
+	}
+
+	public void setSize(int size) {
+		this.size = size;
+	}
+}


Property changes on: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/union/Document.java
___________________________________________________________________
Name: svn:executable
   + *

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/union/File.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/union/File.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/union/File.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,44 @@
+//$Id: File.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.inheritance.union;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+public abstract class File {
+	private String name;
+	private Folder parent;
+
+	File() {
+	}
+
+	public File(String name) {
+		this.name = name;
+	}
+
+	@Id
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String id) {
+		this.name = id;
+	}
+
+	@ManyToOne
+	public Folder getParent() {
+		return parent;
+	}
+
+	public void setParent(Folder parent) {
+		this.parent = parent;
+	}
+
+}


Property changes on: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/union/File.java
___________________________________________________________________
Name: svn:executable
   + *

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/union/Folder.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/union/Folder.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/union/Folder.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,33 @@
+//$Id: Folder.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.inheritance.union;
+
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "FolderUnion")
+public class Folder extends File {
+	private Set<File> children = new HashSet<File>();
+
+	Folder() {
+	}
+
+	public Folder(String name) {
+		super( name );
+	}
+
+	@OneToMany(mappedBy = "parent")
+	public Set<File> getChildren() {
+		return children;
+	}
+
+	public void setChildren(Set children) {
+		this.children = children;
+	}
+}


Property changes on: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/union/Folder.java
___________________________________________________________________
Name: svn:executable
   + *

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/union/SubclassTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/union/SubclassTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/union/SubclassTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,68 @@
+//$Id: SubclassTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.inheritance.union;
+
+import java.util.List;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class SubclassTest extends TestCase {
+
+	public SubclassTest(String x) {
+		super( x );
+	}
+
+	public void testDefault() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		File doc = new Document( "Enron Stuff To Shred", 1000 );
+		Folder folder = new Folder( "Enron" );
+		s.persist( doc );
+		s.persist( folder );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		List result = s.createCriteria( File.class ).list();
+		assertNotNull( result );
+		assertEquals( 2, result.size() );
+		File f2 = (File) result.get( 0 );
+		checkClassType( f2, doc, folder );
+		f2 = (File) result.get( 1 );
+		checkClassType( f2, doc, folder );
+		tx.commit();
+		s.close();
+	}
+
+	private void checkClassType(File fruitToTest, File f, Folder a) {
+		if ( fruitToTest.getName().equals( f.getName() ) ) {
+			assertFalse( fruitToTest instanceof Folder );
+		}
+		else if ( fruitToTest.getName().equals( a.getName() ) ) {
+			assertTrue( fruitToTest instanceof Folder );
+		}
+		else {
+			fail( "Result does not contains the previously inserted elements" );
+		}
+	}
+
+	/**
+	 * @see org.hibernate.test.annotations.TestCase#getMappings()
+	 */
+	protected Class[] getMappings() {
+		return new Class[]{
+				File.class,
+				Folder.class,
+				Document.class,
+				SymbolicLink.class
+		};
+	}
+
+}


Property changes on: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/union/SubclassTest.java
___________________________________________________________________
Name: svn:executable
   + *

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/union/SymbolicLink.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/union/SymbolicLink.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/union/SymbolicLink.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,31 @@
+//$Id: SymbolicLink.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.inheritance.union;
+
+import javax.persistence.Entity;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+ at Entity
+ at Table(name = "SymbolicLinkUnion")
+public class SymbolicLink extends File {
+
+	File target;
+
+	SymbolicLink() {
+	}
+
+	public SymbolicLink(File target) {
+		this.target = target;
+	}
+
+	@ManyToOne(optional = false)
+	public File getTarget() {
+		return target;
+	}
+
+	public void setTarget(File target) {
+		this.target = target;
+	}
+
+
+}


Property changes on: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/inheritance/union/SymbolicLink.java
___________________________________________________________________
Name: svn:executable
   + *

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/interfaces/Contact.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/interfaces/Contact.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/interfaces/Contact.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,11 @@
+//$Id: Contact.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.interfaces;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface Contact {
+	Integer getId();
+
+	String getName();
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/interfaces/ContactImpl.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/interfaces/ContactImpl.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/interfaces/ContactImpl.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,33 @@
+//$Id: ContactImpl.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.interfaces;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class ContactImpl implements Contact {
+	private Integer id;
+	private String name;
+
+	@Id
+	@GeneratedValue
+	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;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/interfaces/InterfacesTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/interfaces/InterfacesTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/interfaces/InterfacesTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,20 @@
+//$Id: InterfacesTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.interfaces;
+
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class InterfacesTest extends TestCase {
+	public void testInterface() {
+
+	}
+
+	protected Class[] getMappings() {
+		return new Class[]{
+				ContactImpl.class,
+				UserImpl.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/interfaces/User.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/interfaces/User.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/interfaces/User.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,15 @@
+//$Id: User.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.interfaces;
+
+import java.util.Collection;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface User {
+	Integer getId();
+
+	Collection<Contact> getContacts();
+
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/interfaces/UserImpl.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/interfaces/UserImpl.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/interfaces/UserImpl.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,36 @@
+//$Id: UserImpl.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.interfaces;
+
+import java.util.Collection;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class UserImpl implements User {
+	private Collection<Contact> contacts;
+	private Integer id;
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	@OneToMany(targetEntity = ContactImpl.class)
+	public Collection<Contact> getContacts() {
+		return contacts;
+	}
+
+	public void setContacts(Collection<Contact> contacts) {
+		this.contacts = contacts;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/A.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/A.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/A.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,24 @@
+//$Id: A.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.join;
+
+import java.util.Date;
+import javax.persistence.MappedSuperclass;
+import javax.persistence.Column;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MappedSuperclass
+public abstract class A {
+	@Column(nullable = false)
+	private Date createDate;
+
+
+	public Date getCreateDate() {
+		return createDate;
+	}
+
+	public void setCreateDate(Date createDate) {
+		this.createDate = createDate;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/B.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/B.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/B.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,38 @@
+//$Id: B.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.join;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Inheritance( strategy = InheritanceType.SINGLE_TABLE )
+public abstract class B extends A {
+	@Id
+	@GeneratedValue
+	private Integer id;
+	@Column(nullable = false) private String 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;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/C.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/C.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/C.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,26 @@
+//$Id: C.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.join;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.SecondaryTable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at DiscriminatorValue("C")
+ at SecondaryTable(name="C")
+public class C extends B {
+	@Column(table = "C") private int age;
+
+
+	public int getAge() {
+		return age;
+	}
+
+	public void setAge(int age) {
+		this.age = age;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/Cat.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/Cat.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/Cat.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,101 @@
+//$Id: Cat.java 16418 2009-04-23 09:55:33Z jcosta at redhat.com $
+package org.hibernate.test.annotations.join;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.SecondaryTable;
+import javax.persistence.SecondaryTables;
+import javax.persistence.UniqueConstraint;
+
+import org.hibernate.annotations.Index;
+import org.hibernate.annotations.Table;
+import org.hibernate.annotations.ForeignKey;
+import org.hibernate.annotations.Tables;
+import org.hibernate.annotations.FetchMode;
+import org.hibernate.annotations.SQLInsert;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at SecondaryTables({
+ at SecondaryTable(name = "`Cat nbr1`"),
+ at SecondaryTable(name = "Cat2", uniqueConstraints = {@UniqueConstraint(columnNames = {"storyPart2"})})
+		})
+ at Tables( {
+	@Table(appliesTo = "Cat", indexes = @Index(name = "secondname",
+			columnNames = "secondName"), comment = "My cat table" ),
+	@Table(appliesTo = "Cat2", foreignKey = @ForeignKey(name="FK_CAT2_CAT"), fetch = FetchMode.SELECT,
+			sqlInsert=@SQLInsert(sql="insert into Cat2(storyPart2, id) values(upper(?), ?)") )
+			} )
+public class Cat implements Serializable {
+
+	private Integer id;
+	private String name;
+	private String secondName;
+	private String storyPart1;
+	private String storyPart2;
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	@Index(name = "nameindex")
+	public String getName() {
+		return name;
+	}
+
+	public void setId(Integer integer) {
+		id = integer;
+	}
+
+	public void setName(String string) {
+		name = string;
+	}
+
+	public String getSecondName() {
+		return secondName;
+	}
+
+	public void setSecondName(String secondName) {
+		this.secondName = secondName;
+	}
+
+// Bug HHH-36
+//	@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
+//	@JoinColumn(name="CAT_ID", secondaryTable="ExtendedLife")
+//	public Set<Life> getLifes() {
+//		return lifes;
+//	}
+//
+//	public void setLifes(Set<Life> collection) {
+//		lifes = collection;
+//	}
+
+	@Column(table = "`Cat nbr1`")
+	@Index(name = "story1index")
+	public String getStoryPart1() {
+		return storyPart1;
+	}
+
+	@Column(table = "Cat2", nullable = false)
+	public String getStoryPart2() {
+		return storyPart2;
+	}
+
+
+	public void setStoryPart1(String string) {
+		storyPart1 = string;
+	}
+
+
+	public void setStoryPart2(String string) {
+		storyPart2 = string;
+	}
+
+}
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/Death.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/Death.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/Death.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,30 @@
+//$Id: Death.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.join;
+
+import java.io.Serializable;
+import java.util.Date;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.SecondaryTable;
+import javax.persistence.PrimaryKeyJoinColumn;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at SecondaryTable(
+		name = "ExtendedDeath",
+		pkJoinColumns = @PrimaryKeyJoinColumn(name = "DEATH_ID")
+)
+public class Death implements Serializable {
+	@Id
+	@GeneratedValue(strategy = GenerationType.AUTO)
+	public Integer id;
+	@Column(name = "death_date")
+	public Date date;
+	@Column(table = "ExtendedDeath")
+	public String howDoesItHappen;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/Dog.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/Dog.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/Dog.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,40 @@
+//$Id: Dog.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.join;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.PrimaryKeyJoinColumn;
+import javax.persistence.SecondaryTable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at SecondaryTable(
+		name = "DogThoroughbred",
+		pkJoinColumns = {@PrimaryKeyJoinColumn(name = "NAME", referencedColumnName = "name"),
+		@PrimaryKeyJoinColumn(name = "OWNER_NAME", referencedColumnName = "ownerName")}
+)
+public class Dog {
+	@Id
+	public DogPk id;
+	public int weight;
+	@Column(table = "DogThoroughbred")
+	public String thoroughbredName;
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( !( o instanceof Dog ) ) return false;
+
+		final Dog dog = (Dog) o;
+
+		if ( !id.equals( dog.id ) ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		return id.hashCode();
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/DogPk.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/DogPk.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/DogPk.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,33 @@
+//$Id: DogPk.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.join;
+
+import java.io.Serializable;
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class DogPk implements Serializable {
+	public String name;
+	public String ownerName;
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( !( o instanceof DogPk ) ) return false;
+
+		final DogPk dogPk = (DogPk) o;
+
+		if ( !name.equals( dogPk.name ) ) return false;
+		if ( !ownerName.equals( dogPk.ownerName ) ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		int result;
+		result = name.hashCode();
+		result = 29 * result + ownerName.hashCode();
+		return result;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/JoinTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/JoinTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/JoinTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,206 @@
+//$Id: JoinTest.java 16418 2009-04-23 09:55:33Z jcosta at redhat.com $
+package org.hibernate.test.annotations.join;
+
+import java.util.Date;
+
+import org.hibernate.Criteria;
+import org.hibernate.HibernateException;
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.criterion.Expression;
+import org.hibernate.mapping.Join;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class JoinTest extends TestCase {
+
+	public void testDefaultValue() throws Exception {
+		Join join = (Join) getCfg().getClassMapping( Life.class.getName() ).getJoinClosureIterator().next();
+		assertEquals( "ExtendedLife", join.getTable().getName() );
+		org.hibernate.mapping.Column owner = new org.hibernate.mapping.Column();
+		owner.setName( "LIFE_ID" );
+		assertTrue( join.getTable().getPrimaryKey().containsColumn( owner ) );
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Life life = new Life();
+		life.duration = 15;
+		life.fullDescription = "Long long description";
+		s.persist( life );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		Query q = s.createQuery( "from " + Life.class.getName() );
+		life = (Life) q.uniqueResult();
+		assertEquals( "Long long description", life.fullDescription );
+		tx.commit();
+		s.close();
+	}
+
+	public void testCompositePK() throws Exception {
+		Join join = (Join) getCfg().getClassMapping( Dog.class.getName() ).getJoinClosureIterator().next();
+		assertEquals( "DogThoroughbred", join.getTable().getName() );
+		org.hibernate.mapping.Column owner = new org.hibernate.mapping.Column();
+		owner.setName( "OWNER_NAME" );
+		assertTrue( join.getTable().getPrimaryKey().containsColumn( owner ) );
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Dog dog = new Dog();
+		DogPk id = new DogPk();
+		id.name = "Thalie";
+		id.ownerName = "Martine";
+		dog.id = id;
+		dog.weight = 30;
+		dog.thoroughbredName = "Colley";
+		s.persist( dog );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		Query q = s.createQuery( "from Dog" );
+		dog = (Dog) q.uniqueResult();
+		assertEquals( "Colley", dog.thoroughbredName );
+		tx.commit();
+		s.close();
+	}
+
+	public void testExplicitValue() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Death death = new Death();
+		death.date = new Date();
+		death.howDoesItHappen = "Well, haven't seen it";
+		s.persist( death );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		Query q = s.createQuery( "from " + Death.class.getName() );
+		death = (Death) q.uniqueResult();
+		assertEquals( "Well, haven't seen it", death.howDoesItHappen );
+		s.delete( death );
+		tx.commit();
+		s.close();
+	}
+
+	public void testManyToOne() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Life life = new Life();
+		Cat cat = new Cat();
+		cat.setName( "kitty" );
+		cat.setStoryPart2( "and the story continues" );
+		life.duration = 15;
+		life.fullDescription = "Long long description";
+		life.owner = cat;
+		s.persist( life );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		Criteria crit = s.createCriteria( Life.class );
+		crit.createCriteria( "owner" ).add( Expression.eq( "name", "kitty" ) );
+		life = (Life) crit.uniqueResult();
+		assertEquals( "Long long description", life.fullDescription );
+		s.delete( life.owner );
+		s.delete( life );
+		tx.commit();
+		s.close();
+	}
+
+	public void testUniqueConstaintOnSecondaryTable() throws Exception {
+		Cat cat = new Cat();
+		cat.setStoryPart2( "My long story" );
+		Cat cat2 = new Cat();
+		cat2.setStoryPart2( "My long story" );
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		try {
+			s.persist( cat );
+			s.persist( cat2 );
+			tx.commit();
+			fail( "unique constraints violation on secondary table" );
+		}
+		catch (HibernateException e) {
+			//success
+		}
+		finally {
+			if ( tx != null ) tx.rollback();
+			s.close();
+		}
+	}
+
+	public void testFetchModeOnSecondaryTable() throws Exception {
+		Cat cat = new Cat();
+		cat.setStoryPart2( "My long story" );
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+
+		s.persist( cat );
+		s.flush();
+		s.clear();
+		
+		s.get( Cat.class, cat.getId() );
+		//Find a way to test it, I need to define the secondary table on a subclass
+
+		tx.rollback();
+		s.close();
+	}
+
+	public void testCustomSQL() throws Exception {
+		Cat cat = new Cat();
+		String storyPart2 = "My long story";
+		cat.setStoryPart2( storyPart2 );
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+
+		s.persist( cat );
+		s.flush();
+		s.clear();
+
+		Cat c = (Cat) s.get( Cat.class, cat.getId() );
+		assertEquals( storyPart2.toUpperCase(), c.getStoryPart2() );
+
+		tx.rollback();
+		s.close();
+	}
+
+	public void testMappedSuperclassAndSecondaryTable() throws Exception {
+		Session s = openSession( );
+		s.getTransaction().begin();
+		C c = new C();
+		c.setAge( 12 );
+		c.setCreateDate( new Date() );
+		c.setName( "Bob" );
+		s.persist( c );
+		s.flush();
+		s.clear();
+		c= (C) s.get( C.class, c.getId() );
+		assertNotNull( c.getCreateDate() );
+		assertNotNull( c.getName() );
+		s.getTransaction().rollback();
+		s.close();
+	}
+
+	/**
+	 * @see org.hibernate.test.annotations.TestCase#getMappings()
+	 */
+	protected Class[] getMappings() {
+		return new Class[]{
+				Life.class,
+				Death.class,
+				Cat.class,
+				Dog.class,
+				A.class,
+				B.class,
+				C.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/Life.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/Life.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/join/Life.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,34 @@
+//$Id: Life.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.join;
+
+import java.io.Serializable;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.SecondaryTable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at SecondaryTable(name = "ExtendedLife")
+public class Life implements Serializable {
+	@Id
+	@GeneratedValue(strategy = GenerationType.AUTO)
+	@Column(name = "LIFE_ID")
+	public Integer id;
+
+	public int duration;
+	@Column(table = "ExtendedLife")
+	public String fullDescription;
+
+	@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
+	@JoinColumn(name = "CAT_ID", table = "ExtendedLife")
+	public Cat owner;
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/loader/Loader.hbm.xml
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/loader/Loader.hbm.xml	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/loader/Loader.hbm.xml	2009-11-24 21:03:15 UTC (rev 18049)
@@ -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">
+
+<!--
+
+  Used to demonstrate the declarative configuration
+  of both hbm files and annotated classes
+  See hibernate.cfg.xml and ConfigurationTest
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.annotations.loader">
+
+    <sql-query name="loadByTeam">
+        <load-collection alias="p" role="Team.players"/>
+        select {p.*} from Player p where p.team_id = ?
+    </sql-query>
+
+</hibernate-mapping>
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/loader/LoaderTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/loader/LoaderTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/loader/LoaderTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,69 @@
+//$Id: LoaderTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.loader;
+
+import java.util.Set;
+import java.util.Iterator;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class LoaderTest extends TestCase {
+
+
+	protected String[] getXmlFiles() {
+		return new String[] {
+				"org/hibernate/test/annotations/loader/Loader.hbm.xml"
+		};
+	}
+
+	public void testBasic() throws Exception {
+		Session s = openSession( );
+		Transaction tx = s.beginTransaction();
+		Team t = new Team();
+		Player p = new Player();
+		p.setName("me");
+		t.getPlayers().add(p);
+		p.setTeam(t);
+		
+
+		try {
+			s.persist(p);
+			s.persist(t);
+			tx.commit();
+			s.close();
+			
+			s= openSession( );
+			tx = s.beginTransaction();
+			Team t2 = (Team)s.load(Team.class,new Long(1));
+			Set<Player> players = t2.getPlayers();
+			Iterator<Player> iterator = players.iterator();
+			assertEquals("me", iterator.next().getName());
+			tx.commit();
+			
+		}
+		catch (Exception e) {
+			e.printStackTrace();
+			if ( tx != null ) tx.rollback();
+		}
+		finally {
+			s.close();
+		}
+	}
+
+	/**
+	 * @see org.hibernate.test.annotations.TestCase#getMappings()
+	 */
+	protected Class[] getMappings() {
+		return new Class[]{
+				Player.class,
+				Team.class
+		};
+	}
+
+}
+


Property changes on: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/loader/LoaderTest.java
___________________________________________________________________
Name: svn:executable
   + *

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/loader/Player.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/loader/Player.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/loader/Player.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,48 @@
+package org.hibernate.test.annotations.loader;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+import org.hibernate.annotations.Fetch;
+import org.hibernate.annotations.FetchMode;
+
+ at Entity
+public class Player {
+	
+	private Long id;
+	private Team team;
+	private String name;
+	
+    @Id
+    @GeneratedValue
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	@ManyToOne(targetEntity = Team.class)
+	@Fetch(FetchMode.SELECT)
+	@JoinColumn(name = "team_id")
+	public Team getTeam() {
+		return team;
+	}
+
+	public void setTeam(Team team) {
+		this.team = team;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+}


Property changes on: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/loader/Player.java
___________________________________________________________________
Name: svn:executable
   + *

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/loader/Team.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/loader/Team.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/loader/Team.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,45 @@
+package org.hibernate.test.annotations.loader;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+import org.hibernate.annotations.Fetch;
+import org.hibernate.annotations.FetchMode;
+import org.hibernate.annotations.Loader;
+import org.hibernate.annotations.NamedNativeQueries;
+import org.hibernate.annotations.NamedNativeQuery;
+
+import javax.persistence.NamedQuery;
+
+ at Entity
+public class Team {
+	private Long id;
+	private Set<Player> players = new HashSet<Player>();
+	
+    @Id
+    @GeneratedValue
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+	
+	@OneToMany(targetEntity = Player.class, mappedBy = "team", fetch = FetchType.EAGER)
+	@Fetch(FetchMode.SELECT)
+	@Loader(namedQuery = "loadByTeam")
+	public Set<Player> getPlayers() {
+		return players;
+	}
+
+	public void setPlayers(Set<Player> players) {
+		this.players = players;
+	}
+}


Property changes on: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/loader/Team.java
___________________________________________________________________
Name: svn:executable
   + *

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/lob/Book.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/lob/Book.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/lob/Book.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,79 @@
+//$Id: Book.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.lob;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Lob;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "lob_book")
+public class Book {
+	private Integer id;
+	private String shortDescription;
+	private String fullText;
+	private Character[] code;
+	private char[] code2;
+	private Editor editor;
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getShortDescription() {
+		return shortDescription;
+	}
+
+	public void setShortDescription(String shortDescription) {
+		this.shortDescription = shortDescription;
+	}
+
+	@Lob
+	@Column(name = "fld_fulltext")
+	public String getFullText() {
+		return fullText;
+	}
+
+	public void setFullText(String fullText) {
+		this.fullText = fullText;
+	}
+
+	@Lob
+	@Column(name = "fld_code")
+	public Character[] getCode() {
+		return code;
+	}
+
+	public void setCode(Character[] code) {
+		this.code = code;
+	}
+
+	@Lob
+	public char[] getCode2() {
+		return code2;
+	}
+
+	public void setCode2(char[] code2) {
+		this.code2 = code2;
+	}
+
+	@Lob
+	public Editor getEditor() {
+		return editor;
+	}
+
+	public void setEditor(Editor editor) {
+		this.editor = editor;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/lob/CompiledCode.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/lob/CompiledCode.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/lob/CompiledCode.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,56 @@
+//$Id: CompiledCode.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.lob;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Lob;
+
+/**
+ * Compiled code representation
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class CompiledCode {
+	private Integer id;
+	private Byte[] header;
+	private byte[] fullCode;
+	private byte[] metadata;
+
+	public byte[] getMetadata() {
+		return metadata;
+	}
+
+	public void setMetadata(byte[] metadata) {
+		this.metadata = metadata;
+	}
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	@Lob
+	public Byte[] getHeader() {
+		return header;
+	}
+
+	public void setHeader(Byte[] header) {
+		this.header = header;
+	}
+
+	@Lob
+	public byte[] getFullCode() {
+		return fullCode;
+	}
+
+	public void setFullCode(byte[] fullCode) {
+		this.fullCode = fullCode;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/lob/Editor.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/lob/Editor.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/lob/Editor.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,19 @@
+//$Id: Editor.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.lob;
+
+import java.io.Serializable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Editor implements Serializable {
+	private String name;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/lob/LobTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/lob/LobTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/lob/LobTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,131 @@
+//$Id: LobTest.java 17724 2009-10-13 15:47:59Z stliu $
+package org.hibernate.test.annotations.lob;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class LobTest extends TestCase {
+	public void testSerializableToBlob() throws Exception {
+		Book book = new Book();
+		Editor editor = new Editor();
+		editor.setName( "O'Reilly" );
+		book.setEditor( editor );
+		book.setCode2( new char[]{'r'} );
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		s.persist( book );
+		tx.commit();
+		s.close();
+		s = openSession();
+		tx = s.beginTransaction();
+		Book loadedBook = (Book) s.get( Book.class, book.getId() );
+		assertNotNull( loadedBook.getEditor() );
+		assertEquals( book.getEditor().getName(), loadedBook.getEditor().getName() );
+		loadedBook.setEditor( null );
+		tx.commit();
+		s.close();
+		s = openSession();
+		tx = s.beginTransaction();
+		loadedBook = (Book) s.get( Book.class, book.getId() );
+		assertNull( loadedBook.getEditor() );
+		tx.commit();
+		s.close();
+
+	}
+
+	public void testClob() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Book b = new Book();
+		b.setShortDescription( "Hibernate Bible" );
+		b.setFullText( "Hibernate in Action aims to..." );
+		b.setCode( new Character[]{'a', 'b', 'c'} );
+		b.setCode2( new char[]{'a', 'b', 'c'} );
+		s.persist( b );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		Book b2 = (Book) s.get( Book.class, b.getId() );
+		assertNotNull( b2 );
+		assertEquals( b2.getFullText(), b.getFullText() );
+		assertEquals( b2.getCode()[1].charValue(), b.getCode()[1].charValue() );
+		assertEquals( b2.getCode2()[2], b.getCode2()[2] );
+		tx.commit();
+		s.close();
+	}
+
+	public void testBlob() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		CompiledCode cc = new CompiledCode();
+		Byte[] header = new Byte[2];
+		header[0] = new Byte( (byte) 3 );
+		header[1] = new Byte( (byte) 0 );
+		cc.setHeader( header );
+		int codeSize = 5;
+		byte[] full = new byte[codeSize];
+		for ( int i = 0; i < codeSize ; i++ ) {
+			full[i] = (byte) ( 1 + i );
+		}
+		cc.setFullCode( full );
+		s.persist( cc );
+		tx.commit();
+		s.close();
+		s = openSession();
+		tx = s.beginTransaction();
+		CompiledCode recompiled = (CompiledCode) s.get( CompiledCode.class, cc.getId() );
+		assertEquals( recompiled.getHeader()[1], cc.getHeader()[1] );
+		assertEquals( recompiled.getFullCode()[codeSize - 1], cc.getFullCode()[codeSize - 1] );
+		tx.commit();
+		s.close();
+	}
+
+	public void testBinary() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		CompiledCode cc = new CompiledCode();
+		byte[] metadata = new byte[2];
+		metadata[0] = (byte) 3;
+		metadata[1] = (byte) 0;
+		cc.setMetadata( metadata );
+		s.persist( cc );
+		tx.commit();
+		s.close();
+		s = openSession();
+		tx = s.beginTransaction();
+		CompiledCode recompiled = (CompiledCode) s.get( CompiledCode.class, cc.getId() );
+		assertEquals( recompiled.getMetadata()[1], cc.getMetadata()[1] );
+		tx.commit();
+		s.close();
+	}
+
+	@Override
+	protected boolean runForCurrentDialect() {
+		return super.runForCurrentDialect() && getDialect().supportsExpectedLobUsagePattern();
+	}
+
+	public LobTest(String x) {
+		super( x );
+	}
+
+	protected Class[] getMappings() {
+		return new Class[]{
+				Book.class,
+				CompiledCode.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Building.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Building.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Building.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,35 @@
+//$Id: Building.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.manytomany;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Building {
+	@Id @GeneratedValue private Long id;
+
+	@ManyToOne @JoinColumn(name="company_id", referencedColumnName = "name")
+	private BuildingCompany company;
+
+	public BuildingCompany getCompany() {
+		return company;
+	}
+
+	public void setCompany(BuildingCompany company) {
+		this.company = company;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/BuildingCompany.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/BuildingCompany.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/BuildingCompany.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,29 @@
+//$Id: BuildingCompany.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.manytomany;
+
+import java.util.Date;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class BuildingCompany extends Company {
+	@Id @GeneratedValue private Long id;
+	private Date foundedIn;
+
+	public Date getFoundedIn() {
+		return foundedIn;
+	}
+
+	public void setFoundedIn(Date foundedIn) {
+		this.foundedIn = foundedIn;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Cat.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Cat.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Cat.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,68 @@
+//$Id: Cat.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.manytomany;
+
+import java.util.Set;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.ManyToMany;
+import javax.persistence.Table;
+import javax.persistence.JoinTable;
+import javax.persistence.JoinColumn;
+
+import org.hibernate.annotations.Index;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "tbl_cat")
+//ANN-630
+//@org.hibernate.annotations.Table(appliesTo= "TT", indexes = @Index(name = "testidx", columnNames = "cat_id"))
+public class Cat {
+	private CatPk id;
+	private int age;
+	private Set<Woman> humanContacts;
+
+	@ManyToMany
+	//@Index(name = "CAT_HUMAN_IDX")
+	@JoinTable(name="TT")
+	public Set<Woman> getHumanContacts() {
+		return humanContacts;
+	}
+
+	public void setHumanContacts(Set<Woman> humanContacts) {
+		this.humanContacts = humanContacts;
+	}
+
+	@EmbeddedId()
+	public CatPk getId() {
+		return id;
+	}
+
+	public void setId(CatPk id) {
+		this.id = id;
+	}
+
+	public int getAge() {
+		return age;
+	}
+
+	public void setAge(int age) {
+		this.age = age;
+	}
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( !( o instanceof Cat ) ) return false;
+
+		final Cat cat = (Cat) o;
+
+		if ( !id.equals( cat.id ) ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		return id.hashCode();
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/CatPk.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/CatPk.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/CatPk.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,50 @@
+//$Id: CatPk.java 16343 2009-04-15 18:33:43Z gbadner $
+package org.hibernate.test.annotations.manytomany;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class CatPk implements Serializable {
+	private String name;
+	private String thoroughbred;
+
+	@Column(length=128)
+	public String getThoroughbred() {
+		return thoroughbred;
+	}
+
+	public void setThoroughbred(String thoroughbred) {
+		this.thoroughbred = thoroughbred;
+	}
+
+	@Column(length=128)
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( !( o instanceof CatPk ) ) return false;
+
+		final CatPk catPk = (CatPk) o;
+
+		if ( !name.equals( catPk.name ) ) return false;
+		if ( !thoroughbred.equals( catPk.thoroughbred ) ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		int result;
+		result = name.hashCode();
+		result = 29 * result + thoroughbred.hashCode();
+		return result;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/City.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/City.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/City.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,35 @@
+//$Id: City.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.manytomany;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "tbl_city")
+public class City {
+	private Integer id;
+	private String name;
+
+	@Id
+	@GeneratedValue
+	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;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Company.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Company.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Company.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,22 @@
+//$Id: Company.java 17529 2009-09-19 19:59:46Z stliu $
+package org.hibernate.test.annotations.manytomany;
+
+import java.io.Serializable;
+import javax.persistence.MappedSuperclass;
+import javax.persistence.Column;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MappedSuperclass
+public class Company implements Serializable {
+	@Column private String name;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Contractor.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Contractor.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Contractor.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,26 @@
+//$Id: Employee.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.manytomany;
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+
+/**
+ * Employee in an Employer-Employee relationship
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at SuppressWarnings("serial")
+public class Contractor extends Employee implements Serializable {
+
+	private float hourlyRate;
+
+	public float getHourlyRate() {
+		return hourlyRate;
+	}
+
+	public void setHourlyRate(float hourlyRate) {
+		this.hourlyRate = hourlyRate;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Employee.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Employee.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Employee.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,62 @@
+//$Id: Employee.java 14781 2008-06-18 18:04:17Z hardy.ferentschik $
+package org.hibernate.test.annotations.manytomany;
+
+import java.io.Serializable;
+import java.util.Collection;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.ManyToMany;
+import javax.persistence.Column;
+
+import org.hibernate.annotations.Cascade;
+
+/**
+ * Employee in an Employer-Employee relationship
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Inheritance(strategy = InheritanceType.JOINED)
+ at SuppressWarnings("serial")
+public class Employee implements Serializable {
+	private Integer id;
+	private Collection<Employer> employers;
+	private String name;
+
+	@Column(name="fld_name")
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer integer) {
+		id = integer;
+	}
+
+	@ManyToMany(
+			cascade = {CascadeType.PERSIST, CascadeType.MERGE},
+			mappedBy = "employees"
+	)
+	@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE,
+			org.hibernate.annotations.CascadeType.PERSIST})
+	public Collection<Employer> getEmployers() {
+		return employers;
+	}
+
+	public void setEmployers(Collection<Employer> employers) {
+		this.employers = employers;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Employer.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Employer.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Employer.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,80 @@
+//$Id: Employer.java 14764 2008-06-12 13:41:16Z hardy.ferentschik $
+package org.hibernate.test.annotations.manytomany;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.List;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+import javax.persistence.OrderBy;
+import javax.persistence.Table;
+
+import org.hibernate.annotations.Cascade;
+
+/**
+ * Employer in a employer-Employee relationship
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity()
+ at Table(name="`Employer`")
+ at SuppressWarnings({"serial", "unchecked"})
+public class Employer implements Serializable {
+	private Integer id;
+	private Collection employees;
+	private List contractors;
+
+	@ManyToMany(
+			targetEntity = org.hibernate.test.annotations.manytomany.Contractor.class,
+			cascade = {CascadeType.PERSIST, CascadeType.MERGE}
+	)
+	@JoinTable(
+			name = "EMPLOYER_CONTRACTOR",
+			joinColumns = {@JoinColumn(name = "EMPLOYER_ID")},
+			inverseJoinColumns = {@JoinColumn(name = "CONTRACTOR_ID")}
+	)
+	@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
+	@OrderBy("name desc")	
+	public List getContractors() {
+		return contractors;
+	}
+
+	public void setContractors(List contractors) {
+		this.contractors = contractors;
+	}
+
+	@ManyToMany(
+			targetEntity = org.hibernate.test.annotations.manytomany.Employee.class,
+			cascade = {CascadeType.PERSIST, CascadeType.MERGE}
+	)
+	@JoinTable(
+			name = "EMPLOYER_EMPLOYEE",
+			joinColumns = {@JoinColumn(name = "EMPER_ID")},
+			inverseJoinColumns = {@JoinColumn(name = "EMPEE_ID")}
+	)
+	@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
+	@OrderBy("name asc")
+	public Collection getEmployees() {
+		return employees;
+	}
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setEmployees(Collection set) {
+		employees = set;
+	}
+
+	public void setId(Integer integer) {
+		id = integer;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Friend.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Friend.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Friend.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,59 @@
+//$Id: Friend.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.manytomany;
+
+import java.io.Serializable;
+import java.util.Set;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+
+
+/**
+ * Friend has other friends in a many to many way
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity()
+public class Friend implements Serializable {
+	private Integer id;
+	private String name;
+	private Set<Friend> friends;
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setId(Integer integer) {
+		id = integer;
+	}
+
+	public void setName(String string) {
+		name = string;
+	}
+
+	@ManyToMany(
+			cascade = {CascadeType.PERSIST, CascadeType.MERGE}
+	)
+	@JoinTable(
+			name = "FRIEND2FRIEND",
+			joinColumns = {@JoinColumn(name = "FROM_FR", nullable = false)},
+			inverseJoinColumns = {@JoinColumn(name = "TO_FR", nullable = false)}
+	)
+	public Set<Friend> getFriends() {
+		return friends;
+	}
+
+	public void setFriends(Set<Friend> friend) {
+		this.friends = friend;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Group.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Group.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Group.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,50 @@
+//$Id: Group.java 17529 2009-09-19 19:59:46Z stliu $
+package org.hibernate.test.annotations.manytomany;
+
+import java.util.Collection;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.ManyToMany;
+import javax.persistence.OrderBy;
+import javax.persistence.Table;
+
+import org.hibernate.annotations.Where;
+import org.hibernate.annotations.FilterDef;
+import org.hibernate.annotations.Filter;
+import org.hibernate.annotations.FilterJoinTable;
+import org.hibernate.annotations.WhereJoinTable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "tbl_group")
+ at FilterDef(name="Groupfilter")
+public class Group {
+	private Integer id;
+	private Collection<Permission> permissions;
+
+	@Id
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	@ManyToMany(cascade = CascadeType.PERSIST)
+	@OrderBy("expirationDate")
+	@Where(clause = "1=1")
+	@WhereJoinTable(clause = "2=2")
+	@Filter(name="Groupfilter", condition = "3=3")
+	@FilterJoinTable(name="Groupfilter", condition = "4=4")
+	public Collection<Permission> getPermissions() {
+		return permissions;
+	}
+
+	public void setPermissions(Collection<Permission> permissions) {
+		this.permissions = permissions;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/GroupWithSet.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/GroupWithSet.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/GroupWithSet.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,55 @@
+//$Id: GroupWithSet.java 17529 2009-09-19 19:59:46Z stliu $
+package org.hibernate.test.annotations.manytomany;
+
+import java.util.Collection;
+import java.util.Set;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+import javax.persistence.OrderBy;
+import javax.persistence.Table;
+import javax.persistence.UniqueConstraint;
+
+import org.hibernate.annotations.Where;
+import org.hibernate.annotations.FilterDef;
+import org.hibernate.annotations.Filter;
+import org.hibernate.annotations.FilterJoinTable;
+import org.hibernate.annotations.WhereJoinTable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "tbl_group")
+ at FilterDef(name="Groupfilter")
+public class GroupWithSet {
+	private Integer id;
+	private Set<Permission> permissions;
+
+	@Id
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	@ManyToMany(cascade = CascadeType.PERSIST)
+	@OrderBy("expirationDate")
+	@Where(clause = "1=1")
+	@WhereJoinTable(clause = "2=2")
+	@Filter(name="Groupfilter", condition = "3=3")
+	@FilterJoinTable(name="Groupfilter", condition = "4=4")
+	public Set<Permission> getPermissions() {
+		return permissions;
+	}
+
+	public void setPermissions(Set<Permission> permissions) {
+		this.permissions = permissions;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Inspector.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Inspector.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Inspector.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,37 @@
+//$Id: Inspector.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.manytomany;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Inheritance(strategy = InheritanceType.JOINED)
+class Inspector implements Serializable {
+	@Id
+	@GeneratedValue
+	@Column(name = "id")
+	private Long _id;
+
+	private String name;
+
+	public Long getId() {
+		return _id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}
+

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/InspectorPrefixes.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/InspectorPrefixes.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/InspectorPrefixes.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,51 @@
+//$Id: InspectorPrefixes.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.manytomany;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+import javax.persistence.PrimaryKeyJoinColumn;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at PrimaryKeyJoinColumn(name = "inspector_id")
+class InspectorPrefixes extends Inspector {
+	@Column(name = "prefixes", nullable = false)
+	private String prefixes;
+	@ManyToMany()
+	@JoinTable(name = "deserted_area",
+			joinColumns = @JoinColumn(name = "inspector_name", referencedColumnName = "name"),
+			inverseJoinColumns = @JoinColumn(name = "area_id", referencedColumnName = "id"))
+	private List<Zone> desertedAreas = new ArrayList<Zone>();
+
+	@ManyToMany()
+	@JoinTable(name = "inspector_prefixes_areas",
+			joinColumns = @JoinColumn(name = "inspector_id", referencedColumnName = "inspector_id"),
+			inverseJoinColumns = @JoinColumn(name = "area_id", referencedColumnName = "id"))
+	private List<Zone> areas = new ArrayList<Zone>();
+
+	InspectorPrefixes() {
+	}
+
+	InspectorPrefixes(String prefixes) {
+		this.prefixes = prefixes;
+	}
+
+	public String getPrefixes() {
+		return this.prefixes;
+	}
+
+	public List<Zone> getAreas() {
+		return areas;
+	}
+
+	public List<Zone> getDesertedAreas() {
+		return desertedAreas;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/KnownClient.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/KnownClient.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/KnownClient.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,45 @@
+//$Id: KnownClient.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.manytomany;
+
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class KnownClient {
+	private Integer id;
+	private String name;
+	private Set<Store> stores;
+
+	@Id
+	@GeneratedValue
+	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;
+	}
+
+	@ManyToMany(mappedBy = "customers")
+	public Set<Store> getStores() {
+		return stores;
+	}
+
+	public void setStores(Set<Store> stores) {
+		this.stores = stores;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Man.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Man.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Man.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,63 @@
+//$Id: Man.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.manytomany;
+
+import java.io.Serializable;
+import java.util.Set;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.ManyToMany;
+
+/**
+ * Man knowing sevezral womens
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Man implements Serializable {
+	private ManPk id;
+	private String carName;
+	private Set<Woman> womens;
+
+	@ManyToMany(cascade = {CascadeType.ALL}, mappedBy = "mens")
+	public Set<Woman> getWomens() {
+		return womens;
+	}
+
+	public void setWomens(Set<Woman> womens) {
+		this.womens = womens;
+	}
+
+	@Id
+	public ManPk getId() {
+		return id;
+	}
+
+	public void setId(ManPk id) {
+		this.id = id;
+	}
+
+	public String getCarName() {
+		return carName;
+	}
+
+	public void setCarName(String carName) {
+		this.carName = carName;
+	}
+
+	public int hashCode() {
+		//a NPE can occurs, but I don't expect hashcode to be used before pk is set
+		return getId().hashCode();
+	}
+
+	public boolean equals(Object obj) {
+		//a NPE can occurs, but I don't expect equals to be used before pk is set
+		if ( obj != null && obj instanceof Man ) {
+			return getId().equals( ( (Man) obj ).getId() );
+		}
+		else {
+			return false;
+		}
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/ManPk.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/ManPk.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/ManPk.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,60 @@
+//$Id: ManPk.java 16343 2009-04-15 18:33:43Z gbadner $
+package org.hibernate.test.annotations.manytomany;
+
+import java.io.Serializable;
+import javax.persistence.Embeddable;
+import javax.persistence.Column;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class ManPk implements Serializable {
+	private String firstName;
+	private String lastName;
+	private boolean isElder;
+
+	public boolean isElder() {
+		return isElder;
+	}
+
+	public void setElder(boolean elder) {
+		isElder = elder;
+	}
+
+	public int hashCode() {
+		//this implem sucks
+		return getFirstName().hashCode() + getLastName().hashCode() + ( isElder() ? 0 : 1 );
+	}
+
+	public boolean equals(Object obj) {
+		//firstName and lastName are expected to be set in this implem
+		if ( obj != null && obj instanceof ManPk ) {
+			ManPk other = (ManPk) obj;
+			return getFirstName().equals( other.getFirstName() )
+					&& getLastName().equals( other.getLastName() )
+					&& isElder() == other.isElder();
+		}
+		else {
+			return false;
+		}
+	}
+
+	public void setFirstName(String firstName) {
+		this.firstName = firstName;
+	}
+
+	public void setLastName(String lastName) {
+		this.lastName = lastName;
+	}
+
+	@Column(length=128)
+	public String getFirstName() {
+		return firstName;
+	}
+
+	@Column(length=128)
+	public String getLastName() {
+		return lastName;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/ManyToManyTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/ManyToManyTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/ManyToManyTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,671 @@
+//$Id: ManyToManyTest.java 17529 2009-09-19 19:59:46Z stliu $
+package org.hibernate.test.annotations.manytomany;
+
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.hibernate.Hibernate;
+import org.hibernate.JDBCException;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * Many to many tests
+ *
+ * @author Emmanuel Bernard
+ */
+ at SuppressWarnings("unchecked")
+public class ManyToManyTest extends TestCase {
+
+	public ManyToManyTest(String x) {
+		super( x );
+	}
+
+	public void testDefault() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Store fnac = new Store();
+		fnac.setName( "Fnac" );
+		KnownClient emmanuel = new KnownClient();
+		emmanuel.setName( "Emmanuel" );
+		emmanuel.setStores( new HashSet<Store>() );
+		fnac.setCustomers( new HashSet<KnownClient>() );
+		fnac.getCustomers().add( emmanuel );
+		emmanuel.getStores().add( fnac );
+		fnac.setImplantedIn( new HashSet<City>() );
+		City paris = new City();
+		fnac.getImplantedIn().add( paris );
+		paris.setName( "Paris" );
+		s.persist( fnac );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		Store store;
+		KnownClient knownClient;
+		City city;
+		store = (Store) s.get( Store.class, fnac.getId() );
+		assertNotNull( store );
+		assertNotNull( store.getCustomers() );
+		assertEquals( 1, store.getCustomers().size() );
+		knownClient = (KnownClient) store.getCustomers().iterator().next();
+		assertEquals( emmanuel.getName(), knownClient.getName() );
+		assertNotNull( store.getImplantedIn() );
+		assertEquals( 1, store.getImplantedIn().size() );
+		city = (City) store.getImplantedIn().iterator().next();
+		assertEquals( paris.getName(), city.getName() );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		knownClient = (KnownClient) s.get( KnownClient.class, emmanuel.getId() );
+		assertNotNull( knownClient );
+		assertNotNull( knownClient.getStores() );
+		assertEquals( 1, knownClient.getStores().size() );
+		store = (Store) knownClient.getStores().iterator().next();
+		assertEquals( fnac.getName(), store.getName() );
+		tx.commit();
+		s.close();
+	}
+
+	public void testDefaultCompositePk() throws Exception {
+		Session s;
+		Transaction tx;
+
+		s = openSession();
+		tx = s.beginTransaction();
+		CatPk catPk = new CatPk();
+		catPk.setName( "Minou" );
+		catPk.setThoroughbred( "Persan" );
+		Cat cat = new Cat();
+		cat.setId( catPk );
+		cat.setAge( 32 );
+		Woman woman = new Woman();
+		WomanPk womanPk = new WomanPk();
+		womanPk.setFirstName( "Emma" );
+		womanPk.setLastName( "Peel" );
+		woman.setId( womanPk );
+		woman.setCats( new HashSet<Cat>() );
+		woman.getCats().add( cat );
+		cat.setHumanContacts( new HashSet<Woman>() );
+		cat.getHumanContacts().add( woman );
+		s.persist( woman );
+		s.persist( cat );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		Cat sameCat = (Cat) s.get( Cat.class, cat.getId() );
+		assertNotNull( sameCat );
+		assertNotNull( sameCat.getHumanContacts() );
+		assertEquals( 1, sameCat.getHumanContacts().size() );
+		Woman sameWoman = sameCat.getHumanContacts().iterator().next();
+		assertEquals( sameWoman.getId().getLastName(), woman.getId().getLastName() );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		sameWoman = (Woman) s.get( Woman.class, woman.getId() );
+		assertNotNull( sameWoman );
+		assertNotNull( sameWoman.getCats() );
+		assertEquals( 1, sameWoman.getCats().size() );
+		sameCat = sameWoman.getCats().iterator().next();
+		assertEquals( cat.getAge(), sameCat.getAge() );
+		tx.commit();
+		s.close();
+	}
+
+	public void testMappedBy() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Store fnac = new Store();
+		fnac.setName( "Fnac" );
+		Supplier emi = new Supplier();
+		emi.setName( "Emmanuel" );
+		emi.setSuppStores( new HashSet<Store>() );
+		fnac.setSuppliers( new HashSet<Supplier>() );
+		fnac.getSuppliers().add( emi );
+		emi.getSuppStores().add( fnac );
+		s.persist( fnac );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		Store store;
+		Supplier supplier;
+		store = (Store) s.get( Store.class, fnac.getId() );
+		assertNotNull( store );
+		assertNotNull( store.getSuppliers() );
+		assertEquals( 1, store.getSuppliers().size() );
+		supplier = (Supplier) store.getSuppliers().iterator().next();
+		assertEquals( emi.getName(), supplier.getName() );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		supplier = (Supplier) s.get( Supplier.class, emi.getId() );
+		assertNotNull( supplier );
+		assertNotNull( supplier.getSuppStores() );
+		assertEquals( 1, supplier.getSuppStores().size() );
+		store = (Store) supplier.getSuppStores().iterator().next();
+		assertEquals( fnac.getName(), store.getName() );
+		tx.commit();
+		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 );
+		Set erColl = new HashSet();
+		Collection eeColl = new ArrayList();
+		erColl.add( ee );
+		eeColl.add( er );
+		er.setEmployees( erColl );
+		ee.setEmployers( eeColl );
+		//s.persist(ee);
+		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();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		ee = (Employee) s.get( Employee.class, ee.getId() );
+		assertNotNull( ee );
+		assertFalse( "ManyToMany mappedBy lazyness", Hibernate.isInitialized( ee.getEmployers() ) );
+		tx.commit();
+		assertFalse( "ManyToMany mappedBy lazyness", Hibernate.isInitialized( ee.getEmployers() ) );
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		ee = (Employee) s.get( Employee.class, ee.getId() );
+		assertNotNull( ee );
+		er = ee.getEmployers().iterator().next();
+		assertTrue( "second join non lazy", Hibernate.isInitialized( er ) );
+		s.delete( er );
+		s.delete( ee );
+		tx.commit();
+		s.close();
+	}
+
+	public void testOrderByEmployee() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Employer employer = new Employer();
+		Employee employee1 = new Employee();
+		employee1.setName( "Emmanuel" );
+		Employee employee2 = new Employee();
+		employee2.setName( "Alice" );
+		s.persist( employee1 );
+		s.persist( employee2 );
+		Set erColl = new HashSet();
+		Collection eeColl = new ArrayList();
+		Collection eeColl2 = new ArrayList();
+		erColl.add( employee1 );
+		erColl.add( employee2 );
+		eeColl.add( employer );
+		eeColl2.add( employer );
+		employer.setEmployees( erColl );
+		employee1.setEmployers( eeColl );
+		employee2.setEmployers( eeColl2 );
+
+		s.flush();
+		s.clear();
+
+		employer = (Employer) s.get( Employer.class, employer.getId() );
+		assertNotNull( employer );
+		assertNotNull( employer.getEmployees() );
+		assertEquals( 2, employer.getEmployees().size() );
+		Employee eeFromDb = (Employee) employer.getEmployees().iterator().next();
+		assertEquals( employee2.getName(), eeFromDb.getName() );
+		tx.rollback();
+		s.close();
+
+	}
+	
+	/**
+	 * ANN-625
+	 * 
+	 * @throws Exception in case the test fails.
+	 * 
+	 * This test only works against databases which allow a mixed usage of
+     * table names and table aliases. The generated SQL for this test is:
+	 * 
+	 * 	   select
+	 *         contractor0_.EMPLOYER_ID as EMPLOYER1_1_,
+	 *         contractor0_.CONTRACTOR_ID as CONTRACTOR2_1_,
+	 *         contractor1_.id as id2_0_,
+	 *         contractor1_.fld_name as fld3_2_0_,
+	 *         contractor1_.hourlyRate as hourlyRate2_0_ 
+	 *     from
+	 *         EMPLOYER_CONTRACTOR contractor0_ 
+	 *     left outer join
+	 *         Employee contractor1_ 
+	 *             on contractor0_.CONTRACTOR_ID=contractor1_.id 
+	 *     where
+	 *         contractor0_.EMPLOYER_ID=? 
+	 *     order by
+	 *         Employee.fld_name desc
+	 * 
+	 * 
+	 */
+// HHH-3577
+//	public void testOrderByContractor() throws Exception {
+//
+//		Session s;
+//		Transaction tx;
+//		s = openSession();
+//		tx = s.beginTransaction();
+//
+//		// create some test entities
+//		Employer employer = new Employer();
+//		Contractor contractor1 = new Contractor();
+//		contractor1.setName( "Emmanuel" );
+//		contractor1.setHourlyRate(100.0f);
+//		Contractor contractor2 = new Contractor();
+//		contractor2.setName( "Hardy" );
+//		contractor2.setHourlyRate(99.99f);
+//		s.persist( contractor1 );
+//		s.persist( contractor2 );
+//
+//		// add contractors to employer
+//		List setOfContractors = new ArrayList();
+//		setOfContractors.add( contractor1 );
+//		setOfContractors.add( contractor2 );
+//		employer.setContractors( setOfContractors );
+//
+//		// add employer to contractors
+//		Collection employerListContractor1 = new ArrayList();
+//		employerListContractor1.add( employer );
+//		contractor1.setEmployers( employerListContractor1 );
+//
+//		Collection employerListContractor2 = new ArrayList();
+//		employerListContractor2.add( employer );
+//		contractor2.setEmployers( employerListContractor2 );
+//
+//		s.flush();
+//		s.clear();
+//
+//		// assertions
+//		employer = (Employer) s.get( Employer.class, employer.getId() );
+//		assertNotNull( employer );
+//		assertNotNull( employer.getContractors() );
+//		assertEquals( 2, employer.getContractors().size() );
+//		Contractor firstContractorFromDb = (Contractor) employer.getContractors().iterator().next();
+//		assertEquals( contractor2.getName(), firstContractorFromDb.getName() );
+//		tx.rollback();
+//		s.close();
+//	}
+
+	public void testRemoveInBetween() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Employer er = new Employer();
+		Employee ee = new Employee();
+		Employee ee2 = new Employee();
+		s.persist( ee );
+		s.persist( ee2 );
+		Set erColl = new HashSet();
+		Collection eeColl = new ArrayList();
+		erColl.add( ee );
+		erColl.add( ee2 );
+		eeColl.add( er );
+		er.setEmployees( erColl );
+		ee.setEmployers( eeColl );
+		//s.persist(ee);
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		er = (Employer) s.load( Employer.class, er.getId() );
+		assertNotNull( er );
+		assertNotNull( er.getEmployees() );
+		assertEquals( 2, er.getEmployees().size() );
+		Iterator iterator = er.getEmployees().iterator();
+		Employee eeFromDb = (Employee) iterator.next();
+		if ( eeFromDb.getId().equals( ee.getId() ) ) {
+			eeFromDb = (Employee) iterator.next();
+		}
+		assertEquals( ee2.getId(), eeFromDb.getId() );
+		er.getEmployees().remove( eeFromDb );
+		eeFromDb.getEmployers().remove( er );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		ee = (Employee) s.get( Employee.class, ee.getId() );
+		assertNotNull( ee );
+		assertFalse( "ManyToMany mappedBy lazyness", Hibernate.isInitialized( ee.getEmployers() ) );
+		tx.commit();
+		assertFalse( "ManyToMany mappedBy lazyness", Hibernate.isInitialized( ee.getEmployers() ) );
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		ee = (Employee) s.get( Employee.class, ee.getId() );
+		assertNotNull( ee );
+		er = ee.getEmployers().iterator().next();
+		assertTrue( "second join non lazy", Hibernate.isInitialized( er ) );
+		assertEquals( 1, er.getEmployees().size() );
+		s.delete( er );
+		s.delete( ee );
+		tx.commit();
+		s.close();
+	}
+
+	public void testSelf() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Friend f = new Friend();
+		Friend sndF = new Friend();
+		f.setName( "Starsky" );
+		sndF.setName( "Hutch" );
+		Set frnds = new HashSet();
+		frnds.add( sndF );
+		f.setFriends( frnds );
+		//Starsky is a friend of Hutch but hutch is not
+		s.persist( f );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		f = (Friend) s.load( Friend.class, f.getId() );
+		assertNotNull( f );
+		assertNotNull( f.getFriends() );
+		assertEquals( 1, f.getFriends().size() );
+		Friend fromDb2ndFrnd = (Friend) f.getFriends().iterator().next();
+		assertEquals( fromDb2ndFrnd.getId(), sndF.getId() );
+		assertEquals( 0, fromDb2ndFrnd.getFriends().size() );
+		tx.commit();
+		s.close();
+	}
+
+	public void testCompositePk() throws Exception {
+		Session s;
+		Transaction tx;
+
+		ManPk m1pk = new ManPk();
+		m1pk.setElder( true );
+		m1pk.setFirstName( "Lucky" );
+		m1pk.setLastName( "Luke" );
+		ManPk m2pk = new ManPk();
+		m2pk.setElder( false );
+		m2pk.setFirstName( "Joe" );
+		m2pk.setLastName( "Dalton" );
+
+		Man m1 = new Man();
+		m1.setId( m1pk );
+		m1.setCarName( "Jolly Jumper" );
+		Man m2 = new Man();
+		m2.setId( m2pk );
+
+		WomanPk w1pk = new WomanPk();
+		w1pk.setFirstName( "Ma" );
+		w1pk.setLastName( "Dalton" );
+		WomanPk w2pk = new WomanPk();
+		w2pk.setFirstName( "Carla" );
+		w2pk.setLastName( "Bruni" );
+
+		Woman w1 = new Woman();
+		w1.setId( w1pk );
+		Woman w2 = new Woman();
+		w2.setId( w2pk );
+
+		Set<Woman> womens = new HashSet<Woman>();
+		womens.add( w1 );
+		m1.setWomens( womens );
+		Set<Woman> womens2 = new HashSet<Woman>();
+		womens2.add( w1 );
+		womens2.add( w2 );
+		m2.setWomens( womens2 );
+
+		Set<Man> mens = new HashSet<Man>();
+		mens.add( m1 );
+		mens.add( m2 );
+		w1.setMens( mens );
+		Set<Man> mens2 = new HashSet<Man>();
+		mens2.add( m2 );
+		w2.setMens( mens2 );
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.persist( m1 );
+		s.persist( m2 );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		m1 = (Man) s.load( Man.class, m1pk );
+		assertFalse( m1.getWomens().isEmpty() );
+		assertEquals( 1, m1.getWomens().size() );
+		w1 = (Woman) s.load( Woman.class, w1pk );
+		assertFalse( w1.getMens().isEmpty() );
+		assertEquals( 2, w1.getMens().size() );
+
+		tx.commit();
+		s.close();
+	}
+
+	public void testAssociationTableUniqueConstraints() throws Exception {
+		Session s = openSession();
+		Permission readAccess = new Permission();
+		readAccess.setPermission( "read" );
+		readAccess.setExpirationDate( new Date() );
+		Collection<Permission> coll = new ArrayList<Permission>( 2 );
+		coll.add( readAccess );
+		coll.add( readAccess );
+		Group group = new Group();
+		group.setId( new Integer( 1 ) );
+		group.setPermissions( coll );
+		s.getTransaction().begin();
+		try {
+			s.persist( group );
+			s.getTransaction().commit();
+			fail( "Unique constraints not applied on association table" );
+		}
+		catch (JDBCException e) {
+			//success
+			s.getTransaction().rollback();
+		}
+		finally {
+			s.close();
+		}
+	}
+
+	public void testAssociationTableAndOrderBy() throws Exception {
+		Session s = openSession();
+		s.enableFilter( "Groupfilter" );
+		Permission readAccess = new Permission();
+		readAccess.setPermission( "read" );
+		readAccess.setExpirationDate( new Date() );
+		Permission writeAccess = new Permission();
+		writeAccess.setPermission( "write" );
+		writeAccess.setExpirationDate( new Date( new Date().getTime() - 10*60*1000 ) );
+		Collection<Permission> coll = new ArrayList<Permission>( 2 );
+		coll.add( readAccess );
+		coll.add( writeAccess );
+		Group group = new Group();
+		group.setId( new Integer( 1 ) );
+		group.setPermissions( coll );
+		s.getTransaction().begin();
+		s.persist( group );
+		s.flush();
+		s.clear();
+		group = (Group) s.get( Group.class, group.getId() );
+		s.createQuery( "select g from Group g join fetch g.permissions").list();
+		assertEquals( "write", group.getPermissions().iterator().next().getPermission() );
+		s.getTransaction().rollback();
+		s.close();
+	}
+
+	public void testAssociationTableAndOrderByWithSet() throws Exception {
+		Session s = openSession();
+		s.enableFilter( "Groupfilter" );
+
+		Permission readAccess = new Permission();
+		readAccess.setPermission( "read" );
+		readAccess.setExpirationDate( new Date() );
+		
+		Permission writeAccess = new Permission();
+		writeAccess.setPermission( "write" );
+		writeAccess.setExpirationDate( new Date( new Date().getTime() - 10*60*1000 ) );
+		
+		Permission executeAccess = new Permission();
+		executeAccess.setPermission( "execute" );
+		executeAccess.setExpirationDate( new Date( new Date().getTime() - 5*60*1000 ) );
+		
+		Set<Permission> coll = new HashSet<Permission>( 3 );
+		coll.add( readAccess );
+		coll.add( writeAccess );
+		coll.add( executeAccess );
+
+		GroupWithSet group = new GroupWithSet();
+		group.setId( new Integer( 1 ) );
+		group.setPermissions( coll );
+		s.getTransaction().begin();
+		s.persist( group );
+		s.flush();
+		s.clear();
+
+		group = (GroupWithSet) s.get( GroupWithSet.class, group.getId() );
+		s.createQuery( "select g from Group g join fetch g.permissions").list();
+		Iterator<Permission> permIter = group.getPermissions().iterator();
+		assertEquals( "write", permIter.next().getPermission() );
+		assertEquals( "execute", permIter.next().getPermission() );
+		assertEquals( "read", permIter.next().getPermission() );
+		s.getTransaction().rollback();
+		s.close();
+	}
+	
+	public void testJoinedSubclassManyToMany() throws Exception {
+		Session s = openSession();
+		Zone a = new Zone();
+		InspectorPrefixes ip = new InspectorPrefixes( "dgi" );
+		Transaction tx = s.beginTransaction();
+		s.save( a );
+		s.save( ip );
+		ip.getAreas().add( a );
+		tx.commit();
+		s.close();
+		s = openSession();
+		tx = s.beginTransaction();
+		ip = (InspectorPrefixes) s.get( InspectorPrefixes.class, ip.getId() );
+		assertNotNull( ip );
+		assertEquals( 1, ip.getAreas().size() );
+		assertEquals( a.getId(), ip.getAreas().get( 0 ).getId() );
+		s.delete( ip );
+		s.delete( ip.getAreas().get( 0 ) );
+		tx.commit();
+		s.close();
+	}
+
+	public void testJoinedSubclassManyToManyWithNonPkReference() throws Exception {
+		Session s = openSession();
+		Zone a = new Zone();
+		InspectorPrefixes ip = new InspectorPrefixes( "dgi" );
+		ip.setName( "Inspector" );
+		Transaction tx = s.beginTransaction();
+		s.save( a );
+		s.save( ip );
+		ip.getDesertedAreas().add( a );
+		tx.commit();
+		s.close();
+		s = openSession();
+		tx = s.beginTransaction();
+		ip = (InspectorPrefixes) s.get( InspectorPrefixes.class, ip.getId() );
+		assertNotNull( ip );
+		assertEquals( 1, ip.getDesertedAreas().size() );
+		assertEquals( a.getId(), ip.getDesertedAreas().get( 0 ).getId() );
+		s.delete( ip );
+		s.delete( ip.getDesertedAreas().get( 0 ) );
+		tx.commit();
+		s.close();
+	}
+
+	public void testReferencedColumnNameToSuperclass() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		BuildingCompany comp = new BuildingCompany();
+		comp.setFoundedIn( new Date() );
+		comp.setName( "Builder century corp.");
+		s.persist( comp );
+		Building building = new Building();
+		building.setCompany( comp );
+		s.persist( building );
+		s.flush();
+		s.clear();
+		building = (Building) s.get( Building.class, building.getId() );
+		assertEquals( comp.getName(), building.getCompany().getName() );
+		tx.rollback();
+		s.close();
+	}
+
+	/**
+	 * @see org.hibernate.test.annotations.TestCase#getMappings()
+	 */
+	protected Class[] getMappings() {
+		return new Class[]{
+				Friend.class,
+				Employer.class,
+				Employee.class,
+				Contractor.class,
+				Man.class,
+				Woman.class,
+				Store.class,
+				KnownClient.class,
+				Supplier.class,
+				City.class,
+				Cat.class,
+				Group.class,
+				GroupWithSet.class,
+				Permission.class,
+				Zone.class,
+				Inspector.class,
+				InspectorPrefixes.class,
+				BuildingCompany.class,
+				Building.class
+		};
+	}
+
+}
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Permission.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Permission.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Permission.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,32 @@
+//$Id: Permission.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.manytomany;
+
+import java.util.Date;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Permission {
+	private String permission;
+	private Date expirationDate;
+
+	@Id
+	public String getPermission() {
+		return permission;
+	}
+
+	public void setPermission(String permission) {
+		this.permission = permission;
+	}
+
+	public Date getExpirationDate() {
+		return expirationDate;
+	}
+
+	public void setExpirationDate(Date expirationDate) {
+		this.expirationDate = expirationDate;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Store.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Store.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Store.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,74 @@
+//$Id: Store.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.manytomany;
+
+import java.util.Set;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Store {
+	private Integer id;
+	private String name;
+	private Set<KnownClient> customers;
+	private Set<Supplier> suppliers;
+
+	@ManyToMany(cascade = CascadeType.PERSIST)
+	public Set<City> getImplantedIn() {
+		return implantedIn;
+	}
+
+	public void setImplantedIn(Set<City> implantedIn) {
+		this.implantedIn = implantedIn;
+	}
+
+	private Set<City> implantedIn;
+
+	@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
+	@JoinTable(
+			name = "StoreSupplier",
+			joinColumns = @JoinColumn(name = "store"),
+			inverseJoinColumns = @JoinColumn(name = "supplier")
+	)
+	public Set<Supplier> getSuppliers() {
+		return suppliers;
+	}
+
+	public void setSuppliers(Set<Supplier> suppliers) {
+		this.suppliers = suppliers;
+	}
+
+	@Id
+	@GeneratedValue
+	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;
+	}
+
+	@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
+	public Set<KnownClient> getCustomers() {
+		return customers;
+	}
+
+	public void setCustomers(Set<KnownClient> customers) {
+		this.customers = customers;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Supplier.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Supplier.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Supplier.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,46 @@
+//$Id: Supplier.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.manytomany;
+
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Supplier {
+	private Integer id;
+	private String name;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	private Set<Store> suppStores;
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	@ManyToMany(mappedBy = "suppliers")
+	public Set<Store> getSuppStores() {
+		return suppStores;
+	}
+
+	public void setSuppStores(Set<Store> suppStores) {
+		this.suppStores = suppStores;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Woman.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Woman.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Woman.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,91 @@
+//$Id: Woman.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.manytomany;
+
+import java.io.Serializable;
+import java.util.Set;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+
+import org.hibernate.annotations.ForeignKey;
+
+/**
+ * Woman knowing several mens
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Woman implements Serializable {
+	private WomanPk id;
+	private String carName;
+	private Set<Man> mens;
+	private Set<Cat> cats;
+
+	@ManyToMany(mappedBy = "humanContacts")
+	public Set<Cat> getCats() {
+		return cats;
+	}
+
+	public void setCats(Set<Cat> cats) {
+		this.cats = cats;
+	}
+
+	@ManyToMany(cascade = {CascadeType.ALL})
+	@JoinTable(
+			name = "Man_Woman",
+			joinColumns = {
+			@JoinColumn(name = "womanLastName", referencedColumnName = "lastName"),
+			@JoinColumn(name = "womanFirstName", referencedColumnName = "firstName")
+					},
+			inverseJoinColumns = {
+			@JoinColumn(name = "manIsElder", referencedColumnName = "elder"),
+			@JoinColumn(name = "manLastName", referencedColumnName = "lastName"),
+			@JoinColumn(name = "manFirstName", referencedColumnName = "firstName")
+					}
+	)
+	@ForeignKey(name = "WM_W_FK", inverseName = "WM_M_FK")
+	public Set<Man> getMens() {
+		return mens;
+	}
+
+	public void setMens(Set<Man> mens) {
+		this.mens = mens;
+	}
+
+	@Id
+	public WomanPk getId() {
+		return id;
+	}
+
+	public void setId(WomanPk id) {
+		this.id = id;
+	}
+
+	public String getCarName() {
+		return carName;
+	}
+
+	public void setCarName(String carName) {
+		this.carName = carName;
+	}
+
+
+	public int hashCode() {
+		//a NPE can occurs, but I don't expect hashcode to be used before pk is set
+		return getId().hashCode();
+	}
+
+	public boolean equals(Object obj) {
+		//a NPE can occurs, but I don't expect equals to be used before pk is set
+		if ( obj != null && obj instanceof Woman ) {
+			return getId().equals( ( (Woman) obj ).getId() );
+		}
+		else {
+			return false;
+		}
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/WomanPk.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/WomanPk.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/WomanPk.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,52 @@
+//$Id: WomanPk.java 16343 2009-04-15 18:33:43Z gbadner $
+package org.hibernate.test.annotations.manytomany;
+
+import java.io.Serializable;
+import javax.persistence.Embeddable;
+import javax.persistence.Column;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class WomanPk implements Serializable {
+
+
+	private String firstName;
+	private String lastName;
+
+	public int hashCode() {
+		//this implem sucks
+		return getFirstName().hashCode() + getLastName().hashCode();
+	}
+
+	public boolean equals(Object obj) {
+		//firstName and lastName are expected to be set in this implem
+		if ( obj != null && obj instanceof WomanPk ) {
+			WomanPk other = (WomanPk) obj;
+			return getFirstName().equals( other.getFirstName() )
+					&& getLastName().equals( other.getLastName() );
+		}
+		else {
+			return false;
+		}
+	}
+
+	public void setFirstName(String firstName) {
+		this.firstName = firstName;
+	}
+
+	public void setLastName(String lastName) {
+		this.lastName = lastName;
+	}
+
+	@Column(length=128)
+	public String getFirstName() {
+		return firstName;
+	}
+
+	@Column(length=128)
+	public String getLastName() {
+		return lastName;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Zone.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Zone.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytomany/Zone.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,27 @@
+//$Id: Zone.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.manytomany;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Zone {
+	private Integer id;
+
+	@Id
+	@GeneratedValue
+	@Column(name = "id")
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/BiggestForest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/BiggestForest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/BiggestForest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,34 @@
+//$Id: BiggestForest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.manytoone;
+
+import javax.persistence.Entity;
+import javax.persistence.OneToOne;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class BiggestForest {
+	private Integer id;
+	private ForestType type;
+
+	@Id @GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	@OneToOne(mappedBy = "biggestRepresentative")
+	public ForestType getType() {
+		return type;
+	}
+
+	public void setType(ForestType type) {
+		this.type = type;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Car.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Car.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Car.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,51 @@
+//$Id: Car.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.manytoone;
+
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+
+import org.hibernate.annotations.ForeignKey;
+
+/**
+ * Many to one sample using default mapping values
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Car {
+	private Integer id;
+	private Color bodyColor;
+	private Parent owner;
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	@ManyToOne(fetch = FetchType.EAGER)
+	@ForeignKey(name="BODY_COLOR_FK")
+	public Color getBodyColor() {
+		return bodyColor;
+	}
+
+	public void setBodyColor(Color bodyColor) {
+		this.bodyColor = bodyColor;
+	}
+
+	@ManyToOne
+	public Parent getOwner() {
+		return owner;
+	}
+
+	public void setOwner(Parent owner) {
+		this.owner = owner;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Carz.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Carz.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Carz.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,124 @@
+//$Id: Carz.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.manytoone;
+
+import java.io.Serializable;
+import java.util.Date;
+import javax.persistence.Entity;
+import javax.persistence.ManyToOne;
+import javax.persistence.Column;
+import javax.persistence.JoinColumns;
+import javax.persistence.FetchType;
+import javax.persistence.JoinColumn;
+import javax.persistence.TemporalType;
+import javax.persistence.Id;
+import javax.persistence.Temporal;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Carz implements Serializable {
+	@Id
+	private Integer id;
+
+	@Column( name = "make", nullable = false )
+	private String make;
+
+	@Column( name = "model", nullable = false )
+	private String model;
+
+	@Column( name = "manufactured", nullable = false )
+	@Temporal( TemporalType.TIMESTAMP )
+	private Date manufactured;
+
+	@ManyToOne( fetch = FetchType.LAZY )
+	@JoinColumn( name = "loc_code", referencedColumnName = "loc_code" )
+	private Lotz lot;
+
+	public Carz() {
+	}
+
+	public Integer getId() {
+		return this.id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public Lotz getLot() {
+		return this.lot;
+	}
+
+	public void setLot(Lotz lot) {
+		this.lot = lot;
+	}
+
+	public String getMake() {
+		return this.make;
+	}
+
+	public void setMake(String make) {
+		this.make = make;
+	}
+
+	public Date getManufactured() {
+		return this.manufactured;
+	}
+
+	public void setManufactured(Date manufactured) {
+		this.manufactured = manufactured;
+	}
+
+	public String getModel() {
+		return this.model;
+	}
+
+	public void setModel(String model) {
+		this.model = model;
+	}
+
+	@Override
+	public int hashCode() {
+		final int PRIME = 31;
+		int result = 1;
+		result = PRIME * result + ( ( this.id == null ) ?
+				0 :
+				this.id.hashCode() );
+		result = PRIME * result + ( ( this.make == null ) ?
+				0 :
+				this.make.hashCode() );
+		result = PRIME * result + ( ( this.manufactured == null ) ?
+				0 :
+				this.manufactured.hashCode() );
+		result = PRIME * result + ( ( this.model == null ) ?
+				0 :
+				this.model.hashCode() );
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if ( this == obj ) return true;
+		if ( obj == null ) return false;
+		if ( getClass() != obj.getClass() ) return false;
+		final Carz other = (Carz) obj;
+		if ( this.id == null ) {
+			if ( other.id != null ) return false;
+		}
+		else if ( !this.id.equals( other.id ) ) return false;
+		if ( this.make == null ) {
+			if ( other.make != null ) return false;
+		}
+		else if ( !this.make.equals( other.make ) ) return false;
+		if ( this.manufactured == null ) {
+			if ( other.manufactured != null ) return false;
+		}
+		else if ( !this.manufactured.equals( other.manufactured ) ) return false;
+		if ( this.model == null ) {
+			if ( other.model != null ) return false;
+		}
+		else if ( !this.model.equals( other.model ) ) return false;
+		return true;
+	}
+}
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Child.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Child.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Child.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,32 @@
+//$Id: Child.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.manytoone;
+
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+/**
+ * TODO: change this sample with an Address -> Country relation. This is more accurate
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "tbl_child")
+public class Child implements Serializable {
+	@Id
+	@GeneratedValue
+	public Integer id;
+
+	@ManyToOne()
+	@JoinColumns({
+	@JoinColumn(name = "parentCivility", referencedColumnName = "isMale"),
+	@JoinColumn(name = "parentLastName", referencedColumnName = "lastName"),
+	@JoinColumn(name = "parentFirstName", referencedColumnName = "firstName")
+			})
+	public Parent parent;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Color.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Color.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Color.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,37 @@
+//$Id: Color.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.manytoone;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * Color showing a surrogate key and a unique constraint to ensure business rule
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Color {
+	private Integer id;
+	private String name;
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	@Column(unique = true)
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Customer.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Customer.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Customer.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,16 @@
+//$Id: Customer.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.manytoone;
+
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity(name="DealedCustomer")
+public class Customer implements Serializable {
+	@Id @GeneratedValue public Integer id;
+	public String userId;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Deal.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Deal.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Deal.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,19 @@
+//$Id: Deal.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.manytoone;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.ManyToOne;
+import javax.persistence.JoinColumn;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Deal {
+	@Id @GeneratedValue public Integer id;
+	@ManyToOne @JoinColumn(referencedColumnName = "userId") public Customer from;
+	@ManyToOne @JoinColumn(referencedColumnName = "userId") public Customer to;
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/DistrictUser.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/DistrictUser.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/DistrictUser.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,43 @@
+package org.hibernate.test.annotations.manytoone;
+
+import java.util.Date;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+ at Entity
+ at Table(name = "CLRUS2DI")
+public class DistrictUser {
+	@Id
+	@GeneratedValue
+	@Column(name = "CLRUS2DI_KEY")
+	private Long id;
+
+	@Column(name = "CLRUS2DI_CREATE_USERS_KEY")
+	private Long createdBy;
+
+	@Column(name = "CLRUS2DI_CREATE_DATE")
+	private Date createdOn;
+
+	//@ManyToOne(cascade = CascadeType.ALL)
+	//@JoinColumn(name = "CLRUS2DI_DISTR_KEY")
+	//private District district;
+
+	@ManyToOne(cascade = CascadeType.ALL)
+	@JoinColumns({@JoinColumn(name = "CLRUS2DI_USERS_KEY", referencedColumnName = "CTVUSERS_KEY"),
+	@JoinColumn(name = "CLRUS2DI_BEGIN_DATE", referencedColumnName = "CTVUSERS_START_DATE"),
+	@JoinColumn(name = "CLRUS2DI_END_DATE", referencedColumnName = "CTVUSERS_END_DATE")})
+	private User user;
+
+	@Column(name = "CLRUS2DI_LDTMD_KEY")
+	private Long ldtmd;
+
+	@Column(name = "CLRUS2DI_PMTMP_KEY")
+	private Long pmtmp;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/ForestType.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/ForestType.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/ForestType.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,66 @@
+//$Id: ForestType.java 15074 2008-08-14 17:38:00Z epbernard $
+package org.hibernate.test.annotations.manytoone;
+
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.OneToOne;
+import javax.persistence.JoinTable;
+import javax.persistence.JoinColumn;
+
+import org.hibernate.annotations.ForeignKey;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class ForestType {
+	private Integer id;
+	private String name;
+	private Set<TreeType> trees;
+	private BiggestForest biggestRepresentative;
+
+	@OneToOne
+	@JoinTable(name="BiggestRepPerForestType",
+		joinColumns = @JoinColumn(name="forest_type"),
+		inverseJoinColumns = @JoinColumn(name="forest")
+	)
+	@ForeignKey(name="A_TYP_FK",
+			inverseName = "A_FOR_FK" //inverse fail cause it involves a Join
+	)
+	public BiggestForest getBiggestRepresentative() {
+		return biggestRepresentative;
+	}
+
+	public void setBiggestRepresentative(BiggestForest biggestRepresentative) {
+		this.biggestRepresentative = biggestRepresentative;
+	}
+
+	@OneToMany(mappedBy="forestType")
+	public Set<TreeType> getTrees() {
+		return trees;
+	}
+
+	public void setTrees(Set<TreeType> trees) {
+		this.trees = trees;
+	}
+
+	@Id @GeneratedValue
+	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;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Frame.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Frame.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Frame.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,51 @@
+//$Id: Frame.java 17529 2009-09-19 19:59:46Z stliu $
+package org.hibernate.test.annotations.manytoone;
+
+import java.util.Set;
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+import org.hibernate.annotations.Formula;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Frame implements Serializable {
+	@Id
+	@GeneratedValue
+	private Long id;
+	@OneToMany( mappedBy = "frame" )
+	private Set<Lens> lenses;
+	private String name;
+	@Formula("lower(name)")
+	private String lowerName;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Set<Lens> getLenses() {
+		return lenses;
+	}
+
+	public void setLenses(Set<Lens> lenses) {
+		this.lenses = lenses;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Lens.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Lens.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Lens.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,58 @@
+//$Id: Lens.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.manytoone;
+
+import javax.persistence.Entity;
+import javax.persistence.ManyToOne;
+import javax.persistence.JoinColumn;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+import org.hibernate.annotations.Formula;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Lens {
+	@Id
+	@GeneratedValue
+	private Long id;
+	private float focal;
+	@Formula("(1/focal)")
+	private float length;
+	@ManyToOne()
+	@JoinColumn(name="`frame_fk`", referencedColumnName = "name")
+	private Frame frame;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public float getFocal() {
+		return focal;
+	}
+
+	public void setFocal(float focal) {
+		this.focal = focal;
+	}
+
+	public float getLength() {
+		return length;
+	}
+
+	public void setLength(float length) {
+		this.length = length;
+	}
+
+	public Frame getFrame() {
+		return frame;
+	}
+
+	public void setFrame(Frame frame) {
+		this.frame = frame;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Lotz.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Lotz.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Lotz.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,101 @@
+//$Id: Lotz.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.manytoone;
+
+import java.util.List;
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Column;
+import javax.persistence.FetchType;
+import javax.persistence.OneToMany;
+import javax.persistence.CascadeType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Lotz implements Serializable {
+	@EmbeddedId
+	protected LotzPK lotPK;
+
+	@Column( name = "name", nullable = false )
+	private String name;
+
+	@Column( name = "location", nullable = false )
+	private String location;
+
+	@OneToMany( mappedBy = "lot", fetch = FetchType.LAZY, cascade = CascadeType.ALL )
+	private List<Carz> cars;
+
+	public Lotz() {
+	}
+
+	public List<Carz> getCars() {
+		return this.cars;
+	}
+
+	public void setCars(List<Carz> cars) {
+		this.cars = cars;
+	}
+
+	public String getLocation() {
+		return this.location;
+	}
+
+	public void setLocation(String location) {
+		this.location = location;
+	}
+
+	public LotzPK getLotPK() {
+		return this.lotPK;
+	}
+
+	public void setLotPK(LotzPK lotPK) {
+		this.lotPK = lotPK;
+	}
+
+	public String getName() {
+		return this.name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	@Override
+	public int hashCode() {
+		final int PRIME = 31;
+		int result = 1;
+		result = PRIME * result + ( ( this.location == null ) ?
+				0 :
+				this.location.hashCode() );
+		result = PRIME * result + ( ( this.lotPK == null ) ?
+				0 :
+				this.lotPK.hashCode() );
+		result = PRIME * result + ( ( this.name == null ) ?
+				0 :
+				this.name.hashCode() );
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if ( this == obj ) return true;
+		if ( obj == null ) return false;
+		if ( getClass() != obj.getClass() ) return false;
+		final Lotz other = (Lotz) obj;
+		if ( this.location == null ) {
+			if ( other.location != null ) return false;
+		}
+		else if ( !this.location.equals( other.location ) ) return false;
+		if ( this.lotPK == null ) {
+			if ( other.lotPK != null ) return false;
+		}
+		else if ( !this.lotPK.equals( other.lotPK ) ) return false;
+		if ( this.name == null ) {
+			if ( other.name != null ) return false;
+		}
+		else if ( !this.name.equals( other.name ) ) return false;
+		return true;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/LotzPK.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/LotzPK.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/LotzPK.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,34 @@
+//$Id: LotzPK.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.manytoone;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class LotzPK implements Serializable {
+	@Column( name = "id", nullable = false )
+	private Integer id;
+
+	@Column( name = "loc_code", nullable = false, unique = true )
+	private String locCode;
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getLocCode() {
+		return locCode;
+	}
+
+	public void setLocCode(String locCode) {
+		this.locCode = locCode;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/ManyToOneJoinTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/ManyToOneJoinTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/ManyToOneJoinTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,62 @@
+//$Id: ManyToOneJoinTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.manytoone;
+
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ManyToOneJoinTest extends TestCase {
+	public void testManyToOneJoinTable() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		ForestType forest = new ForestType();
+		forest.setName( "Original forest" );
+		s.persist( forest );
+		TreeType tree = new TreeType();
+		tree.setForestType( forest );
+		tree.setAlternativeForestType( forest );
+		tree.setName( "just a tree");
+		s.persist( tree );
+		s.flush();
+		s.clear();
+		tree = (TreeType) s.get(TreeType.class, tree.getId() );
+		assertNotNull( tree.getForestType() );
+		assertNotNull( tree.getAlternativeForestType() );
+		s.clear();
+		forest = (ForestType) s.get( ForestType.class, forest.getId() );
+		assertEquals( 1, forest.getTrees().size() );
+		assertEquals( tree.getId(), forest.getTrees().iterator().next().getId() );
+		tx.rollback();
+		s.close();
+	}
+
+	public void testOneToOneJoinTable() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		ForestType forest = new ForestType();
+		forest.setName( "Original forest" );
+		s.persist( forest );
+		BiggestForest forestRepr = new BiggestForest();
+		forestRepr.setType( forest );
+		forest.setBiggestRepresentative( forestRepr );
+		s.persist( forestRepr );
+		s.flush();
+		s.clear();
+		forest = (ForestType) s.get( ForestType.class, forest.getId() );
+		assertNotNull( forest.getBiggestRepresentative() );
+		assertEquals( forest, forest.getBiggestRepresentative().getType() );
+		tx.rollback();
+		s.close();
+	}
+
+	protected Class[] getMappings() {
+		return new Class[] {
+				BiggestForest.class,
+				ForestType.class,
+				TreeType.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/ManyToOneOnNonPkTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/ManyToOneOnNonPkTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/ManyToOneOnNonPkTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,54 @@
+//$Id: ManyToOneOnNonPkTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.manytoone;
+
+import java.util.Date;
+
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.Session;
+
+
+/**
+ * FIXME test for ANN-548
+ * @author Emmanuel Bernard
+ */
+public class ManyToOneOnNonPkTest extends TestCase {
+
+	public void testNonPkPartOfPk() throws Exception {
+//		Session s = openSession( );
+//		s.getTransaction().begin();
+//
+//		LotzPK pk = new LotzPK();
+//		pk.setId( 1 );
+//		pk.setLocCode( "fr" );
+//		Lotz lot = new Lotz();
+//		lot.setLocation( "France" );
+//		lot.setName( "Chez Dede" );
+//		lot.setLotPK( pk );
+//		Carz car = new Carz();
+//		car.setId( 1 );
+//		car.setLot( lot );
+//		car.setMake( "Citroen" );
+//		car.setManufactured( new Date() );
+//		car.setModel( "C5" );
+//		s.persist( lot );
+//		s.persist( car );
+//
+//		s.flush();
+//		s.clear();
+//		s.clear();
+//
+//		car = (Carz) s.createQuery( "from Carz car left join fetch car.lot").uniqueResult();
+//		assertNotNull( car.getLot() );
+//
+//		s.getTransaction().commit();
+//		s.close();
+//
+	}
+
+	protected Class[] getMappings() {
+		return new Class[] {
+			//Carz.class,
+			//Lotz.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/ManyToOneTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/ManyToOneTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/ManyToOneTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,346 @@
+//$Id: ManyToOneTest.java 17529 2009-09-19 19:59:46Z stliu $
+package org.hibernate.test.annotations.manytoone;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.Company;
+import org.hibernate.test.annotations.Customer;
+import org.hibernate.test.annotations.Discount;
+import org.hibernate.test.annotations.Flight;
+import org.hibernate.test.annotations.Passport;
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.test.annotations.Ticket;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ManyToOneTest extends TestCase {
+
+	public ManyToOneTest(String x) {
+		super( x );
+	}
+
+	public void testEager() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Color c = new Color();
+		c.setName( "Yellow" );
+		s.persist( c );
+		Car car = new Car();
+		car.setBodyColor( c );
+		s.persist( car );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		car = (Car) s.get( Car.class, car.getId() );
+		tx.commit();
+		s.close();
+		assertNotNull( car );
+		assertNotNull( car.getBodyColor() );
+		assertEquals( "Yellow", car.getBodyColor().getName() );
+
+	}
+
+	public void testDefaultMetadata() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Color c = new Color();
+		c.setName( "Blue" );
+		s.persist( c );
+		Car car = new Car();
+		car.setBodyColor( c );
+		s.persist( car );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		car = (Car) s.get( Car.class, car.getId() );
+		assertNotNull( car );
+		assertNotNull( car.getBodyColor() );
+		assertEquals( c.getId(), car.getBodyColor().getId() );
+		tx.rollback();
+		s.close();
+	}
+
+	public void testCreate() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Flight firstOne = new Flight();
+		firstOne.setId( new Long( 1 ) );
+		firstOne.setName( "AF0101" );
+		firstOne.setDuration( new Long( 1000 ) );
+		Company frenchOne = new Company();
+		frenchOne.setName( "Air France" );
+		firstOne.setCompany( frenchOne );
+		s.persist( firstOne );
+		tx.commit();
+		s.close();
+		assertNotNull( "identity id should work", frenchOne.getId() );
+
+		s = openSession();
+		tx = s.beginTransaction();
+		firstOne = (Flight) s.get( Flight.class, new Long( 1 ) );
+		assertNotNull( firstOne.getCompany() );
+		assertEquals( frenchOne.getName(), firstOne.getCompany().getName() );
+		tx.commit();
+		s.close();
+	}
+
+	public void testCascade() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Discount discount = new Discount();
+		discount.setDiscount( 20.12 );
+		Customer customer = new Customer();
+		Collection discounts = new ArrayList();
+		discounts.add( discount );
+		customer.setName( "Quentin Tarantino" );
+		discount.setOwner( customer );
+		customer.setDiscountTickets( discounts );
+		s.persist( discount );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		discount = (Discount) s.get( Discount.class, discount.getId() );
+		assertNotNull( discount );
+		assertEquals( 20.12, discount.getDiscount() );
+		assertNotNull( discount.getOwner() );
+		customer = new Customer();
+		customer.setName( "Clooney" );
+		discount.setOwner( customer );
+		discounts = new ArrayList();
+		discounts.add( discount );
+		customer.setDiscountTickets( discounts );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		discount = (Discount) s.get( Discount.class, discount.getId() );
+		assertNotNull( discount );
+		assertNotNull( discount.getOwner() );
+		assertEquals( "Clooney", discount.getOwner().getName() );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		customer = (Customer) s.get( Customer.class, customer.getId() );
+		s.delete( customer );
+		tx.commit();
+		s.close();
+	}
+
+	public void testFetch() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Discount discount = new Discount();
+		discount.setDiscount( 20 );
+		Customer customer = new Customer();
+		Collection discounts = new ArrayList();
+		discounts.add( discount );
+		customer.setName( "Quentin Tarantino" );
+		discount.setOwner( customer );
+		customer.setDiscountTickets( discounts );
+		s.persist( discount );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		discount = (Discount) s.get( Discount.class, discount.getId() );
+		assertNotNull( discount );
+		assertFalse( Hibernate.isInitialized( discount.getOwner() ) );
+		tx.commit();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		discount = (Discount) s.load( Discount.class, discount.getId() );
+		assertNotNull( discount );
+		assertFalse( Hibernate.isInitialized( discount.getOwner() ) );
+		tx.commit();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.delete( s.get( Discount.class, discount.getId() ) );
+		tx.commit();
+		s.close();
+	}
+
+	public void testCompositeFK() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		ParentPk ppk = new ParentPk();
+		ppk.firstName = "John";
+		ppk.lastName = "Doe";
+		Parent p = new Parent();
+		p.age = 45;
+		p.id = ppk;
+		s.persist( p );
+		Child c = new Child();
+		c.parent = p;
+		s.persist( c );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		//FIXME: fix this when the small parser bug will be fixed 
+		Query q = s.createQuery( "from " + Child.class.getName() ); //+ " c where c.parent.id.lastName = :lastName");
+		//q.setString("lastName", p.id.lastName);
+		List result = q.list();
+		assertEquals( 1, result.size() );
+		Child c2 = (Child) result.get( 0 );
+		assertEquals( c2.id, c.id );
+		tx.commit();
+		s.close();
+	}
+
+	public void testImplicitCompositeFk() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Node n1 = new Node();
+		n1.setDescription( "Parent" );
+		NodePk n1pk = new NodePk();
+		n1pk.setLevel( 1 );
+		n1pk.setName( "Root" );
+		n1.setId( n1pk );
+		Node n2 = new Node();
+		NodePk n2pk = new NodePk();
+		n2pk.setLevel( 2 );
+		n2pk.setName( "Level 1: A" );
+		n2.setParent( n1 );
+		n2.setId( n2pk );
+		s.persist( n2 );
+		tx.commit();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		n2 = (Node) s.get( Node.class, n2pk );
+		assertNotNull( n2 );
+		assertNotNull( n2.getParent() );
+		assertEquals( 1, n2.getParent().getId().getLevel() );
+		tx.commit();
+		s.close();
+	}
+
+	public void testManyToOneNonPk() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Order order = new Order();
+		order.setOrderNbr( "123" );
+		s.persist( order );
+		OrderLine ol = new OrderLine();
+		ol.setItem( "Mouse" );
+		ol.setOrder( order );
+		s.persist( ol );
+		s.flush();
+		s.clear();
+		ol = (OrderLine) s.get( OrderLine.class, ol.getId() );
+		assertNotNull( ol.getOrder() );
+		assertEquals( "123", ol.getOrder().getOrderNbr() );
+		assertTrue( ol.getOrder().getOrderLines().contains( ol ) );
+		tx.rollback();
+		s.close();
+	}
+
+	public void testTwoManyToOneNonPk() throws Exception {
+		//2 many to one non pk pointing to the same referencedColumnName should not fail
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		org.hibernate.test.annotations.manytoone.Customer customer = new org.hibernate.test.annotations.manytoone.Customer();
+		customer.userId="123";
+		org.hibernate.test.annotations.manytoone.Customer customer2 = new org.hibernate.test.annotations.manytoone.Customer();
+		customer2.userId="124";
+		s.persist( customer2 );
+		s.persist( customer );
+		Deal deal = new Deal();
+		deal.from = customer;
+		deal.to = customer2;
+		s.persist( deal );
+		s.flush();
+		s.clear();
+		deal = (Deal) s.get( Deal.class, deal.id );
+		assertNotNull( deal.from );
+		assertNotNull( deal.to );
+		tx.rollback();
+		s.close();
+	}
+
+	public void testFormulaOnOtherSide() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Frame frame = new Frame();
+		frame.setName( "Prada" );
+		s.persist( frame );
+		Lens l = new Lens();
+		l.setFocal( 2.5f );
+		l.setFrame( frame );
+		s.persist( l );
+		Lens r = new Lens();
+		r.setFocal( 1.2f);
+		r.setFrame( frame );
+		s.persist( r );
+		s.flush();
+		s.clear();
+		frame = (Frame) s.get( Frame.class, frame.getId() );
+		assertEquals( 2, frame.getLenses().size() );
+		assertTrue( frame.getLenses().iterator().next().getLength() <= 1/1.2f );
+		assertTrue( frame.getLenses().iterator().next().getLength() >= 1/2.5f );
+		tx.rollback();
+		s.close();
+	}
+
+	/**
+	 * @see org.hibernate.test.annotations.TestCase#getMappings()
+	 */
+	protected java.lang.Class[] getMappings() {
+		return new java.lang.Class[]{
+				Deal.class,
+				org.hibernate.test.annotations.manytoone.Customer.class,
+				Car.class,
+				Color.class,
+				Flight.class,
+				Company.class,
+				Customer.class,
+				Discount.class,
+				Ticket.class,
+				Passport.class,
+				Parent.class,
+				Child.class,
+				Node.class,
+				User.class,
+				DistrictUser.class,
+				Order.class,
+				OrderLine.class,
+				Frame.class,
+				Lens.class
+		};
+	}
+
+}
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Node.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Node.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Node.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,68 @@
+//$Id: Node.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.manytoone;
+
+import java.io.Serializable;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Node implements Serializable {
+
+	private NodePk id;
+	private String description;
+	private Node parent;
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( !( o instanceof Node ) ) return false;
+
+		final Node node = (Node) o;
+
+		if ( !id.equals( node.id ) ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		return id.hashCode();
+	}
+
+	@Id
+	public NodePk getId() {
+		return id;
+	}
+
+	public void setId(NodePk id) {
+		this.id = id;
+	}
+
+	public String getDescription() {
+		return description;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
+	@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+	@JoinColumns({
+	@JoinColumn(name = "parentName"),
+	@JoinColumn(name = "parentLevel")
+			})
+	public Node getParent() {
+		return parent;
+	}
+
+	public void setParent(Node parent) {
+		this.parent = parent;
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/NodePk.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/NodePk.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/NodePk.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,51 @@
+//$Id: NodePk.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.manytoone;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class NodePk implements Serializable {
+	private String name;
+	private int level;
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( !( o instanceof NodePk ) ) return false;
+
+		final NodePk nodePk = (NodePk) o;
+
+		if ( level != nodePk.level ) return false;
+		if ( !name.equals( nodePk.name ) ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		int result;
+		result = name.hashCode();
+		result = 29 * result + level;
+		return result;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	@Column(name = "fld_lvl")
+	public int getLevel() {
+		return level;
+	}
+
+	public void setLevel(int level) {
+		this.level = level;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Order.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Order.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Order.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,50 @@
+//$Id: Order.java 17529 2009-09-19 19:59:46Z stliu $
+package org.hibernate.test.annotations.manytoone;
+
+import java.io.Serializable;
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Column;
+import javax.persistence.Table;
+import javax.persistence.OneToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name="ORDERS")
+public class Order implements Serializable {
+	private Integer id;
+	private String orderNbr;
+	private Set<OrderLine> orderLines;
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	@Column(name="order_nbr")
+	public String getOrderNbr() {
+		return orderNbr;
+	}
+
+	public void setOrderNbr(String orderNbr) {
+		this.orderNbr = orderNbr;
+	}
+
+	@OneToMany(mappedBy = "order")
+	public Set<OrderLine> getOrderLines() {
+		return orderLines;
+	}
+
+	public void setOrderLines(Set<OrderLine> orderLines) {
+		this.orderLines = orderLines;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/OrderLine.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/OrderLine.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/OrderLine.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,45 @@
+//$Id: OrderLine.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.manytoone;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.ManyToOne;
+import javax.persistence.JoinColumn;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class OrderLine {
+	private Integer id;
+	private String item;
+	private Order order;
+
+	@Id @GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getItem() {
+		return item;
+	}
+
+	public void setItem(String item) {
+		this.item = item;
+	}
+
+	@ManyToOne
+	@JoinColumn(name="order_nbr", referencedColumnName = "order_nbr", unique = true)
+	public Order getOrder() {
+		return order;
+	}
+
+	public void setOrder(Order order) {
+		this.order = order;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Parent.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Parent.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/Parent.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,33 @@
+//$Id: Parent.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.manytoone;
+
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "tbl_parent")
+public class Parent implements Serializable {
+	@Id
+	public ParentPk id;
+	public int age;
+
+	public int hashCode() {
+		//a NPE can occurs, but I don't expect hashcode to be used before pk is set
+		return id.hashCode();
+	}
+
+	public boolean equals(Object obj) {
+		//a NPE can occurs, but I don't expect equals to be used before pk is set
+		if ( obj != null && obj instanceof Parent ) {
+			return id.equals( ( (Parent) obj ).id );
+		}
+		else {
+			return false;
+		}
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/ParentPk.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/ParentPk.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/ParentPk.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,40 @@
+//$Id: ParentPk.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.manytoone;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class ParentPk implements Serializable {
+	@Column(length = 50)
+	String firstName;
+	String lastName;
+
+	/**
+	 * is a male or a female
+	 */
+	//show hetereogenous PK types
+	boolean isMale;
+
+	public int hashCode() {
+		//this implem sucks
+		return firstName.hashCode() + lastName.hashCode() + ( isMale ? 0 : 1 );
+	}
+
+	public boolean equals(Object obj) {
+		//firstName and lastName are expected to be set in this implem
+		if ( obj != null && obj instanceof ParentPk ) {
+			ParentPk other = (ParentPk) obj;
+			return firstName.equals( other.firstName )
+					&& lastName.equals( other.lastName )
+					&& isMale == other.isMale;
+		}
+		else {
+			return false;
+		}
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/TreeType.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/TreeType.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/TreeType.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,61 @@
+//$Id: TreeType.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.manytoone;
+
+import javax.persistence.Entity;
+import javax.persistence.ManyToOne;
+import javax.persistence.JoinTable;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.JoinColumn;
+import javax.persistence.FetchType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class TreeType {
+	private Integer id;
+	private String name;
+	private ForestType forestType;
+	private ForestType alternativeForestType;
+
+	@ManyToOne(fetch = FetchType.LAZY)
+	@JoinTable(name="Tree_Forest")
+	public ForestType getForestType() {
+		return forestType;
+	}
+
+	public void setForestType(ForestType forestType) {
+		this.forestType = forestType;
+	}
+
+	@ManyToOne(fetch = FetchType.LAZY)
+	@JoinTable(name="Atl_Forest_Type",
+		joinColumns = @JoinColumn(name="tree_id"),
+		inverseJoinColumns = @JoinColumn(name="forest_id") )
+	public ForestType getAlternativeForestType() {
+		return alternativeForestType;
+	}
+
+	public void setAlternativeForestType(ForestType alternativeForestType) {
+		this.alternativeForestType = alternativeForestType;
+	}
+
+	@Id
+	@GeneratedValue
+	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;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/User.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/User.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/User.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,113 @@
+package org.hibernate.test.annotations.manytoone;
+
+import java.util.Date;
+import java.util.Set;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.OneToMany;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.Table;
+
+ at Entity
+ at Table(name = "CTVUSERS")
+ at IdClass(UserPK.class)
+ at SequenceGenerator(name = "UserSeq", sequenceName = "SQ_USER")
+public class User {
+	@Id
+	@Column(name = "CTVUSERS_KEY")
+	private Long userKey;
+
+	@Id
+	@Column(name = "CTVUSERS_START_DATE")
+	private Date startDate;
+
+	@Id
+	@Column(name = "CTVUSERS_END_DATE")
+	private Date endDate;
+
+	@Column(name = "CTVUSERS_CREATE_USERS_KEY")
+	private Long createdBy;
+
+	@Column(name = "CTVUSERS_CREATE_DATE")
+	private Date createdOn;
+
+	@Column(name = "CTVUSERS_ID")
+	private String userId;
+
+	@Column(name = "CTVUSERS_PREFX_KEY")
+	private Integer prefix;
+
+	@Column(name = "CTVUSERS_FIRST_NAME")
+	private String firstName;
+
+	@Column(name = "CTVUSERS_LAST_NAME1")
+	private String lastName1;
+
+	@Column(name = "CTVUSERS_LAST_NAME2")
+	private String lastName2;
+
+	@Column(name = "CTVUSERS_MIDDLE_NAME1")
+	private String middleName1;
+
+	@Column(name = "CTVUSERS_MIDDLE_NAME2")
+	private String middleName2;
+
+	@Column(name = "CTVUSERS_SUFFX_KEY")
+	private Integer suffix;
+
+	@Column(name = "CTVUSERS_BIRTH_DATE")
+	private Date birthDate;
+
+	@Column(name = "CTVUSERS_BIRTH_STATE_KEY")
+	private Integer birthState;
+
+	@Column(name = "CTVUSERS_BIRTH_CNTRY_KEY")
+	private Integer birthCountry;
+
+	@Column(name = "CTVUSERS_USERNAME")
+	private String username;
+
+	@Column(name = "CTVUSERS_PASSWORD")
+	private String password;
+
+	@Column(name = "CTVUSERS_LOTYP_KEY")
+	private Integer userType;
+
+	@Column(name = "CTVUSERS_PRIVL_KEY")
+	private Integer privilege;
+
+	@Column(name = "CTVUSERS_STATE_KEY")
+	private Integer state;
+
+	@Column(name = "CTVUSERS_CNTRY_KEY")
+	private Integer country;
+
+	@Column(name = "CTVUSERS_PREFERRED_NAME")
+	private String preferredName;
+
+	@Column(name = "CTVUSERS_BIRTH_PLACE")
+	private String birthPlace;
+
+	@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "user")
+	private Set<DistrictUser> districtUsers;
+
+	@Column(name = "CTVUSERS_SCHOL_KEY")
+	private Long school;
+
+	@Column(name = "CTVUSERS_CLSTR_KEY")
+	private Long cluster;
+
+	@Column(name = "CTVUSERS_LDTMM_KEY")
+	private Long ldtmm;
+
+	@Column(name = "CTVUSERS_LDTMD_KEY")
+	private Long ldtmd;
+
+	@Column(name = "CTVUSERS_PMTMP_KEY")
+	private Long pmtmp;
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/UserPK.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/UserPK.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/UserPK.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,39 @@
+package org.hibernate.test.annotations.manytoone;
+
+import java.io.Serializable;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import javax.persistence.Column;
+
+public class UserPK implements Serializable {
+	private static final long serialVersionUID = -7720874756224520523L;
+	@Column(name = "CTVUSERS_KEY")
+	public Long userKey;
+
+	@Column(name = "CTVUSERS_START_DATE")
+	public Date startDate;
+
+
+	@Column(name = "CTVUSERS_END_DATE")
+	public Date endDate;
+
+	public UserPK() {
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if ( !( obj instanceof UserPK ) ) {
+			return false;
+		}
+		UserPK userPK = (UserPK) obj;
+		SimpleDateFormat formatter = new SimpleDateFormat( "MM/dd/yyyy" );
+		return userKey.equals( userPK.userKey ) && formatter.format( startDate )
+				.equals( formatter.format( userPK.startDate ) )
+				&& formatter.format( endDate ).equals( formatter.format( userPK.endDate ) );
+	}
+
+	@Override
+	public int hashCode() {
+		return userKey.hashCode() * startDate.hashCode() * endDate.hashCode();
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/referencedcolumnname/GenericObject.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/referencedcolumnname/GenericObject.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/referencedcolumnname/GenericObject.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,68 @@
+//$
+package org.hibernate.test.annotations.manytoone.referencedcolumnname;
+
+import java.io.Serializable;
+import java.rmi.server.UID;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.MappedSuperclass;
+import javax.persistence.Transient;
+import javax.persistence.Version;
+
+ at MappedSuperclass
+public class GenericObject implements Serializable {
+	protected int id;
+	protected int version;
+	protected UID uid = new UID();
+
+	@Id
+	@GeneratedValue( strategy = GenerationType.IDENTITY )
+	public int getId() {
+		return id;
+	}
+
+	public void setId(int id) {
+		this.id = id;
+	}
+
+	@Version
+	public int getVersion() {
+		return version;
+	}
+
+	public void setVersion(int version) {
+		this.version = version;
+	}
+
+	public void incrementVersion() {
+		this.version++;
+	}
+
+	public boolean equals(Object other) {
+		if ( this == other )
+			return true;
+		if ( ( other == null ) || !( other.getClass().equals( this.getClass() ) ) )
+			return false;
+		GenericObject anObject = (GenericObject) other;
+		if ( this.id == 0 || anObject.id == 0 )
+			return false;
+
+		return ( this.id == anObject.id );
+	}
+
+	public int hashCode() {
+		if ( this.id == 0 )
+			return super.hashCode();
+		return this.id;
+	}
+
+	@Transient
+	public UID getUid() {
+		return uid;
+	}
+
+	public void setUid(UID uid) {
+		this.uid = uid;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/referencedcolumnname/Item.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/referencedcolumnname/Item.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/referencedcolumnname/Item.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,13 @@
+//$
+package org.hibernate.test.annotations.manytoone.referencedcolumnname;
+
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.OneToMany;
+import javax.persistence.Transient;
+
+
+ at Entity
+public class Item extends GenericObject {
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/referencedcolumnname/ManyToOneReferencedColumnNameTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/referencedcolumnname/ManyToOneReferencedColumnNameTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/referencedcolumnname/ManyToOneReferencedColumnNameTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,55 @@
+//$
+package org.hibernate.test.annotations.manytoone.referencedcolumnname;
+
+import java.math.BigDecimal;
+
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.Session;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ManyToOneReferencedColumnNameTest extends TestCase {
+	public void testReoverableExceptionInFkOrdering() throws Exception {
+		//SF should not blow up
+		Vendor v = new Vendor();
+		Item i = new Item();
+		ZItemCost ic = new ZItemCost();
+		ic.setCost( new BigDecimal(2) );
+		ic.setItem( i );
+		ic.setVendor( v );
+		WarehouseItem wi = new WarehouseItem();
+		wi.setDefaultCost( ic );
+		wi.setItem( i );
+		wi.setVendor( v );
+		wi.setQtyInStock( new BigDecimal(2) );
+		Session s = openSession(  );
+		s.getTransaction().begin();
+		s.save( i );
+		s.save( v );
+		s.save( ic );
+		s.save( wi );
+		s.flush();
+		s.getTransaction().rollback();
+		s.close();
+		
+	}
+	
+	
+	
+	@Override
+	protected boolean runForCurrentDialect() {
+		return super.runForCurrentDialect() && getDialect().supportsIdentityColumns();
+	}
+
+
+
+	protected Class[] getMappings() {
+		return new Class[] {
+				Item.class,
+				Vendor.class,
+				WarehouseItem.class,
+				ZItemCost.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/referencedcolumnname/Vendor.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/referencedcolumnname/Vendor.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/referencedcolumnname/Vendor.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,12 @@
+//$
+package org.hibernate.test.annotations.manytoone.referencedcolumnname;
+
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.OneToMany;
+import javax.persistence.Transient;
+
+ at Entity
+public class Vendor extends GenericObject {
+}
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/referencedcolumnname/WarehouseItem.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/referencedcolumnname/WarehouseItem.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/referencedcolumnname/WarehouseItem.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,62 @@
+//$
+package org.hibernate.test.annotations.manytoone.referencedcolumnname;
+
+import java.math.BigDecimal;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
+import javax.persistence.ManyToOne;
+
+ at Entity
+public class WarehouseItem extends GenericObject {
+
+
+	Item item;
+	Vendor vendor;
+	ZItemCost defaultCost;
+	BigDecimal qtyInStock;
+
+
+	public BigDecimal getQtyInStock() {
+		return qtyInStock;
+	}
+
+	public void setQtyInStock(BigDecimal qtyInStock) {
+		this.qtyInStock = qtyInStock;
+	}
+
+	@ManyToOne
+//(fetch=FetchType.LAZY)
+	@JoinColumn( name = "ITEM_ID", unique = false, nullable = false, insertable = true, updatable = true )
+	public Item getItem() {
+		return item;
+	}
+
+	public void setItem(Item item) {
+		this.item = item;
+	}
+
+	@ManyToOne( fetch = FetchType.LAZY )
+	@JoinColumn( name = "VENDOR_ID", unique = false, nullable = false, insertable = true, updatable = true )
+	public Vendor getVendor() {
+		return vendor;
+	}
+
+	public void setVendor(Vendor vendor) {
+		this.vendor = vendor;
+	}
+
+	@ManyToOne
+	@JoinColumns( {
+	@JoinColumn( name = "vendor_id", referencedColumnName = "vendor_id", insertable = false, updatable = false ),
+	@JoinColumn( name = "item_id", referencedColumnName = "item_id", insertable = false, updatable = false )
+			} )
+	public ZItemCost getDefaultCost() {
+		return defaultCost;
+	}
+
+	public void setDefaultCost(ZItemCost defaultCost) {
+		this.defaultCost = defaultCost;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/referencedcolumnname/ZItemCost.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/referencedcolumnname/ZItemCost.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/manytoone/referencedcolumnname/ZItemCost.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,46 @@
+//$
+package org.hibernate.test.annotations.manytoone.referencedcolumnname;
+
+import java.math.BigDecimal;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.ManyToOne;
+import javax.persistence.Transient;
+import javax.persistence.JoinColumn;
+
+ at Entity
+public class ZItemCost extends GenericObject {
+
+	Item item;
+	Vendor vendor;
+	BigDecimal cost;
+
+	@ManyToOne( fetch = FetchType.LAZY )
+	//@JoinColumn(name="ITEM_ID", unique=false, nullable=false, insertable=true, updatable=true)
+	public Item getItem() {
+		return item;
+	}
+
+	public void setItem(Item item) {
+		this.item = item;
+	}
+
+	@ManyToOne( fetch = FetchType.LAZY )
+	//@JoinColumn(name="VENDOR_ID", unique=false, nullable=false, insertable=true, updatable=true)
+	public Vendor getVendor() {
+		return vendor;
+	}
+
+	public void setVendor(Vendor vendor) {
+		this.vendor = vendor;
+	}
+
+	public BigDecimal getCost() {
+		return cost;
+	}
+
+	public void setCost(BigDecimal cost) {
+		this.cost = cost;
+	}
+}
+

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/namingstrategy/Address.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/namingstrategy/Address.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/namingstrategy/Address.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,34 @@
+// $Id: Address.java 14741 2008-06-05 11:25:56Z hardy.ferentschik $
+package org.hibernate.test.annotations.namingstrategy;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToOne;
+
+ at Entity
+public class Address {
+
+	@Id
+	private long id;
+
+	@ManyToOne
+	@JoinTable(name = "person_address")
+	private Person person;
+
+	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;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/namingstrategy/DummyNamingStrategy.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/namingstrategy/DummyNamingStrategy.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/namingstrategy/DummyNamingStrategy.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,13 @@
+// $Id: DummyNamingStrategy.java 14741 2008-06-05 11:25:56Z hardy.ferentschik $
+package org.hibernate.test.annotations.namingstrategy;
+
+import org.hibernate.cfg.EJB3NamingStrategy;
+
+ at SuppressWarnings("serial")
+public class DummyNamingStrategy extends EJB3NamingStrategy {
+	
+	public String tableName(String tableName) {
+		return "T" + tableName;
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/namingstrategy/NamingStrategyTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/namingstrategy/NamingStrategyTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/namingstrategy/NamingStrategyTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,52 @@
+// $Id: NamingStrategyTest.java 14741 2008-06-05 11:25:56Z hardy.ferentschik $
+package org.hibernate.test.annotations.namingstrategy;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+import junit.framework.TestCase;
+
+import org.hibernate.cfg.AnnotationConfiguration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Test harness for ANN-716.
+ * 
+ * @author Hardy Ferentschik
+ */
+public class NamingStrategyTest extends TestCase {
+	
+	private Logger log = LoggerFactory.getLogger(NamingStrategyTest.class);
+
+	public void testWithCustomNamingStrategy() throws Exception {
+		try {
+			AnnotationConfiguration config = new AnnotationConfiguration();
+			config.setNamingStrategy(new DummyNamingStrategy());
+			config.addAnnotatedClass(Address.class);
+			config.addAnnotatedClass(Person.class);
+			config.buildSessionFactory();
+		}
+		catch( Exception e ) {
+			StringWriter writer = new StringWriter();
+			e.printStackTrace(new PrintWriter(writer));
+			log.debug(writer.toString());
+			fail(e.getMessage());
+		}
+	}
+	
+	public void testWithoutCustomNamingStrategy() throws Exception {
+		try {
+			AnnotationConfiguration config = new AnnotationConfiguration();
+			config.addAnnotatedClass(Address.class);
+			config.addAnnotatedClass(Person.class);
+			config.buildSessionFactory();
+		}
+		catch( Exception e ) {
+			StringWriter writer = new StringWriter();
+			e.printStackTrace(new PrintWriter(writer));
+			log.debug(writer.toString());
+			fail(e.getMessage());
+		}
+	}	
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/namingstrategy/Person.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/namingstrategy/Person.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/namingstrategy/Person.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,35 @@
+// $Id: Person.java 14741 2008-06-05 11:25:56Z hardy.ferentschik $
+package org.hibernate.test.annotations.namingstrategy;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+ at Entity
+public class Person {
+
+	@Id
+	private long id;
+
+	@OneToMany(mappedBy = "person")
+	private Set<Address> addresses = new HashSet<Address>();
+
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	public Set<Address> getAddresses() {
+		return addresses;
+	}
+
+	public void setAddresses(Set<Address> addresses) {
+		this.addresses = addresses;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/naturalid/Citizen.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/naturalid/Citizen.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/naturalid/Citizen.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,67 @@
+//$Id: Citizen.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.naturalid;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+
+import org.hibernate.annotations.NaturalId;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Citizen {
+	@Id
+	@GeneratedValue
+	private Integer id;
+	private String firstname;
+	private String lastname;
+	@NaturalId
+	@ManyToOne
+	private State state;
+	@NaturalId
+	private String ssn;
+
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer 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 State getState() {
+		return state;
+	}
+
+	public void setState(State state) {
+		this.state = state;
+	}
+
+	public String getSsn() {
+		return ssn;
+	}
+
+	public void setSsn(String ssn) {
+		this.ssn = ssn;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/naturalid/NaturalIdOnManyToOne.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/naturalid/NaturalIdOnManyToOne.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/naturalid/NaturalIdOnManyToOne.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,42 @@
+package org.hibernate.test.annotations.naturalid;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+
+import org.hibernate.annotations.NaturalId;
+
+ at Entity
+/**
+ * Test case for NaturalId annotation - ANN-750
+ * 
+ * @author Emmanuel Bernard
+ * @author Hardy Ferentschik
+ */
+class NaturalIdOnManyToOne {
+
+    @Id
+    @GeneratedValue
+    int id;
+
+    @NaturalId
+    @ManyToOne
+    Citizen citizen;
+    
+	public int getId() {
+		return id;
+	}
+
+	public void setId(int id) {
+		this.id = id;
+	}
+
+	public Citizen getCitizen() {
+		return citizen;
+	}
+
+	public void setCitizen(Citizen citizen) {
+		this.citizen = citizen;
+	}
+} 

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/naturalid/NaturalIdOnSingleManyToOneTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/naturalid/NaturalIdOnSingleManyToOneTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/naturalid/NaturalIdOnSingleManyToOneTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,95 @@
+//$Id: NaturalIdOnSingleManyToOneTest.java 14786 2008-06-19 14:59:11Z hardy.ferentschik $
+package org.hibernate.test.annotations.naturalid;
+
+import java.util.List;
+
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.metadata.ClassMetadata;
+import org.hibernate.stat.Statistics;
+import org.hibernate.test.annotations.TestCase;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Test case for NaturalId annotation. See ANN-750.
+ * 
+ * @author Emmanuel Bernard
+ * @author Hardy Ferentschik
+ */
+ at SuppressWarnings("unchecked")
+public class NaturalIdOnSingleManyToOneTest extends TestCase {
+	
+	private Logger log = LoggerFactory.getLogger(NaturalIdOnManyToOne.class);
+
+	public void testMappingProperties() {
+		log.warn("Commented out test");
+		
+		ClassMetadata metaData = getSessions().getClassMetadata(
+				NaturalIdOnManyToOne.class);
+		assertTrue("Class should have a natural key", metaData
+				.hasNaturalIdentifier());
+		int[] propertiesIndex = metaData.getNaturalIdentifierProperties();
+		assertTrue("Wrong number of elements", propertiesIndex.length == 1);
+	}
+
+	public void testManyToOneNaturalIdCached() {
+		NaturalIdOnManyToOne singleManyToOne = new NaturalIdOnManyToOne();
+		Citizen c1 = new Citizen();
+		c1.setFirstname("Emmanuel");
+		c1.setLastname("Bernard");
+		c1.setSsn("1234");
+
+		State france = new State();
+		france.setName("Ile de France");
+		c1.setState(france);
+
+		singleManyToOne.setCitizen(c1);
+
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		s.persist(france);
+		s.persist(c1);
+		s.persist(singleManyToOne);
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		Criteria criteria = s.createCriteria(NaturalIdOnManyToOne.class);
+		criteria.add(Restrictions.naturalId().set("citizen", c1));
+		criteria.setCacheable(true);
+
+		Statistics stats = getSessions().getStatistics();
+		stats.setStatisticsEnabled(true);
+		stats.clear();
+		assertEquals("Cache hits should be empty", 0, stats
+				.getQueryCacheHitCount());
+
+		// first query
+		List results = criteria.list();
+		assertEquals(1, results.size());
+		assertEquals("Cache hits should be empty", 0, stats
+				.getQueryCacheHitCount());
+		assertEquals("First query should be a miss", 1, stats
+				.getQueryCacheMissCount());
+		assertEquals("Query result should be added to cache", 1, stats
+				.getQueryCachePutCount());
+
+		// query a second time - result should be cached
+		results = criteria.list();
+		assertEquals("Cache hits should be empty", 1, stats
+				.getQueryCacheHitCount());
+
+		// cleanup
+		tx.rollback();
+		s.close();
+	}
+
+	protected Class[] getMappings() {
+		return new Class[] { Citizen.class, State.class,
+				NaturalIdOnManyToOne.class };
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/naturalid/NaturalIdTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/naturalid/NaturalIdTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/naturalid/NaturalIdTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,137 @@
+//$Id: NaturalIdTest.java 14786 2008-06-19 14:59:11Z hardy.ferentschik $
+package org.hibernate.test.annotations.naturalid;
+
+import java.util.List;
+
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.metadata.ClassMetadata;
+import org.hibernate.stat.Statistics;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * Test case for NaturalId annotation
+ * 
+ * @author Emmanuel Bernard
+ * @author Hardy Ferentschik
+ */
+ at SuppressWarnings("unchecked")
+public class NaturalIdTest extends TestCase {
+
+	public void testMappingProperties() {
+		ClassMetadata metaData = getSessions().getClassMetadata(
+				Citizen.class);
+		assertTrue("Class should have a natural key", metaData
+				.hasNaturalIdentifier());
+		int[] propertiesIndex = metaData.getNaturalIdentifierProperties();
+		assertTrue("Wrong number of elements", propertiesIndex.length == 2);
+	}
+
+	public void testNaturalIdCached() {
+		saveSomeCitizens();
+
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		State france = (State) s.load(State.class, new Integer(2));
+		Criteria criteria = s.createCriteria(Citizen.class);
+		criteria.add(Restrictions.naturalId().set("ssn", "1234").set("state",
+				france));
+		criteria.setCacheable(true);
+
+		Statistics stats = getSessions().getStatistics();
+		stats.setStatisticsEnabled(true);
+		stats.clear();
+		assertEquals("Cache hits should be empty", 0, stats
+				.getQueryCacheHitCount());
+
+		// first query
+		List results = criteria.list();
+		assertEquals(1, results.size());
+		assertEquals("Cache hits should be empty", 0, stats
+				.getQueryCacheHitCount());
+		assertEquals("First query should be a miss", 1, stats
+				.getQueryCacheMissCount());
+		assertEquals("Query result should be added to cache", 1, stats
+				.getQueryCachePutCount());
+
+		// query a second time - result should be cached
+		results = criteria.list();
+		assertEquals("Cache hits should be empty", 1, stats
+				.getQueryCacheHitCount());
+
+		// cleanup
+		tx.rollback();
+		s.close();
+	}
+
+	public void testNaturalIdUncached() {
+
+		saveSomeCitizens();
+
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		State france = (State) s.load(State.class, new Integer(2));
+		Criteria criteria = s.createCriteria(Citizen.class);
+		criteria.add(Restrictions.naturalId().set("ssn", "1234").set("state",
+				france));
+		criteria.setCacheable(false);
+
+		Statistics stats = getSessions().getStatistics();
+		stats.setStatisticsEnabled(true);
+		stats.clear();
+		assertEquals("Cache hits should be empty", 0, stats
+				.getQueryCacheHitCount());
+
+		// first query
+		List results = criteria.list();
+		assertEquals(1, results.size());
+		assertEquals("Cache hits should be empty", 0, stats
+				.getQueryCacheHitCount());
+		assertEquals("Query result should be added to cache", 0, stats
+				.getQueryCachePutCount());
+
+		// query a second time
+		results = criteria.list();
+		assertEquals("Cache hits should be empty", 0, stats
+				.getQueryCacheHitCount());
+
+		// cleanup
+		tx.rollback();
+		s.close();
+	}
+
+	protected Class[] getMappings() {
+		return new Class[] { Citizen.class, State.class,
+				NaturalIdOnManyToOne.class };
+	}
+
+	private void saveSomeCitizens() {
+		Citizen c1 = new Citizen();
+		c1.setFirstname("Emmanuel");
+		c1.setLastname("Bernard");
+		c1.setSsn("1234");
+
+		State france = new State();
+		france.setName("Ile de France");
+		c1.setState(france);
+
+		Citizen c2 = new Citizen();
+		c2.setFirstname("Gavin");
+		c2.setLastname("King");
+		c2.setSsn("000");
+		State australia = new State();
+		australia.setName("Australia");
+		c2.setState(australia);
+
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		s.persist(australia);
+		s.persist(france);
+		s.persist(c1);
+		s.persist(c2);
+		tx.commit();
+		s.close();
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/naturalid/State.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/naturalid/State.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/naturalid/State.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,33 @@
+//$Id: State.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.naturalid;
+
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class State {
+	@Id
+	@GeneratedValue
+	private Integer id;
+	private String 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;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/notfound/Coin.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/notfound/Coin.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/notfound/Coin.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,50 @@
+//$Id: Coin.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.notfound;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+import org.hibernate.annotations.NotFound;
+import org.hibernate.annotations.NotFoundAction;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Coin {
+	private Integer id;
+	private String name;
+	private Currency currency;
+
+	@Id
+	@GeneratedValue
+	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;
+	}
+
+	@ManyToOne
+	@JoinColumn(name = "currency", referencedColumnName = "name")
+	@NotFound(action = NotFoundAction.IGNORE)
+	public Currency getCurrency() {
+		return currency;
+	}
+
+	public void setCurrency(Currency currency) {
+		this.currency = currency;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/notfound/Currency.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/notfound/Currency.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/notfound/Currency.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,34 @@
+//$Id: Currency.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.notfound;
+
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Currency implements Serializable {
+	private Integer id;
+	private String name;
+
+	@Id
+	@GeneratedValue
+	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;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/notfound/NotFoundTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/notfound/NotFoundTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/notfound/NotFoundTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,45 @@
+//$Id: NotFoundTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.notfound;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class NotFoundTest extends TestCase {
+
+	public void testManyToOne() throws Exception {
+		Currency euro = new Currency();
+		euro.setName( "Euro" );
+		Coin fiveC = new Coin();
+		fiveC.setName( "Five cents" );
+		fiveC.setCurrency( euro );
+		Session s = openSession();
+		s.getTransaction().begin();
+		s.persist( euro );
+		s.persist( fiveC );
+		s.getTransaction().commit();
+		s.clear();
+		Transaction tx = s.beginTransaction();
+		euro = (Currency) s.get( Currency.class, euro.getId() );
+		s.delete( euro );
+		tx.commit();
+		s.clear();
+		tx = s.beginTransaction();
+		fiveC = (Coin) s.get( Coin.class, fiveC.getId() );
+		assertNull( fiveC.getCurrency() );
+		s.delete( fiveC );
+		tx.commit();
+		s.close();
+
+	}
+
+	protected Class[] getMappings() {
+		return new Class[]{
+				Coin.class,
+				Currency.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Child.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Child.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Child.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,33 @@
+//$Id: Child.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetomany;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Child implements Serializable {
+	@Id
+	@GeneratedValue
+	public Integer id;
+
+	@ManyToOne()
+	@JoinColumns({
+	@JoinColumn(name = "parentCivility", referencedColumnName = "isMale"),
+	@JoinColumn(name = "parentLastName", referencedColumnName = "lastName"),
+	@JoinColumn(name = "parentFirstName", referencedColumnName = "firstName")
+			})
+	public Parent parent;
+	@Column(name = "fav_sup_hero")
+	public String favoriteSuperhero;
+	@Column(name = "fav_singer")
+	public String favoriteSinger;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/City.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/City.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/City.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,72 @@
+//$Id: City.java 15046 2008-08-13 14:59:47Z epbernard $
+package org.hibernate.test.annotations.onetomany;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToMany;
+import javax.persistence.OrderBy;
+
+import org.hibernate.annotations.ForeignKey;
+import org.hibernate.annotations.Immutable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+class City {
+	private Integer id;
+	private String name;
+	private List<Street> streets;
+	private List<Street> mainStreets;
+
+	@Id
+	@GeneratedValue
+	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;
+	}
+
+	@OneToMany(mappedBy = "city")
+	@OrderBy("streetNameCopy, id")
+	public synchronized List<Street> getStreets() {
+		return streets;
+	}
+
+	public void setStreets(List<Street> streets) {
+		this.streets = streets;
+	}
+
+	@OneToMany()
+	@JoinColumn(name = "mainstreetcity_id")
+	@ForeignKey(name = "CITYSTR_FK")
+	@OrderBy
+	@Immutable
+	public List<Street> getMainStreets() {
+		return mainStreets;
+	}
+
+	public void setMainStreets(List<Street> streets) {
+		this.mainStreets = streets;
+	}
+
+	public void addMainStreet(Street street) {
+		if ( mainStreets == null ) mainStreets = new ArrayList<Street>();
+		mainStreets.add( street );
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Monkey.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Monkey.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Monkey.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,33 @@
+//$Id: Monkey.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetomany;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Monkey {
+	private Integer id;
+	private String name;
+
+	@Id
+	@GeneratedValue
+	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;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/OneToManyTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/OneToManyTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/OneToManyTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,432 @@
+//$Id: OneToManyTest.java 16346 2009-04-15 19:14:22Z gbadner $
+package org.hibernate.test.annotations.onetomany;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import org.hibernate.Hibernate;
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.dialect.HSQLDialect;
+import org.hibernate.test.annotations.Customer;
+import org.hibernate.test.annotations.Discount;
+import org.hibernate.test.annotations.Passport;
+import org.hibernate.test.annotations.RequiresDialect;
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.test.annotations.Ticket;
+import org.hibernate.test.annotations.TicketComparator;
+
+/**
+ * Test various case of a one to many relationship
+ *
+ * @author Emmanuel Bernard
+ */
+ at SuppressWarnings("unchecked")
+public class OneToManyTest extends TestCase {
+
+	public OneToManyTest(String x) {
+		super( x );
+	}
+
+	public void testColumnDefinitionPropagation() throws Exception {
+		Session s;
+		s = openSession();
+		s.getTransaction().begin();
+		Politician casimir = new Politician();
+		casimir.setName( "Casimir" );
+		PoliticalParty dream = new PoliticalParty();
+		dream.setName( "Dream" );
+		dream.addPolitician( casimir );
+		s.persist( dream );
+		s.getTransaction().commit();
+		s.clear();
+
+		Transaction tx = s.beginTransaction();
+		s.delete( s.get( PoliticalParty.class, dream.getName() ) );
+		tx.commit();
+		s.close();
+	}
+
+	public void testListWithBagSemanticAndOrderBy() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		City paris = new City();
+		paris.setName( "Paris" );
+		s.persist( paris );
+		Street rochechoir = new Street();
+		rochechoir.setStreetName( "Rochechoir" );
+		rochechoir.setCity( paris );
+		Street chmpsElysees = new Street();
+		chmpsElysees.setStreetName( "Champs Elysees" );
+		chmpsElysees.setCity( paris );
+		Street grandeArmee = new Street();
+		grandeArmee.setStreetName( "Grande Armee" );
+		grandeArmee.setCity( paris );
+		s.persist( rochechoir );
+		s.persist( chmpsElysees );
+		s.persist( grandeArmee );
+		paris.addMainStreet( chmpsElysees );
+		paris.addMainStreet( grandeArmee );
+
+		s.flush();
+		s.clear();
+
+		//testing @OrderBy with explicit values including Formula
+		paris = (City) s.get( City.class, paris.getId() );
+		assertEquals( 3, paris.getStreets().size() );
+		assertEquals( chmpsElysees.getStreetName(), paris.getStreets().get( 0 ).getStreetName() );
+		List<Street> mainStreets = paris.getMainStreets();
+		assertEquals( 2, mainStreets.size() );
+		Integer previousId = new Integer( -1 );
+		for ( Street street : mainStreets ) {
+			assertTrue( previousId < street.getId() );
+			previousId = street.getId();
+		}
+		tx.rollback();
+		s.close();
+
+	}
+
+	public void testUnidirectionalDefault() throws Exception {
+		Session s;
+		Transaction tx;
+		Trainer trainer = new Trainer();
+		trainer.setName( "First trainer" );
+		Tiger regularTiger = new Tiger();
+		regularTiger.setName( "Regular Tiger" );
+		Tiger whiteTiger = new Tiger();
+		whiteTiger.setName( "White Tiger" );
+		trainer.setTrainedTigers( new HashSet<Tiger>() );
+		s = openSession();
+		tx = s.beginTransaction();
+		s.persist( trainer );
+		s.persist( regularTiger );
+		s.persist( whiteTiger );
+		trainer.getTrainedTigers().add( regularTiger );
+		trainer.getTrainedTigers().add( whiteTiger );
+
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		trainer = (Trainer) s.get( Trainer.class, trainer.getId() );
+		assertNotNull( trainer );
+		assertNotNull( trainer.getTrainedTigers() );
+		assertEquals( 2, trainer.getTrainedTigers().size() );
+		tx.rollback();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		trainer = new Trainer();
+		trainer.setName( "new trainer" );
+		trainer.setTrainedTigers( new HashSet<Tiger>() );
+		trainer.getTrainedTigers().add( whiteTiger );
+		try {
+			s.persist( trainer );
+			tx.commit();
+			fail( "A one to many should not allow several trainer per Tiger" );
+		}
+		catch (HibernateException ce) {
+			tx.rollback();
+			//success
+		}
+		s.close();
+	}
+
+	public void testUnidirectionalExplicit() throws Exception {
+		Session s;
+		Transaction tx;
+		Trainer trainer = new Trainer();
+		trainer.setName( "First trainer" );
+		Monkey regularMonkey = new Monkey();
+		regularMonkey.setName( "Regular Monkey" );
+		Monkey miniMonkey = new Monkey();
+		miniMonkey.setName( "Mini Monkey" );
+		trainer.setTrainedMonkeys( new HashSet<Monkey>() );
+		s = openSession();
+		tx = s.beginTransaction();
+		s.persist( trainer );
+		s.persist( regularMonkey );
+		s.persist( miniMonkey );
+		trainer.getTrainedMonkeys().add( regularMonkey );
+		trainer.getTrainedMonkeys().add( miniMonkey );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		trainer = (Trainer) s.get( Trainer.class, trainer.getId() );
+		assertNotNull( trainer );
+		assertNotNull( trainer.getTrainedMonkeys() );
+		assertEquals( 2, trainer.getTrainedMonkeys().size() );
+		tx.rollback();
+		s.close();
+	}
+
+	public void testFetching() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Troop t = new Troop();
+		t.setName( "Final cut" );
+		Soldier vandamme = new Soldier();
+		vandamme.setName( "JC Vandamme" );
+		t.addSoldier( vandamme );
+		Soldier rambo = new Soldier();
+		rambo.setName( "Rambo" );
+		t.addSoldier( rambo );
+		s.persist( t );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		t = (Troop) s.get( Troop.class, t.getId() );
+		assertNotNull( t.getSoldiers() );
+		assertFalse( Hibernate.isInitialized( t.getSoldiers() ) );
+		assertEquals( 2, t.getSoldiers().size() );
+		assertEquals( rambo.getName(), t.getSoldiers().iterator().next().getName() );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		t = (Troop) s.createQuery( "from " + Troop.class.getName() + " as t where t.id = :id" )
+				.setParameter( "id", t.getId() ).uniqueResult();
+		assertFalse( Hibernate.isInitialized( t.getSoldiers() ) );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		rambo = (Soldier) s.get( Soldier.class, rambo.getId() );
+		assertTrue( Hibernate.isInitialized( rambo.getTroop() ) );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		rambo = (Soldier) s.createQuery( "from " + Soldier.class.getName() + " as s where s.id = :rid" )
+				.setParameter( "rid", rambo.getId() ).uniqueResult();
+		assertTrue( "fetching strategy used when we do query", Hibernate.isInitialized( rambo.getTroop() ) );
+		tx.commit();
+		s.close();
+	}
+
+	public void testCascadeDeleteOrphan() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Troop disney = new Troop();
+		disney.setName( "Disney" );
+		Soldier mickey = new Soldier();
+		mickey.setName( "Mickey" );
+		disney.addSoldier( mickey );
+		s.persist( disney );
+		tx.commit();
+		s.close();
+		s = openSession();
+		tx = s.beginTransaction();
+		Troop troop = (Troop) s.get( Troop.class, disney.getId() );
+		Soldier soldier = (Soldier) troop.getSoldiers().iterator().next();
+		tx.commit();
+		s.close();
+		//troop.getSoldiers().remove(soldier);
+		troop.getSoldiers().clear();
+		s = openSession();
+		tx = s.beginTransaction();
+		s.merge( troop );
+		tx.commit();
+		s.close();
+		s = openSession();
+		tx = s.beginTransaction();
+		soldier = (Soldier) s.get( Soldier.class, mickey.getId() );
+		assertNull( "delete-orphan should work", soldier );
+		troop = (Troop) s.get( Troop.class, disney.getId() );
+		s.delete( troop );
+		tx.commit();
+		s.close();
+	}
+
+	public void testCascadeDelete() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Troop disney = new Troop();
+		disney.setName( "Disney" );
+		Soldier mickey = new Soldier();
+		mickey.setName( "Mickey" );
+		disney.addSoldier( mickey );
+		s.persist( disney );
+		tx.commit();
+		s.close();
+		s = openSession();
+		tx = s.beginTransaction();
+		Troop troop = (Troop) s.get( Troop.class, disney.getId() );
+		s.delete( troop );
+		tx.commit();
+		s.close();
+		s = openSession();
+		tx = s.beginTransaction();
+		Soldier soldier = (Soldier) s.get( Soldier.class, mickey.getId() );
+		assertNull( "delete-orphan should work", soldier );
+		tx.commit();
+		s.close();
+	}
+
+	public void testSimpleOneToManySet() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Ticket t = new Ticket();
+		t.setNumber( "33A" );
+		Ticket t2 = new Ticket();
+		t2.setNumber( "234ER" );
+		Customer c = new Customer();
+		s.persist( c );
+		//s.persist(t);
+		SortedSet<Ticket> tickets = new TreeSet<Ticket>( new TicketComparator() );
+		tickets.add( t );
+		tickets.add( t2 );
+		c.setTickets( tickets );
+
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		c = (Customer) s.load( Customer.class, c.getId() );
+		assertNotNull( c );
+		assertTrue( Hibernate.isInitialized( c.getTickets() ) );
+		assertNotNull( c.getTickets() );
+		tickets = c.getTickets();
+		assertTrue( tickets.size() > 0 );
+		assertEquals( t2.getNumber(), c.getTickets().first().getNumber() );
+		tx.commit();
+		s.close();
+	}
+
+	public void testSimpleOneToManyCollection() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Discount d = new Discount();
+		d.setDiscount( 10 );
+		Customer c = new Customer();
+		List discounts = new ArrayList();
+		discounts.add( d );
+		d.setOwner( c );
+		c.setDiscountTickets( discounts );
+		s.persist( c );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		c = (Customer) s.load( Customer.class, c.getId() );
+		assertNotNull( c );
+		assertFalse( Hibernate.isInitialized( c.getDiscountTickets() ) );
+		assertNotNull( c.getDiscountTickets() );
+		Collection collecDiscount = c.getDiscountTickets();
+		assertTrue( collecDiscount.size() > 0 );
+		tx.commit();
+		s.close();
+	}
+
+	public void testJoinColumns() throws Exception {
+		Parent parent = new Parent();
+		ParentPk pk = new ParentPk();
+		pk.firstName = "Bruce";
+		pk.lastName = "Willis";
+		pk.isMale = true;
+		parent.id = pk;
+		parent.age = 40;
+		Child child = new Child();
+		Child child2 = new Child();
+		parent.addChild( child );
+		parent.addChild( child2 );
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		s.persist( parent );
+		tx.commit();
+		s.close();
+
+		assertNotNull( child.id );
+		assertNotNull( child2.id );
+		assertNotSame( child.id, child2.id );
+
+		s = openSession();
+		tx = s.beginTransaction();
+		parent = (Parent) s.get( Parent.class, pk );
+		assertNotNull( parent.children );
+		Hibernate.initialize( parent.children );
+		assertEquals( 2, parent.children.size() );
+		tx.commit();
+		s.close();
+	}
+
+	@RequiresDialect(HSQLDialect.class)
+	public void testOrderByOnSuperclassProperty() {
+		OrganisationUser user = new OrganisationUser();
+		user.setFirstName( "Emmanuel" );
+		user.setLastName( "Bernard" );
+		user.setIdPerson( new Long(1) );
+		user.setSomeText( "SomeText" );
+		Organisation org = new Organisation();
+		org.setIdOrganisation( new Long(1) );
+		org.setName( "S Diego Zoo" );
+		user.setOrganisation( org );
+		Session s = openSession();
+		s.getTransaction().begin();
+		s.persist( user );
+		s.persist( org );
+		s.flush();
+		s.clear();
+		s.createQuery( "select org from Organisation org left join fetch org.organisationUsers" ).list();
+		s.getTransaction().rollback();
+		s.close();
+	}
+
+	/**
+	 * @see org.hibernate.test.annotations.TestCase#getMappings()
+	 */
+	protected Class[] getMappings() {
+		return new Class[]{
+				Troop.class,
+				Soldier.class,
+				Customer.class,
+				Ticket.class,
+				Discount.class,
+				Passport.class,
+				Parent.class,
+				Child.class,
+				Trainer.class,
+				Tiger.class,
+				Monkey.class,
+				City.class,
+				Street.class,
+				PoliticalParty.class,
+				Politician.class,
+				Person.class,
+				Organisation.class,
+				OrganisationUser.class
+		};
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Order.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Order.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Order.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,70 @@
+//$Id: Order.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetomany;
+
+import java.util.LinkedHashSet;
+import java.util.Set;
+import java.util.List;
+import java.util.ArrayList;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.OneToMany;
+import javax.persistence.OrderBy;
+import javax.persistence.Table;
+
+ at Entity
+ at Table( name = "Order_tbl" )
+ at IdClass( OrderID.class )
+public class Order {
+	private String schoolId;
+	private Integer schoolIdSort;
+	private Integer academicYear;
+
+	private List<OrderItem> itemList = new ArrayList<OrderItem>();
+
+	public boolean equals(Object obj) {
+		return super.equals( obj );
+	}
+
+	public int hashCode() {
+		return 10;
+	}
+
+	@Id
+	public Integer getAcademicYear() {
+		return this.academicYear;
+	}
+
+	protected void setAcademicYear(Integer academicYear) {
+		this.academicYear = academicYear;
+	}
+
+	@Id
+	public String getSchoolId() {
+		return this.schoolId;
+	}
+
+	protected void setSchoolId(String schoolId) {
+		this.schoolId = schoolId;
+	}
+
+	@OneToMany( mappedBy = "order" )
+	@OrderBy( "dayNo desc" )
+	public List<OrderItem> getItemList() {
+		return this.itemList;
+	}
+
+	public void setItemList(List<OrderItem> itemList) {
+		this.itemList = itemList;
+	}
+
+	public Integer getSchoolIdSort() {
+		return this.schoolIdSort;
+	}
+
+	public void setSchoolIdSort(Integer schoolIdSort) {
+		this.schoolIdSort = schoolIdSort;
+	}
+
+
+}
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/OrderByTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/OrderByTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/OrderByTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,52 @@
+//$Id: OrderByTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetomany;
+
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.Session;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class OrderByTest extends TestCase {
+	public void testOrderByOnIdClassProperties() throws Exception {
+		Session s = openSession( );
+		s.getTransaction().begin();
+		Order o = new Order();
+		o.setAcademicYear( 2000 );
+		o.setSchoolId( "Supelec" );
+		o.setSchoolIdSort( 1 );
+		s.persist( o );
+		OrderItem oi1 = new OrderItem();
+		oi1.setAcademicYear( 2000 );
+		oi1.setDayName( "Monday" );
+		oi1.setSchoolId( "Supelec" );
+		oi1.setOrder( o );
+		oi1.setDayNo( 23 );
+		s.persist( oi1 );
+		OrderItem oi2 = new OrderItem();
+		oi2.setAcademicYear( 2000 );
+		oi2.setDayName( "Tuesday" );
+		oi2.setSchoolId( "Supelec" );
+		oi2.setOrder( o );
+		oi2.setDayNo( 30 );
+		s.persist( oi2 );
+		s.flush();
+		s.clear();
+
+		OrderID oid = new OrderID();
+		oid.setAcademicYear( 2000 );
+		oid.setSchoolId( "Supelec" );
+		o = (Order) s.get( Order.class, oid );
+		assertEquals( 30, o.getItemList().get( 0 ).getDayNo().intValue() );
+
+		s.getTransaction().rollback();
+		s.close();
+	}
+
+	protected Class[] getMappings() {
+		return new Class[] {
+				Order.class,
+				OrderItem.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/OrderID.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/OrderID.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/OrderID.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,31 @@
+//$Id: OrderID.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetomany;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class OrderID implements Serializable {
+	private String schoolId;
+	private Integer academicYear;
+
+	@Column( name = "Academic_Yr" )
+	public Integer getAcademicYear() {
+		return this.academicYear;
+	}
+
+	public void setAcademicYear(Integer academicYear) {
+		this.academicYear = academicYear;
+	}
+
+	@Column( name = "School_Id" )
+	public String getSchoolId() {
+		return this.schoolId;
+	}
+
+	public void setSchoolId(String schoolId) {
+		this.schoolId = schoolId;
+	}
+}
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/OrderItem.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/OrderItem.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/OrderItem.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,73 @@
+//$Id: OrderItem.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetomany;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+ at Entity
+ at Table( name = "OrderItem_tbl" )
+ at IdClass( OrderItemID.class )
+public class OrderItem {
+	String schoolId;
+	Integer academicYear;
+	Integer dayNo;
+	String dayName;
+	private Order order;
+
+	@Id
+	public Integer getDayNo() {
+		return dayNo;
+	}
+
+	public void setDayNo(Integer dayNo) {
+		this.dayNo = dayNo;
+	}
+
+	@Id
+	public String getSchoolId() {
+		return schoolId;
+	}
+
+	public void setSchoolId(String schoolId) {
+		this.schoolId = schoolId;
+	}
+
+	@Id
+	public Integer getAcademicYear() {
+		return academicYear;
+	}
+
+	public void setAcademicYear(Integer academicYear) {
+		this.academicYear = academicYear;
+	}
+
+	@Column( name = "Day_Name" )
+	public String getDayName() {
+		return dayName;
+	}
+
+	public void setDayName(String dayName) {
+		this.dayName = dayName;
+	}
+
+	@ManyToOne( fetch = FetchType.LAZY )
+	@JoinColumns( {
+	@JoinColumn( name = "School_Id", referencedColumnName = "School_Id", insertable = false, updatable = false ),
+	@JoinColumn( name = "Academic_Yr", referencedColumnName = "Academic_Yr", insertable = false, updatable = false )
+			} )
+	public Order getOrder() {
+		return this.order;
+	}
+
+	public void setOrder(Order order) {
+		this.order = order;
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/OrderItemID.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/OrderItemID.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/OrderItemID.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,41 @@
+//$Id: OrderItemID.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetomany;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class OrderItemID implements Serializable {
+	String schoolId;
+	Integer academicYear;
+	Integer dayNo;
+
+	@Column( name = "Academic_Yr" )
+	public Integer getAcademicYear() {
+		return this.academicYear;
+	}
+
+	public void setAcademicYear(Integer academicYear) {
+		this.academicYear = academicYear;
+	}
+
+	@Column( name = "Day_No" )
+	public Integer getDayNo() {
+		return this.dayNo;
+	}
+
+	public void setDayNo(Integer dayNo) {
+		this.dayNo = dayNo;
+	}
+
+	@Column( name = "School_Id" )
+	public String getSchoolId() {
+		return this.schoolId;
+	}
+
+	public void setSchoolId(String schoolId) {
+		this.schoolId = schoolId;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Organisation.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Organisation.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Organisation.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,60 @@
+//$Id: Organisation.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetomany;
+
+import java.io.Serializable;
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+import javax.persistence.Column;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.OrderBy;
+import javax.persistence.CascadeType;
+import javax.persistence.FetchType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table( name = "ORGANISATION" )
+public class Organisation implements Serializable {
+
+	private Long idOrganisation;
+	private String name;
+	private Set<OrganisationUser> organisationUsers;
+
+	public Organisation() {
+	}
+
+	public void setIdOrganisation(Long idOrganisation) {
+		this.idOrganisation = idOrganisation;
+	}
+
+	@Id
+	@Column( name = "id_organisation", nullable = false )
+	public Long getIdOrganisation() {
+		return idOrganisation;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	@Column( name = "name", nullable = false, length = 40 )
+	public String getName() {
+		return name;
+	}
+
+	public void setOrganisationUsers(Set<OrganisationUser> organisationUsers) {
+		this.organisationUsers = organisationUsers;
+	}
+
+	@OneToMany( mappedBy = "organisation",
+			fetch = FetchType.LAZY,
+			cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
+	@OrderBy( value = "firstName" )
+	public Set<OrganisationUser> getOrganisationUsers() {
+		return organisationUsers;
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/OrganisationUser.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/OrganisationUser.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/OrganisationUser.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,46 @@
+//$Id: OrganisationUser.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetomany;
+
+import java.io.Serializable;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.PrimaryKeyJoinColumn;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at PrimaryKeyJoinColumn( name = "id_organisation_user" )
+ at Table( name = "ORGANISATION_USER" )
+public class OrganisationUser extends Person implements Serializable {
+
+	private String someText;
+	private Organisation organisation;
+
+	public OrganisationUser() {
+	}
+
+	public void setSomeText(String someText) {
+		this.someText = someText;
+	}
+
+	@Column( name = "some_text", nullable=true,length=1024)
+	public String getSomeText() {
+		return someText;
+	}
+
+	public void setOrganisation(Organisation organisation) {
+		this.organisation = organisation;
+	}
+
+	@ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
+	@JoinColumn( name = "fk_id_organisation", nullable = false )
+	public Organisation getOrganisation() {
+		return organisation;
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Parent.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Parent.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Parent.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,50 @@
+//$Id: Parent.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetomany;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+import org.hibernate.annotations.BatchSize;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Parent implements Serializable {
+	@Id
+	public ParentPk id;
+	public int age;
+
+	@OneToMany(cascade = CascadeType.ALL, mappedBy = "parent")
+	@BatchSize(size = 5)
+	@javax.persistence.OrderBy("favoriteSuperhero asc, favoriteSinger desc")
+	public Set<Child> children;
+
+	public int hashCode() {
+		//a NPE can occurs, but I don't expect hashcode to be used before pk is set
+		return id.hashCode();
+	}
+
+	public boolean equals(Object obj) {
+		//a NPE can occurs, but I don't expect equals to be used before pk is set
+		if ( obj != null && obj instanceof Parent ) {
+			return id.equals( ( (Parent) obj ).id );
+		}
+		else {
+			return false;
+		}
+	}
+
+	public void addChild(Child child) {
+		if ( children == null ) {
+			children = new HashSet();
+		}
+		child.parent = this;
+		children.add( child );
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/ParentPk.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/ParentPk.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/ParentPk.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,38 @@
+//$Id: ParentPk.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetomany;
+
+import java.io.Serializable;
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class ParentPk implements Serializable {
+	String firstName;
+	String lastName;
+
+	/**
+	 * is a male or a female
+	 */
+	//show hetereogenous PK types
+	boolean isMale;
+
+	public int hashCode() {
+		//this implem sucks
+		return firstName.hashCode() + lastName.hashCode() + ( isMale ? 0 : 1 );
+	}
+
+	public boolean equals(Object obj) {
+		//firstName and lastName are expected to be set in this implem
+		if ( obj != null && obj instanceof ParentPk ) {
+			ParentPk other = (ParentPk) obj;
+			return firstName.equals( other.firstName )
+					&& lastName.equals( other.lastName )
+					&& isMale == other.isMale;
+		}
+		else {
+			return false;
+		}
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Person.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Person.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Person.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,55 @@
+//$Id: Person.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetomany;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Id;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+import javax.persistence.InheritanceType;
+import javax.persistence.Inheritance;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Inheritance( strategy = InheritanceType.JOINED )
+ at Table( name = "PERSON_Orderby" )
+public class Person implements Serializable {
+
+	private Long idPerson;
+	private String firstName, lastName;
+
+	public Person() {
+	}
+
+	public void setIdPerson(Long idPerson) {
+		this.idPerson = idPerson;
+	}
+
+	@Id
+	@Column( name = "id_person", nullable = false )
+	public Long getIdPerson() {
+		return idPerson;
+	}
+
+	public void setFirstName(String firstName) {
+		this.firstName = firstName;
+	}
+
+	@Column( name = "first_name", length = 40, nullable = false )
+	public String getFirstName() {
+		return firstName;
+	}
+
+	public void setLastName(String lastName) {
+		this.lastName = lastName;
+	}
+
+	@Column( name = "last_name", length = 40, nullable = false )
+	public String getLastName() {
+		return lastName;
+	}
+
+}
+

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/PoliticalParty.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/PoliticalParty.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/PoliticalParty.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,43 @@
+//$Id: PoliticalParty.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetomany;
+
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class PoliticalParty {
+	private String name;
+	private Set<Politician> politicians = new HashSet<Politician>();
+
+	@Id
+	@Column(columnDefinition = "VARCHAR(60)")
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	@OneToMany(mappedBy = "party", cascade = CascadeType.ALL)
+	public Set<Politician> getPoliticians() {
+		return politicians;
+	}
+
+	public void setPoliticians(Set<Politician> politicians) {
+		this.politicians = politicians;
+	}
+
+	public void addPolitician(Politician politician) {
+		politicians.add( politician );
+		politician.setParty( this );
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Politician.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Politician.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Politician.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,37 @@
+//$Id: Politician.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetomany;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Politician {
+	private String name;
+	private PoliticalParty party;
+
+	@Id
+	@Column(columnDefinition = "VARCHAR(30)")
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	@ManyToOne
+	@JoinColumn(name = "party_fk")
+	public PoliticalParty getParty() {
+		return party;
+	}
+
+	public void setParty(PoliticalParty party) {
+		this.party = party;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Soldier.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Soldier.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Soldier.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,62 @@
+//$Id: Soldier.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetomany;
+
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Soldier {
+	private Integer id;
+	private String name;
+	private Troop troop;
+
+	@Id
+	@GeneratedValue
+	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;
+	}
+
+	@ManyToOne(fetch = FetchType.EAGER)
+	@JoinColumn(name = "troop_fk")
+	public Troop getTroop() {
+		return troop;
+	}
+
+	public void setTroop(Troop troop) {
+		this.troop = troop;
+	}
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( !( o instanceof Soldier ) ) return false;
+
+		final Soldier soldier = (Soldier) o;
+
+		if ( !name.equals( soldier.name ) ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		return name.hashCode();
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Street.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Street.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Street.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,58 @@
+//$Id: Street.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetomany;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+import javax.persistence.Column;
+
+import org.hibernate.annotations.Formula;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Street {
+	private Integer id;
+	private String streetName;
+	private String streetNameCopy;
+	private City city;
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	@Column(name="STREET_NAME")
+	public String getStreetName() {
+		return streetName;
+	}
+
+	public void setStreetName(String streetName) {
+		this.streetName = streetName;
+	}
+
+	@Formula("STREET_NAME")
+	public String getStreetNameCopy() {
+		return streetNameCopy;
+	}
+
+	public void setStreetNameCopy(String streetNameCopy) {
+		this.streetNameCopy = streetNameCopy;
+	}
+
+	@ManyToOne
+	public City getCity() {
+		return city;
+	}
+
+	public void setCity(City city) {
+		this.city = city;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Tiger.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Tiger.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Tiger.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,33 @@
+//$Id: Tiger.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetomany;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Tiger {
+	private Integer id;
+	private String name;
+
+	@Id
+	@GeneratedValue
+	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;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Trainer.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Trainer.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Trainer.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,67 @@
+//$Id: Trainer.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetomany;
+
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.OneToMany;
+
+import org.hibernate.annotations.ForeignKey;
+
+/**
+ * Unidirectional one to many sample
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity()
+public class Trainer {
+	private Integer id;
+	private String name;
+	private Set<Tiger> trainedTigers;
+	private Set<Monkey> trainedMonkeys;
+
+	@Id
+	@GeneratedValue
+	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;
+	}
+
+	@OneToMany
+	public Set<Tiger> getTrainedTigers() {
+		return trainedTigers;
+	}
+
+	public void setTrainedTigers(Set<Tiger> trainedTigers) {
+		this.trainedTigers = trainedTigers;
+	}
+
+	@OneToMany
+	@JoinTable(
+			name = "TrainedMonkeys",
+			joinColumns = {@JoinColumn(name = "trainer_id")},
+			inverseJoinColumns = @JoinColumn(name = "monkey_id")
+	)
+	@ForeignKey(name = "TM_TRA_FK", inverseName = "TM_MON_FK")
+	public Set<Monkey> getTrainedMonkeys() {
+		return trainedMonkeys;
+	}
+
+	public void setTrainedMonkeys(Set<Monkey> trainedMonkeys) {
+		this.trainedMonkeys = trainedMonkeys;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Troop.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Troop.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetomany/Troop.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,64 @@
+//$Id: Troop.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetomany;
+
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+import org.hibernate.annotations.OnDelete;
+import org.hibernate.annotations.OnDeleteAction;
+import org.hibernate.annotations.OrderBy;
+
+/**
+ * Shows a default one to many
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Troop {
+	private Integer id;
+	private String name;
+	private Set<Soldier> soldiers;
+
+	@OneToMany(mappedBy = "troop", cascade = {CascadeType.ALL}, fetch = FetchType.LAZY)
+	@OrderBy(clause = "name desc")
+	@org.hibernate.annotations.Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
+	@OnDelete(action = OnDeleteAction.CASCADE)
+	public Set<Soldier> getSoldiers() {
+		return soldiers;
+	}
+
+	public void setSoldiers(Set<Soldier> soldiers) {
+		this.soldiers = soldiers;
+	}
+
+	@Id
+	@GeneratedValue
+	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 void addSoldier(Soldier s) {
+		if ( soldiers == null ) soldiers = new HashSet<Soldier>();
+		soldiers.add( s );
+		s.setTroop( this );
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/Address.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/Address.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/Address.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,34 @@
+//$Id: Address.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetoone;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Address {
+
+	private Integer id;
+	private String city;
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getCity() {
+		return city;
+	}
+
+	public void setCity(String city) {
+		this.city = city;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/Body.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/Body.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/Body.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,35 @@
+//$Id: Body.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetoone;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToOne;
+import javax.persistence.PrimaryKeyJoinColumn;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Body {
+	private Integer id;
+	private Heart heart;
+
+	@OneToOne
+	@PrimaryKeyJoinColumn
+	public Heart getHeart() {
+		return heart;
+	}
+
+	public void setHeart(Heart heart) {
+		this.heart = heart;
+	}
+
+	@Id
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/Client.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/Client.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/Client.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,49 @@
+//$Id: Client.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetoone;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Client {
+
+	private Integer id;
+	private String name;
+	private Address address;
+
+	@OneToOne(cascade = CascadeType.ALL)
+	@JoinColumn(name = "ADDRESS_ID")
+	public Address getAddress() {
+		return address;
+	}
+
+	public void setAddress(Address address) {
+		this.address = address;
+	}
+
+	@Id
+	@GeneratedValue
+	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;
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/Computer.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/Computer.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/Computer.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,73 @@
+//$Id: Computer.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetoone;
+
+import javax.persistence.AttributeOverride;
+import javax.persistence.AttributeOverrides;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
+import javax.persistence.OneToOne;
+
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Computer {
+
+	private ComputerPk id;
+	private String cpu;
+	private SerialNumber serial;
+
+	@OneToOne(cascade = {CascadeType.PERSIST})
+	@JoinColumns({
+	@JoinColumn(name = "serialbrand", referencedColumnName = "brand"),
+	@JoinColumn(name = "serialmodel", referencedColumnName = "model")
+			})
+	public SerialNumber getSerial() {
+		return serial;
+	}
+
+	public void setSerial(SerialNumber serial) {
+		this.serial = serial;
+	}
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( !( o instanceof Computer ) ) return false;
+
+		final Computer computer = (Computer) o;
+
+		if ( !id.equals( computer.id ) ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		return id.hashCode();
+	}
+
+	@EmbeddedId
+	@AttributeOverrides({
+	@AttributeOverride(name = "brand", column = @Column(name = "computer_brand")),
+	@AttributeOverride(name = "model", column = @Column(name = "computer_model"))
+			})
+	public ComputerPk getId() {
+		return id;
+	}
+
+	public void setId(ComputerPk id) {
+		this.id = id;
+	}
+
+	public String getCpu() {
+		return cpu;
+	}
+
+	public void setCpu(String cpu) {
+		this.cpu = cpu;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/ComputerPk.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/ComputerPk.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/ComputerPk.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,49 @@
+//$Id: ComputerPk.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetoone;
+
+import java.io.Serializable;
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class ComputerPk implements Serializable {
+	private String brand;
+	private String model;
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( !( o instanceof ComputerPk ) ) return false;
+
+		final ComputerPk computerPk = (ComputerPk) o;
+
+		if ( !brand.equals( computerPk.brand ) ) return false;
+		if ( !model.equals( computerPk.model ) ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		int result;
+		result = brand.hashCode();
+		result = 29 * result + model.hashCode();
+		return result;
+	}
+
+	public String getBrand() {
+		return brand;
+	}
+
+	public void setBrand(String brand) {
+		this.brand = brand;
+	}
+
+	public String getModel() {
+		return model;
+	}
+
+	public void setModel(String model) {
+		this.model = model;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/Heart.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/Heart.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/Heart.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,22 @@
+//$Id: Heart.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetoone;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Heart {
+	private Integer id;
+
+	@Id
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/OneToOneErrorTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/OneToOneErrorTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/OneToOneErrorTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,27 @@
+//$Id: OneToOneErrorTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetoone;
+
+import org.hibernate.cfg.AnnotationConfiguration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.test.annotations.IncorrectEntity;
+import org.hibernate.SessionFactory;
+import org.hibernate.AnnotationException;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class OneToOneErrorTest extends junit.framework.TestCase {
+	public void testWrongOneToOne() throws Exception {
+		AnnotationConfiguration cfg = new AnnotationConfiguration();
+		cfg.addAnnotatedClass( Show.class )
+				.addAnnotatedClass( ShowDescription.class );
+		cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
+		try {
+			SessionFactory sf = cfg.buildSessionFactory();
+			fail( "Wrong mappedBy does not fail property" );
+		}
+		catch (AnnotationException e) {
+			//success
+		}
+	}
+}
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/OneToOneTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/OneToOneTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/OneToOneTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,268 @@
+//$Id: OneToOneTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetoone;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.Customer;
+import org.hibernate.test.annotations.Discount;
+import org.hibernate.test.annotations.Passport;
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.test.annotations.Ticket;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class OneToOneTest extends TestCase {
+
+	public OneToOneTest(String x) {
+		super( x );
+	}
+
+	public void testEagerFetching() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Client c = new Client();
+		c.setName( "Emmanuel" );
+		Address a = new Address();
+		a.setCity( "Courbevoie" );
+		c.setAddress( a );
+		s.persist( c );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		Query q = s.createQuery( "select c from Client c where c.name = :name" );
+		q.setString( "name", c.getName() );
+		c = (Client) q.uniqueResult();
+		//c = (Client) s.get(Client.class, c.getId());
+		assertNotNull( c );
+		tx.commit();
+		s.close();
+		assertNotNull( c.getAddress() );
+		//assertTrue( "Should be eager fetched", Hibernate.isInitialized( c.getAddress() ) );
+
+	}
+
+	public void testDefaultOneToOne() throws Exception {
+		//test a default one to one and a mappedBy in the other side
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Customer c = new Customer();
+		c.setName( "Hibernatus" );
+		Passport p = new Passport();
+		p.setNumber( "123456789" );
+		s.persist( c ); //we need the id to assigned it to passport
+		c.setPassport( p );
+		p.setOwner( c );
+		p.setId( c.getId() );
+		tx.commit();
+		s.close();
+		s = openSession();
+		tx = s.beginTransaction();
+		c = (Customer) s.get( Customer.class, c.getId() );
+		assertNotNull( c );
+		p = c.getPassport();
+		assertNotNull( p );
+		assertEquals( "123456789", p.getNumber() );
+		assertNotNull( p.getOwner() );
+		assertEquals( "Hibernatus", p.getOwner().getName() );
+		tx.commit(); // commit or rollback is the same, we don't care for read queries
+		s.close();
+	}
+
+	public void testOneToOneWithExplicitFk() throws Exception {
+		Client c = new Client();
+		Address a = new Address();
+		a.setCity( "Paris" );
+		c.setName( "Emmanuel" );
+		c.setAddress( a );
+
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		s.persist( c );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		c = (Client) s.get( Client.class, c.getId() );
+		assertNotNull( c );
+		assertNotNull( c.getAddress() );
+		assertEquals( "Paris", c.getAddress().getCity() );
+		tx.commit();
+		s.close();
+	}
+
+	public void testUnidirectionalTrueOneToOne() throws Exception {
+		Body b = new Body();
+		Heart h = new Heart();
+		b.setHeart( h );
+		b.setId( new Integer( 1 ) );
+		h.setId( b.getId() ); //same PK
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		s.persist( h );
+		s.persist( b );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		b = (Body) s.get( Body.class, b.getId() );
+		assertNotNull( b );
+		assertNotNull( b.getHeart() );
+		assertEquals( h.getId(), b.getHeart().getId() );
+		tx.commit();
+		s.close();
+
+	}
+
+	public void testCompositePk() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		ComputerPk cid = new ComputerPk();
+		cid.setBrand( "IBM" );
+		cid.setModel( "ThinkPad" );
+		Computer c = new Computer();
+		c.setId( cid );
+		c.setCpu( "2 GHz" );
+		SerialNumberPk sid = new SerialNumberPk();
+		sid.setBrand( cid.getBrand() );
+		sid.setModel( cid.getModel() );
+		SerialNumber sn = new SerialNumber();
+		sn.setId( sid );
+		sn.setValue( "REZREZ23424" );
+		c.setSerial( sn );
+		s.persist( c );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		c = (Computer) s.get( Computer.class, cid );
+		assertNotNull( c );
+		assertNotNull( c.getSerial() );
+		assertEquals( sn.getValue(), c.getSerial().getValue() );
+		tx.commit();
+		s.close();
+	}
+
+	public void testBidirectionalTrueOneToOne() throws Exception {
+		Session s = openSession();
+		s.getTransaction().begin();
+		Party party = new Party();
+		PartyAffiliate affiliate = new PartyAffiliate();
+		affiliate.partyId = "id";
+		party.partyId = "id";
+		party.partyAffiliate = affiliate;
+		affiliate.party = party;
+		s.persist( party );
+		s.persist( affiliate );
+		s.getTransaction().commit();
+
+		s.clear();
+
+		Transaction tx = s.beginTransaction();
+		affiliate = (PartyAffiliate) s.get( PartyAffiliate.class, "id" );
+		assertNotNull( affiliate.party );
+		assertEquals( affiliate.partyId, affiliate.party.partyId );
+
+		s.clear();
+
+		party = (Party) s.get( Party.class, "id" );
+		assertNotNull( party.partyAffiliate );
+		assertEquals( party.partyId, party.partyAffiliate.partyId );
+
+		s.delete( party );
+		s.delete( party.partyAffiliate );
+		tx.commit();
+		s.close();
+	}
+
+	public void testBidirectionalFkOneToOne() throws Exception {
+		Session s = openSession();
+		s.getTransaction().begin();
+		Trousers trousers = new Trousers();
+		TrousersZip zip = new TrousersZip();
+		trousers.id = new Integer( 1 );
+		zip.id = new Integer( 2 );
+		trousers.zip = zip;
+		zip.trousers = trousers;
+		s.persist( trousers );
+		s.persist( zip );
+		s.getTransaction().commit();
+
+		s.clear();
+
+		Transaction tx = s.beginTransaction();
+		trousers = (Trousers) s.get( Trousers.class, trousers.id );
+		assertNotNull( trousers.zip );
+		assertEquals( zip.id, trousers.zip.id );
+
+		s.clear();
+
+		zip = (TrousersZip) s.get( TrousersZip.class, zip.id );
+		assertNotNull( zip.trousers );
+		assertEquals( trousers.id, zip.trousers.id );
+
+		s.delete( zip );
+		s.delete( zip.trousers );
+		tx.commit();
+		s.close();
+	}
+
+	public void testForeignGenerator() {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Owner owner = new Owner();
+		OwnerAddress address = new OwnerAddress();
+		owner.setAddress( address );
+		address.setOwner( owner );
+		s.persist( owner );
+		s.flush();
+		s.clear();
+		owner = (Owner) s.get( Owner.class, owner.getId() );
+		assertNotNull( owner );
+		assertNotNull( owner.getAddress() );
+		assertEquals( owner.getId(), owner.getAddress().getId() );
+		tx.rollback();
+		s.close();
+	}
+
+	/**
+	 * @see org.hibernate.test.annotations.TestCase#getMappings()
+	 */
+	protected Class[] getMappings() {
+		return new Class[]{
+				PartyAffiliate.class,
+				Party.class,
+				Trousers.class,
+				TrousersZip.class,
+				Customer.class,
+				Ticket.class,
+				Discount.class,
+				Passport.class,
+				Client.class,
+				Address.class,
+				Computer.class,
+				SerialNumber.class,
+				Body.class,
+				Heart.class,
+				Owner.class,
+				OwnerAddress.class
+		};
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/Owner.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/Owner.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/Owner.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,35 @@
+//$Id: Owner.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetoone;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.OneToOne;
+import javax.persistence.PrimaryKeyJoinColumn;
+import javax.persistence.CascadeType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Owner {
+	@Id @GeneratedValue private Integer id;
+
+	@OneToOne(cascade = CascadeType.ALL) @PrimaryKeyJoinColumn private OwnerAddress address;
+
+	public OwnerAddress getAddress() {
+		return address;
+	}
+
+	public void setAddress(OwnerAddress address) {
+		this.address = address;
+	}
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/OwnerAddress.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/OwnerAddress.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/OwnerAddress.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,39 @@
+//$Id: OwnerAddress.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetoone;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.OneToOne;
+
+import org.hibernate.annotations.GenericGenerator;
+import org.hibernate.annotations.Parameter;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class OwnerAddress {
+	@Id @GeneratedValue(generator = "fk")
+	@GenericGenerator(strategy = "foreign", name = "fk", parameters = @Parameter(name="property", value="owner"))
+	private Integer id;
+
+	@OneToOne(mappedBy="address", optional = false)
+	private Owner owner;
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public Owner getOwner() {
+		return owner;
+	}
+
+	public void setOwner(Owner owner) {
+		this.owner = owner;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/Party.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/Party.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/Party.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,20 @@
+//$Id: Party.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetoone;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToOne;
+import javax.persistence.PrimaryKeyJoinColumn;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Party {
+	@Id
+	String partyId;
+
+	@OneToOne
+	@PrimaryKeyJoinColumn
+	PartyAffiliate partyAffiliate;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/PartyAffiliate.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/PartyAffiliate.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/PartyAffiliate.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,21 @@
+//$Id: PartyAffiliate.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetoone;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToOne;
+import javax.persistence.PrimaryKeyJoinColumn;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class PartyAffiliate {
+	@Id
+	String partyId;
+
+	@OneToOne(mappedBy="partyAffiliate")
+	Party party;
+
+	String affiliateName;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/SerialNumber.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/SerialNumber.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/SerialNumber.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,46 @@
+//$Id: SerialNumber.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetoone;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class SerialNumber {
+	private SerialNumberPk id;
+	private String value;
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( !( o instanceof SerialNumber ) ) return false;
+
+		final SerialNumber serialNumber = (SerialNumber) o;
+
+		if ( !id.equals( serialNumber.id ) ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		return id.hashCode();
+	}
+
+	@Id
+	public SerialNumberPk getId() {
+		return id;
+	}
+
+	public void setId(SerialNumberPk id) {
+		this.id = id;
+	}
+
+	public String getValue() {
+		return value;
+	}
+
+	public void setValue(String value) {
+		this.value = value;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/SerialNumberPk.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/SerialNumberPk.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/SerialNumberPk.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,49 @@
+//$Id: SerialNumberPk.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetoone;
+
+import java.io.Serializable;
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class SerialNumberPk implements Serializable {
+	private String brand;
+	private String model;
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( !( o instanceof SerialNumberPk ) ) return false;
+
+		final SerialNumberPk serialNumberPk = (SerialNumberPk) o;
+
+		if ( !brand.equals( serialNumberPk.brand ) ) return false;
+		if ( !model.equals( serialNumberPk.model ) ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		int result;
+		result = brand.hashCode();
+		result = 13 * result + model.hashCode();
+		return result;
+	}
+
+	public String getBrand() {
+		return brand;
+	}
+
+	public void setBrand(String brand) {
+		this.brand = brand;
+	}
+
+	public String getModel() {
+		return model;
+	}
+
+	public void setModel(String model) {
+		this.model = model;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/Show.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/Show.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/Show.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,33 @@
+//$Id: Show.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetoone;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Show {
+	@Id
+	private Integer id;
+	@OneToOne() private ShowDescription description;
+
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public ShowDescription getDescription() {
+		return description;
+	}
+
+	public void setDescription(ShowDescription description) {
+		this.description = description;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/ShowDescription.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/ShowDescription.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/ShowDescription.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,34 @@
+//$Id: ShowDescription.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetoone;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class ShowDescription {
+	@Id
+	private Integer id;
+	@OneToOne(mappedBy = "wrongProperty")
+	private Show show;
+
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public Show getShow() {
+		return show;
+	}
+
+	public void setShow(Show show) {
+		this.show = show;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/Trousers.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/Trousers.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/Trousers.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,21 @@
+//$Id: Trousers.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetoone;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Trousers {
+	@Id
+	public Integer id;
+
+	@OneToOne
+	@JoinColumn(name = "zip_id")
+	public TrousersZip zip;
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/TrousersZip.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/TrousersZip.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/TrousersZip.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,17 @@
+//$Id: TrousersZip.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetoone;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class TrousersZip {
+	@Id
+	public Integer id;
+	@OneToOne(mappedBy = "zip")
+	public Trousers trousers;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/primarykey/Address.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/primarykey/Address.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/primarykey/Address.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,33 @@
+//$Id: A320.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetoone.primarykey;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToOne;
+
+ at Entity
+public class Address {
+
+	@Id
+	private long id;
+
+	@OneToOne(mappedBy = "address")
+	private Person person;
+
+	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;
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/primarykey/NullablePrimaryKeyTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/primarykey/NullablePrimaryKeyTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/primarykey/NullablePrimaryKeyTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,39 @@
+//$Id: A320.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetoone.primarykey;
+
+import junit.framework.TestCase;
+
+import org.hibernate.cfg.AnnotationConfiguration;
+import org.hibernate.dialect.SQLServerDialect;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Test harness for ANN-742.
+ * 
+ * @author Hardy Ferentschik
+ * 
+ */
+public class NullablePrimaryKeyTest extends TestCase {
+
+	private Logger log = LoggerFactory.getLogger(NullablePrimaryKeyTest.class);
+
+	public void testGeneratedSql() {
+		try {
+			AnnotationConfiguration config = new AnnotationConfiguration();
+			config.addAnnotatedClass(Address.class);
+			config.addAnnotatedClass(Person.class);
+			config.buildSessionFactory();
+			String[] schema = config
+					.generateSchemaCreationScript(new SQLServerDialect());
+			for (String s : schema) {
+				log.debug(s);
+			}
+			String expectedMappingTableSql = "create table personAddress (address_id numeric(19,0) null, " +
+					"person_id numeric(19,0) not null, primary key (person_id))";
+			assertEquals("Wrong SQL", expectedMappingTableSql, schema[2]);
+		} catch (Exception e) {
+			fail(e.getMessage());
+		}
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/primarykey/Person.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/primarykey/Person.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/onetoone/primarykey/Person.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,39 @@
+//$Id: A320.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.onetoone.primarykey;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.OneToOne;
+
+ at Entity
+public class Person {
+
+	@Id
+	private long id;
+
+	@OneToOne
+	@JoinTable(
+			name = "personAddress",
+			joinColumns = @JoinColumn(name = "person_id"),
+			inverseJoinColumns = @JoinColumn(name = "address_id")
+			)
+	private Address address;
+
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	public Address getAddress() {
+		return address;
+	}
+
+	public void setAddress(Address address) {
+		this.address = address;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/orm.xml
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/orm.xml	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/orm.xml	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
+                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                 version="1.0"
+        >
+    <sequence-generator name="SEQ_GEN" sequence-name="my_sequence"/>
+    <table-generator name="EMP_GEN" table="GENERATOR_TABLE"
+                     pk-column-name="pkey" pk-column-value="EMP"
+                     value-column-name="hi" allocation-size="20"/>
+</entity-mappings>
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/override/AssociationOverrideTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/override/AssociationOverrideTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/override/AssociationOverrideTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,47 @@
+//$Id: AssociationOverrideTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.override;
+
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class AssociationOverrideTest extends TestCase {
+
+	public void testOverriding() throws Exception {
+		Location paris = new Location();
+		paris.setName( "Paris" );
+		Location atlanta = new Location();
+		atlanta.setName( "Atlanta" );
+		Trip trip = new Trip();
+		trip.setFrom( paris );
+		//trip.setTo( atlanta );
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		s.persist( paris );
+		s.persist( atlanta );
+		try {
+			s.persist( trip );
+			s.flush();
+			fail( "Should be non nullable" );
+		}
+		catch (HibernateException e) {
+			//success
+		}
+		finally {
+			tx.rollback();
+			s.close();
+		}
+	}
+
+	protected Class[] getMappings() {
+		return new Class[]{
+				Location.class,
+				Move.class,
+				Trip.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/override/Location.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/override/Location.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/override/Location.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,22 @@
+//$Id: Location.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.override;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Location {
+	private String name;
+
+	@Id
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/override/Move.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/override/Move.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/override/Move.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,47 @@
+//$Id: Move.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.override;
+
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.MappedSuperclass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MappedSuperclass
+public class Move {
+	private int id;
+	private Location from;
+	private Location to;
+
+	@ManyToOne
+	public Location getFrom() {
+		return from;
+	}
+
+	public void setFrom(Location from) {
+		this.from = from;
+	}
+
+	@Id
+	@GeneratedValue
+	public int getId() {
+		return id;
+	}
+
+	public void setId(int id) {
+		this.id = id;
+	}
+
+	@ManyToOne
+	@JoinColumn(name = "to", nullable = true)
+	public Location getTo() {
+		return to;
+	}
+
+	public void setTo(Location to) {
+		this.to = to;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/override/Trip.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/override/Trip.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/override/Trip.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,18 @@
+//$Id: Trip.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.override;
+
+import javax.persistence.AssociationOverride;
+import javax.persistence.AssociationOverrides;
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at AssociationOverrides({
+ at AssociationOverride(name = "from", joinColumns = @JoinColumn(name = "from2", nullable = false)),
+ at AssociationOverride(name = "to", joinColumns = @JoinColumn(name = "to2", nullable = false))
+		})
+public class Trip extends Move {
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/persister/Card.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/persister/Card.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/persister/Card.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,21 @@
+package org.hibernate.test.annotations.persister;
+
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Shawn Clowater
+ */
+ at Entity
+ at org.hibernate.annotations.Entity( persister = "org.hibernate.persister.entity.SingleTableEntityPersister" )
+public class Card implements Serializable {
+	@Id
+	public Integer id;
+
+	@ManyToOne()
+	@JoinColumn()
+	public Deck deck;
+}
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/persister/CollectionPersister.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/persister/CollectionPersister.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/persister/CollectionPersister.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,19 @@
+package org.hibernate.test.annotations.persister;
+
+import org.hibernate.MappingException;
+import org.hibernate.cache.CacheException;
+import org.hibernate.cache.access.CollectionRegionAccessStrategy;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.engine.SessionFactoryImplementor;
+import org.hibernate.mapping.Collection;
+import org.hibernate.persister.collection.OneToManyPersister;
+
+/**
+ * @author Shawn Clowater
+ */
+public class CollectionPersister extends OneToManyPersister {
+	public CollectionPersister(Collection collection, CollectionRegionAccessStrategy cache, Configuration cfg,
+							   SessionFactoryImplementor factory) throws MappingException, CacheException {
+		super( collection, cache, cfg, factory );
+	}
+}
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/persister/Deck.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/persister/Deck.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/persister/Deck.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,25 @@
+package org.hibernate.test.annotations.persister;
+
+import java.io.Serializable;
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+import org.hibernate.annotations.Persister;
+
+
+/**
+ * @author Shawn Clowater
+ */
+ at Entity
+ at org.hibernate.annotations.Entity( persister = "org.hibernate.persister.entity.SingleTableEntityPersister" )
+ at Persister( impl = org.hibernate.test.annotations.persister.EntityPersister.class )
+public class Deck implements Serializable {
+	@Id
+	public Integer id;
+
+	@OneToMany( mappedBy = "deck" )
+	@Persister( impl = org.hibernate.test.annotations.persister.CollectionPersister.class )
+	public Set<Card> cards;
+}
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/persister/EntityPersister.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/persister/EntityPersister.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/persister/EntityPersister.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,19 @@
+package org.hibernate.test.annotations.persister;
+
+import org.hibernate.HibernateException;
+import org.hibernate.cache.CacheConcurrencyStrategy;
+import org.hibernate.cache.access.EntityRegionAccessStrategy;
+import org.hibernate.engine.Mapping;
+import org.hibernate.engine.SessionFactoryImplementor;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.persister.entity.SingleTableEntityPersister;
+
+/**
+ * @author Shawn Clowater
+ */
+public class EntityPersister extends SingleTableEntityPersister {
+	public EntityPersister(PersistentClass persistentClass, EntityRegionAccessStrategy cache,
+						   SessionFactoryImplementor factory, Mapping cfg) throws HibernateException {
+		super( persistentClass, cache, factory, cfg );
+	}
+}
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/persister/PersisterTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/persister/PersisterTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/persister/PersisterTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,47 @@
+package org.hibernate.test.annotations.persister;
+
+import org.hibernate.mapping.Collection;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.persister.entity.SingleTableEntityPersister;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Shawn Clowater
+ */
+public class PersisterTest extends TestCase {
+	public PersisterTest(String x) {
+		super( x );
+	}
+
+	public void testEntityEntityPersisterAndPersisterSpecified() throws Exception {
+		//checks to see that the persister specified with the @Persister annotation takes precedence if a @Entity.persister() is also specified		
+		PersistentClass persistentClass = (PersistentClass) getCfg().getClassMapping( Deck.class.getName() );
+		assertEquals( "Incorrect Persister class for " + persistentClass.getMappedClass(), EntityPersister.class,
+				persistentClass.getEntityPersisterClass() );
+	}
+
+	public void testEntityEntityPersisterSpecified() throws Exception {
+		//tests the persister specified with an @Entity.persister()		
+		PersistentClass persistentClass = (PersistentClass) getCfg().getClassMapping( Card.class.getName() );
+		assertEquals( "Incorrect Persister class for " + persistentClass.getMappedClass(),
+				SingleTableEntityPersister.class, persistentClass.getEntityPersisterClass() );
+	}
+
+	public void testCollectionPersisterSpecified() throws Exception {
+		//tests the persister specified by the @Persister annotation on a collection
+		Collection collection = (Collection) getCfg().getCollectionMapping( Deck.class.getName() + ".cards" );
+		assertEquals( "Incorrect Persister class for collection " + collection.getRole(), CollectionPersister.class,
+				collection.getCollectionPersisterClass() );
+	}
+
+	/**
+	 * @see org.hibernate.test.annotations.TestCase#getMappings()
+	 */
+	protected Class[] getMappings() {
+		return new Class[]{
+				Card.class,
+				Deck.class
+		};
+	}
+
+}
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/polymorphism/Car.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/polymorphism/Car.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/polymorphism/Car.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,39 @@
+//$Id: Car.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.polymorphism;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+
+import org.hibernate.annotations.PolymorphismType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Inheritance(strategy= InheritanceType.TABLE_PER_CLASS)
+ at org.hibernate.annotations.Entity(polymorphism = PolymorphismType.EXPLICIT)
+public class Car extends MovingThing {
+	private Integer id;
+	private String model;
+
+	public String getModel() {
+		return model;
+	}
+
+	public void setModel(String model) {
+		this.model = model;
+	}
+
+	@Id @GeneratedValue(strategy = GenerationType.TABLE )
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/polymorphism/MovingThing.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/polymorphism/MovingThing.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/polymorphism/MovingThing.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,8 @@
+//$Id: MovingThing.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.polymorphism;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class MovingThing {
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/polymorphism/PolymorphismTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/polymorphism/PolymorphismTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/polymorphism/PolymorphismTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,37 @@
+//$Id: PolymorphismTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.polymorphism;
+
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class PolymorphismTest extends TestCase {
+
+	public void testPolymorphism() throws Exception {
+		Car car = new Car();
+		car.setModel( "SUV" );
+		SportCar car2 = new SportCar();
+		car2.setModel( "350Z" );
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		tx.begin();
+		s.persist( car );
+		s.persist( car2 );
+		s.flush();
+		assertEquals( 2, s.createQuery( "select car from Car car").list().size() );
+		assertEquals( 0, s.createQuery( "select count(m) from " + MovingThing.class.getName() + " m").list().size() );
+		tx.rollback();
+		s.close();
+
+	}
+
+	protected Class[] getMappings() {
+		return new Class[] {
+				Car.class,
+				SportCar.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/polymorphism/SportCar.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/polymorphism/SportCar.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/polymorphism/SportCar.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,16 @@
+//$Id: SportCar.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.polymorphism;
+
+import javax.persistence.Entity;
+import javax.persistence.Table;
+
+import org.hibernate.annotations.PolymorphismType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "sport_car")
+ at org.hibernate.annotations.Entity(polymorphism = PolymorphismType.EXPLICIT) //raise a warn
+public class SportCar extends Car {
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/Area.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/Area.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/Area.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,73 @@
+//$Id: Area.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.query;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EntityResult;
+import javax.persistence.FieldResult;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.NamedNativeQueries;
+import javax.persistence.NamedNativeQuery;
+import javax.persistence.SqlResultSetMapping;
+import javax.persistence.SqlResultSetMappings;
+import javax.persistence.Table;
+
+/**
+ * Example of a entity load incl a join fetching of an associated *ToOne entity
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at NamedNativeQueries({
+ at NamedNativeQuery(
+		name = "night&area", query = "select night.id as nid, night.night_duration, night.night_date, area.id as aid, "
+		+ "night.area_id, area.name from Night night, tbl_area area where night.area_id = area.id",
+		resultSetMapping = "joinMapping")
+		})
+ at org.hibernate.annotations.NamedNativeQueries({
+ at org.hibernate.annotations.NamedNativeQuery(
+		name = "night&areaCached",
+		query = "select night.id as nid, night.night_duration, night.night_date, area.id as aid, "
+				+ "night.area_id, area.name from Night night, tbl_area area where night.area_id = area.id",
+		resultSetMapping = "joinMapping")
+		})
+ at SqlResultSetMappings(
+		@SqlResultSetMapping(name = "joinMapping", entities = {
+		@EntityResult(entityClass = org.hibernate.test.annotations.query.Night.class, fields = {
+		@FieldResult(name = "id", column = "nid"),
+		@FieldResult(name = "duration", column = "night_duration"),
+		@FieldResult(name = "date", column = "night_date"),
+		@FieldResult(name = "area", column = "area_id")
+				}),
+		@EntityResult(entityClass = org.hibernate.test.annotations.query.Area.class, fields = {
+		@FieldResult(name = "id", column = "aid"),
+		@FieldResult(name = "name", column = "name")
+				})
+				}
+		)
+)
+ at Table(name = "tbl_area")
+public class Area {
+	private Integer id;
+	private String name;
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	@Column(unique = true)
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/Captain.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/Captain.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/Captain.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,52 @@
+//$Id: Captain.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.query;
+
+import java.io.Serializable;
+import javax.persistence.ColumnResult;
+import javax.persistence.Entity;
+import javax.persistence.EntityResult;
+import javax.persistence.FieldResult;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.SqlResultSetMapping;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at IdClass(Identity.class)
+ at SqlResultSetMapping(name = "compositekey",
+		entities = @EntityResult(entityClass = org.hibernate.test.annotations.query.SpaceShip.class,
+				fields = {
+				@FieldResult(name = "name", column = "name"),
+				@FieldResult(name = "model", column = "model"),
+				@FieldResult(name = "speed", column = "speed"),
+				@FieldResult(name = "dimensions.width", column = "width"),
+				@FieldResult(name = "captain.lastname", column = "lastn"),
+				@FieldResult(name = "dimensions.length", column = "length"),
+				@FieldResult(name = "captain.firstname", column = "firstn")
+						}),
+		columns = {@ColumnResult(name = "surface"),
+		@ColumnResult(name = "volume")})
+public class Captain implements Serializable {
+	private String firstname;
+	private String lastname;
+
+	@Id
+	public String getFirstname() {
+		return firstname;
+	}
+
+	public void setFirstname(String firstname) {
+		this.firstname = firstname;
+	}
+
+	@Id
+	public String getLastname() {
+		return lastname;
+	}
+
+	public void setLastname(String lastname) {
+		this.lastname = lastname;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/CasimirParticle.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/CasimirParticle.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/CasimirParticle.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,25 @@
+//$Id: CasimirParticle.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.query;
+
+import javax.persistence.Entity;
+import javax.persistence.Table;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name="CASIMIR_PARTICULE")
+public class CasimirParticle {
+	@Id
+	private Long id;
+
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/Chaos.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/Chaos.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/Chaos.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,86 @@
+//$Id: Chaos.java 16293 2009-04-10 19:17:45Z gbadner $
+package org.hibernate.test.annotations.query;
+
+import java.util.Set;
+import java.util.HashSet;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.NamedQuery;
+import javax.persistence.NamedNativeQuery;
+import javax.persistence.OneToMany;
+import javax.persistence.JoinColumn;
+import javax.persistence.Column;
+
+import org.hibernate.annotations.SQLInsert;
+import org.hibernate.annotations.SQLUpdate;
+import org.hibernate.annotations.SQLDelete;
+import org.hibernate.annotations.SQLDeleteAll;
+import org.hibernate.annotations.Loader;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name="CHAOS")
+ at SQLInsert( sql="INSERT INTO CHAOS(name, nick_name, chaos_size, id) VALUES(upper(?),?,?,?)")
+ at SQLUpdate( sql="UPDATE CHAOS SET name = upper(?), nick_name = ?, chaos_size = ? WHERE id = ?")
+ at SQLDelete( sql="DELETE CHAOS WHERE id = ?")
+ at SQLDeleteAll( sql="DELETE CHAOS")
+ at Loader(namedQuery = "chaos")
+ at NamedNativeQuery(name="chaos", query="select id, chaos_size, name, lower( nick_name ) as nick_name from CHAOS where id= ?", resultClass = Chaos.class)
+public class Chaos {
+	@Id
+	private Long id;
+	@Column(name="chaos_size")
+	private Long size;
+	private String name;
+	@Column(name="nick_name")
+	private String nickname;
+
+	@OneToMany
+	@JoinColumn(name="chaos_fk")
+	@SQLInsert( sql="UPDATE CASIMIR_PARTICULE SET chaos_fk = ? where id = ?")
+	@SQLDelete( sql="UPDATE CASIMIR_PARTICULE SET chaos_fk = null where id = ?")
+	private Set<CasimirParticle> particles = new HashSet<CasimirParticle>();
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Long getSize() {
+		return size;
+	}
+
+	public void setSize(Long size) {
+		this.size = size;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getNickname() {
+		return nickname;
+	}
+
+	public void setNickname(String nickname) {
+		this.nickname = nickname;
+	}
+
+	public Set<CasimirParticle> getParticles() {
+		return particles;
+	}
+
+	public void setParticles(Set<CasimirParticle> particles) {
+		this.particles = particles;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/Dictionary.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/Dictionary.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/Dictionary.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,66 @@
+//$Id: Dictionary.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.query;
+
+import javax.persistence.DiscriminatorColumn;
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+import javax.persistence.EntityResult;
+import javax.persistence.FieldResult;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.NamedNativeQuery;
+import javax.persistence.SqlResultSetMapping;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at DiscriminatorColumn(name = "disc")
+ at DiscriminatorValue("Dic")
+ at SqlResultSetMapping(
+		name = "dictionary", entities = {
+ at EntityResult(
+		entityClass = org.hibernate.test.annotations.query.Dictionary.class,
+		fields = {
+		@FieldResult(name = "id", column = "id"),
+		@FieldResult(name = "name", column = "name"),
+		@FieldResult(name = "editor", column = "editor")
+				},
+		discriminatorColumn = "type"
+)
+		}
+)
+ at NamedNativeQuery(name = "all.dictionaries",
+		query = "select id, name, editor, disc as type from Dictionary",
+		resultSetMapping = "dictionary")
+public class Dictionary {
+	private Integer id;
+	private String name;
+	private String editor;
+
+	@Id
+	@GeneratedValue
+	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 String getEditor() {
+		return editor;
+	}
+
+	public void setEditor(String editor) {
+		this.editor = editor;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/Dimensions.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/Dimensions.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/Dimensions.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,31 @@
+//$Id: Dimensions.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.query;
+
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class Dimensions {
+	
+
+	private int length;
+	private int width;
+
+	public int getLength() {
+		return length;
+	}
+
+	public void setLength(int length) {
+		this.length = length;
+	}
+
+	public int getWidth() {
+		return width;
+	}
+
+	public void setWidth(int width) {
+		this.width = width;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/Identity.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/Identity.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/Identity.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,47 @@
+//$Id: Identity.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.query;
+
+import java.io.Serializable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Identity implements Serializable {
+	private String firstname;
+	private String lastname;
+
+	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 boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( o == null || getClass() != o.getClass() ) return false;
+
+		final Identity identity = (Identity) o;
+
+		if ( !firstname.equals( identity.firstname ) ) return false;
+		if ( !lastname.equals( identity.lastname ) ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		int result;
+		result = firstname.hashCode();
+		result = 29 * result + lastname.hashCode();
+		return result;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/Mark.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/Mark.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/Mark.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,27 @@
+//$Id: Mark.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.query;
+
+import javax.persistence.ColumnResult;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.NamedNativeQuery;
+import javax.persistence.SqlResultSetMapping;
+
+/**
+ * Example of scalar result (not working right now)
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at NamedNativeQuery(name = "average", query = "select avg(m.value) from Mark m", resultSetMapping = "columnmapping")
+ at SqlResultSetMapping(
+		name = "columnmapping",
+		columns = @ColumnResult(name = "aver")
+)
+public class Mark {
+	@Id
+	@GeneratedValue
+	public int id;
+	public int value;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/Night.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/Night.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/Night.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,66 @@
+//$Id: Night.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.query;
+
+import java.util.Date;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+import javax.persistence.NamedQuery;
+
+/**
+ * Entity declaring a named query
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at NamedQuery(name = "night.moreRecentThan", query = "select n from Night n where n.date >= :date")
+ at org.hibernate.annotations.NamedQuery(
+		name = "night.duration",
+		query = "select n from Night n where n.duration = :duration",
+		cacheable = true, cacheRegion = "nightQuery"
+)
+public class Night {
+	private Integer id;
+	private long duration;
+	private Date date;
+	private Area area;
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	@Column(name = "night_duration")
+	public long getDuration() {
+		return duration;
+	}
+
+	public void setDuration(long duration) {
+		this.duration = duration;
+	}
+
+	@Column(name = "night_date")
+	public Date getDate() {
+		return date;
+	}
+
+	public void setDate(Date date) {
+		this.date = date;
+	}
+
+	@ManyToOne
+	public Area getArea() {
+		return area;
+	}
+
+	public void setArea(Area area) {
+		this.area = area;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/QueryAndSQLTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/QueryAndSQLTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/QueryAndSQLTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,380 @@
+//$Id: QueryAndSQLTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.query;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.List;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.stat.Statistics;
+import org.hibernate.test.annotations.A320;
+import org.hibernate.test.annotations.A320b;
+import org.hibernate.test.annotations.Plane;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * Test named queries
+ *
+ * @author Emmanuel Bernard
+ */
+public class QueryAndSQLTest extends TestCase {
+	public QueryAndSQLTest(String x) {
+		super( x );
+	}
+
+	public void testPackageQueries() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Plane p = new Plane();
+		s.persist( p );
+		Query q = s.getNamedQuery( "plane.getAll" );
+		assertEquals( 1, q.list().size() );
+		tx.commit();
+		s.close();
+	}
+
+	public void testClassQueries() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Night n = new Night();
+		Calendar c = new GregorianCalendar();
+		c.set( 2000, 2, 2 );
+		Date now = c.getTime();
+		c.add( Calendar.MONTH, -1 );
+		Date aMonthAgo = c.getTime();
+		c.add( Calendar.MONTH, 2 );
+		Date inAMonth = c.getTime();
+		n.setDate( now );
+		n.setDuration( 14 );
+		s.persist( n );
+		tx.commit();
+		s.close();
+		s = openSession();
+		tx = s.beginTransaction();
+		Query q = s.getNamedQuery( "night.moreRecentThan" );
+		q.setDate( "date", aMonthAgo );
+		assertEquals( 1, q.list().size() );
+		q = s.getNamedQuery( "night.moreRecentThan" );
+		q.setDate( "date", inAMonth );
+		assertEquals( 0, q.list().size() );
+		Statistics stats = getSessions().getStatistics();
+		stats.setStatisticsEnabled( true );
+		stats.clear();
+		q = s.getNamedQuery( "night.duration" );
+		q.setParameter( "duration", 14l );
+		assertEquals( 1, q.list().size() );
+		assertEquals( 1, stats.getQueryCachePutCount() );
+		q = s.getNamedQuery( "night.duration" );
+		q.setParameter( "duration", 14l );
+		s.delete( q.list().get( 0 ) );
+		assertEquals( 1, stats.getQueryCacheHitCount() );
+		tx.commit();
+		s.close();
+	}
+
+	public void testSQLQuery() {
+		Night n = new Night();
+		Calendar c = new GregorianCalendar();
+		c.set( 2000, 2, 2 );
+		Date now = c.getTime();
+		c.add( Calendar.MONTH, -1 );
+		Date aMonthAgo = c.getTime();
+		c.add( Calendar.MONTH, 2 );
+		Date inAMonth = c.getTime();
+		n.setDate( now );
+		n.setDuration( 9999 );
+		Area area = new Area();
+		area.setName( "Monceau" );
+
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		s.persist( n );
+		s.persist( area );
+		tx.commit();
+		s.clear();
+		tx = s.beginTransaction();
+		Query q = s.getNamedQuery( "night.getAll.bySQL" );
+		q.setParameter( 0, 9990 );
+		List result = q.list();
+		assertEquals( 1, result.size() );
+		Night n2 = (Night) result.get( 0 );
+		assertEquals( n2.getDuration(), n.getDuration() );
+		List areas = s.getNamedQuery( "getAreaByNative" ).list();
+		assertTrue( 1 == areas.size() );
+		assertEquals( area.getName(), ( (Area) areas.get( 0 ) ).getName() );
+		tx.commit();
+		s.close();
+	}
+
+	public void testSQLQueryWithManyToOne() {
+		Night n = new Night();
+		Calendar c = new GregorianCalendar();
+		c.set( 2000, 2, 2 );
+		Date now = c.getTime();
+		c.add( Calendar.MONTH, -1 );
+		Date aMonthAgo = c.getTime();
+		c.add( Calendar.MONTH, 2 );
+		Date inAMonth = c.getTime();
+		n.setDate( now );
+		n.setDuration( 9999 );
+		Area a = new Area();
+		a.setName( "Paris" );
+		n.setArea( a );
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		s.persist( a );
+		s.persist( n );
+		tx.commit();
+		s.close();
+		s = openSession();
+		tx = s.beginTransaction();
+		Statistics stats = getSessions().getStatistics();
+		stats.setStatisticsEnabled( true );
+		Query q = s.getNamedQuery( "night&areaCached" );
+		List result = q.list();
+		assertEquals( 1, result.size() );
+		assertEquals( 1, stats.getQueryCachePutCount() );
+		q.list();
+		assertEquals( 1, stats.getQueryCacheHitCount() );
+		Night n2 = (Night) ( (Object[]) result.get( 0 ) )[0];
+		assertEquals( n2.getDuration(), n.getDuration() );
+		tx.commit();
+		s.close();
+	}
+
+	public void testImplicitNativeQuery() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		SpaceShip ship = new SpaceShip();
+		ship.setModel( "X-Wing" );
+		ship.setName( "YuBlue" );
+		ship.setSpeed( 2000 );
+		ship.setDimensions( new Dimensions() );
+		s.persist( ship );
+		tx.commit();
+		s.clear();
+		tx = s.beginTransaction();
+		Query q = s.getNamedQuery( "implicitSample" );
+		List result = q.list();
+		assertEquals( 1, result.size() );
+		assertEquals( ship.getModel(), ( (SpaceShip) result.get( 0 ) ).getModel() );
+		s.delete( result.get( 0 ) );
+		tx.commit();
+		s.close();
+	}
+
+	public void testNativeQueryAndCompositePKAndComponents() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		SpaceShip ship = new SpaceShip();
+		ship.setModel( "X-Wing" );
+		ship.setName( "YuBlue" );
+		ship.setSpeed( 2000 );
+		ship.setDimensions( new Dimensions() );
+		ship.getDimensions().setLength( 10 );
+		ship.getDimensions().setWidth( 5 );
+		Captain captain = new Captain();
+		captain.setFirstname( "Luke" );
+		captain.setLastname( "Skywalker" );
+		ship.setCaptain( captain );
+		s.persist( captain );
+		s.persist( ship );
+		tx.commit();
+		s.clear();
+		tx = s.beginTransaction();
+		Query q = s.getNamedQuery( "compositekey" );
+		List result = q.list();
+		assertEquals( 1, result.size() );
+		Object[] row = (Object[]) result.get( 0 );
+		SpaceShip spaceShip = (SpaceShip) row[0];
+		assertEquals( ship.getModel(), spaceShip.getModel() );
+		assertNotNull( spaceShip.getDimensions() );
+		assertEquals( ship.getDimensions().getWidth(), spaceShip.getDimensions().getWidth() );
+		assertEquals( ship.getDimensions().getLength(), spaceShip.getDimensions().getLength() );
+		assertEquals( ship.getCaptain().getFirstname(), ship.getCaptain().getFirstname() );
+		assertEquals( ship.getCaptain().getLastname(), ship.getCaptain().getLastname() );
+		//FIXME vary depending on databases
+		assertTrue( row[1].toString().startsWith( "50" ) );
+		assertTrue( row[2].toString().startsWith( "500" ) );
+		s.delete( spaceShip.getCaptain() );
+		s.delete( spaceShip );
+		tx.commit();
+		s.close();
+	}
+
+	public void testDiscriminator() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Dictionary dic = new Dictionary();
+		dic.setName( "Anglais-Francais" );
+		dic.setEditor( "Harrap's" );
+		SynonymousDictionary syn = new SynonymousDictionary();
+		syn.setName( "Synonymes de tous les temps" );
+		syn.setEditor( "Imagination edition" );
+		s.persist( dic );
+		s.persist( syn );
+		tx.commit();
+		s.clear();
+		tx = s.beginTransaction();
+		List results = s.getNamedQuery( "all.dictionaries" ).list();
+		assertEquals( 2, results.size() );
+		assertTrue(
+				results.get( 0 ) instanceof SynonymousDictionary
+						|| results.get( 1 ) instanceof SynonymousDictionary
+		);
+		tx.commit();
+		s.close();
+	}
+
+//	public void testScalarQuery() throws Exception {
+//        Session s = openSession();
+//		Transaction tx;
+//		tx = s.beginTransaction();
+//		Mark bad = new Mark();
+//		bad.value = 5;
+//		Mark good = new Mark();
+//		good.value = 15;
+//		s.persist(bad);
+//		s.persist(good);
+//		tx.commit();
+//		s.clear();
+//		tx = s.beginTransaction();
+//		List result = s.getNamedQuery("average").list();
+//		assertEquals( 1, result.size() );
+//		tx.commit();
+//		s.close();
+//
+//	}
+
+	public void testCache() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Plane plane = new Plane();
+		plane.setNbrOfSeats( 5 );
+		s.persist( plane );
+		tx.commit();
+		s.close();
+		getSessions().getStatistics().clear();
+		getSessions().getStatistics().setStatisticsEnabled( true );
+		s = openSession();
+		tx = s.beginTransaction();
+		Query query = s.getNamedQuery( "plane.byId" ).setParameter( "id", plane.getId() );
+		plane = (Plane) query.uniqueResult();
+		assertEquals( 1, getSessions().getStatistics().getQueryCachePutCount() );
+		plane = (Plane) s.getNamedQuery( "plane.byId" ).setParameter( "id", plane.getId() ).uniqueResult();
+		assertEquals( 1, getSessions().getStatistics().getQueryCacheHitCount() );
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+		s.delete( s.get( Plane.class, plane.getId() ) );
+		tx.commit();
+		s.close();
+	}
+
+	public void testEntitySQLOverriding() {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Chaos chaos = new Chaos();
+		chaos.setSize( 123l );
+		chaos.setId( 1l );
+
+		String lowerName = "hello";
+		String upperName = lowerName.toUpperCase();
+		assertFalse( lowerName.equals( upperName ) );
+
+		chaos.setName( "hello" );
+		chaos.setNickname( "NickName" );
+		s.persist( chaos );
+		s.flush();
+		s.clear();
+		s.getSessionFactory().evict( Chaos.class );
+
+		Chaos resultChaos = (Chaos) s.load( Chaos.class, chaos.getId() );
+		assertEquals( upperName, resultChaos.getName() );
+		assertEquals( "nickname", resultChaos.getNickname() );
+
+		tx.rollback();
+		s.close();
+	}
+
+	public void testCollectionSQLOverriding() {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Chaos chaos = new Chaos();
+		chaos.setSize( 123l );
+		chaos.setId( 1l );
+
+		chaos.setName( "hello" );
+		s.persist( chaos );
+		CasimirParticle p = new CasimirParticle();
+		p.setId( 1l );
+		s.persist( p );
+		chaos.getParticles().add(p);
+		p = new CasimirParticle();
+		p.setId( 2l );
+		s.persist( p );
+		chaos.getParticles().add(p);
+		s.flush();
+		s.clear();
+		s.getSessionFactory().evict( Chaos.class );
+
+		Chaos resultChaos = (Chaos) s.load( Chaos.class, chaos.getId() );
+		assertEquals( 2, resultChaos.getParticles().size() );
+		resultChaos.getParticles().remove( resultChaos.getParticles().iterator().next() );
+		resultChaos.getParticles().remove( resultChaos.getParticles().iterator().next() );
+		s.flush();
+
+		s.clear();
+		resultChaos = (Chaos) s.load( Chaos.class, chaos.getId() );
+		assertEquals( 0, resultChaos.getParticles().size() );
+
+		tx.rollback();
+		s.close();
+	}
+
+	protected Class[] getMappings() {
+		return new Class[]{
+				Plane.class,
+				A320.class,
+				A320b.class,
+				Night.class,
+				Area.class,
+				SpaceShip.class,
+				Dictionary.class,
+				SynonymousDictionary.class,
+				Captain.class,
+				Chaos.class,
+				CasimirParticle.class
+		};
+	}
+
+	protected String[] getAnnotatedPackages() {
+		return new String[]{
+				"org.hibernate.test.annotations.query"
+		};
+	}
+
+	@Override
+	protected String[] getXmlFiles() {
+		return new String[]{
+				"org/hibernate/test/annotations/query/orm.xml"
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/SpaceShip.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/SpaceShip.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/SpaceShip.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,80 @@
+//$Id: SpaceShip.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.query;
+
+import javax.persistence.Entity;
+import javax.persistence.EntityResult;
+import javax.persistence.FetchType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
+import javax.persistence.ManyToOne;
+import javax.persistence.NamedNativeQueries;
+import javax.persistence.NamedNativeQuery;
+import javax.persistence.SqlResultSetMapping;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at SqlResultSetMapping(name = "implicit",
+		entities = @EntityResult(entityClass = org.hibernate.test.annotations.query.SpaceShip.class))
+ at NamedNativeQueries({
+ at NamedNativeQuery(name = "implicitSample", query = "select * from SpaceShip", resultSetMapping = "implicit"),
+ at NamedNativeQuery(name = "compositekey",
+		query = "select name, model, speed, lname as lastn, fname as firstn, length, width, length * width as surface, length * width *10 as volume from SpaceShip",
+		resultSetMapping = "compositekey")
+		})
+//we're missins @SqlREsultSetMappings so look at Captain
+public class SpaceShip {
+	private String name;
+	private String model;
+	private double speed;
+	private Captain captain;
+	private Dimensions dimensions;
+
+	@Id
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	@ManyToOne(fetch = FetchType.LAZY)
+	@JoinColumns({
+	@JoinColumn(name = "fname", referencedColumnName = "firstname"),
+	@JoinColumn(name = "lname", referencedColumnName = "lastname")
+			})
+	public Captain getCaptain() {
+		return captain;
+	}
+
+	public void setCaptain(Captain captain) {
+		this.captain = captain;
+	}
+
+	public String getModel() {
+		return model;
+	}
+
+	public void setModel(String model) {
+		this.model = model;
+	}
+
+	public double getSpeed() {
+		return speed;
+	}
+
+	public void setSpeed(double speed) {
+		this.speed = speed;
+	}
+
+	public Dimensions getDimensions() {
+		return dimensions;
+	}
+
+	public void setDimensions(Dimensions dimensions) {
+		this.dimensions = dimensions;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/SynonymousDictionary.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/SynonymousDictionary.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/SynonymousDictionary.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,13 @@
+//$Id: SynonymousDictionary.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.query;
+
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at DiscriminatorValue("Syn")
+public class SynonymousDictionary extends Dictionary {
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/orm.xml
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/orm.xml	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/query/orm.xml	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
+                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                 version="1.0"
+        >
+    <named-query name="plane.getAll">
+        <query>select p from Plane p</query>
+    </named-query>
+    <named-native-query name="night.getAll.bySQL" result-set-mapping="sqlmapping">
+        <query>select id, night_duration, night_date as dte, area_id from Night where night_duration > ?</query>
+    </named-native-query>
+    <named-native-query name="getAreaByNative" result-class="org.hibernate.test.annotations.query.Area">
+        <query>select * from tbl_area</query>
+    </named-native-query>
+    <sql-result-set-mapping name="sqlmapping">
+        <entity-result entity-class="org.hibernate.test.annotations.query.Night">
+            <field-result name="id" column="id"/>
+            <field-result name="duration" column="night_duration"/>
+            <field-result name="date" column="dte"/>
+            <field-result name="area" column="area_id"/>
+        </entity-result>
+    </sql-result-set-mapping>
+</entity-mappings>
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/quote/QuoteTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/quote/QuoteTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/quote/QuoteTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,35 @@
+//$Id: QuoteTest.java 14735 2008-06-04 14:05:50Z hardy.ferentschik $
+package org.hibernate.test.annotations.quote;
+
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class QuoteTest extends TestCase {
+	public void testQuoteManytoMany() {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		User u = new User();
+		s.persist( u );
+		Role r = new Role();
+		s.persist( r );
+		u.getRoles().add( r );
+		s.flush();
+		s.clear();
+		u = (User) s.get( User.class, u.getId() );
+		assertEquals( 1, u.getRoles().size() );
+		tx.rollback();
+		String role = User.class.getName() + ".roles";
+		assertEquals( "User_Role", getCfg().getCollectionMapping( role ).getCollectionTable().getName() );
+		s.close();
+	}
+	protected Class[] getMappings() {
+		return new Class[] {
+				User.class,
+				Role.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/quote/Role.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/quote/Role.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/quote/Role.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,22 @@
+//$Id: Role.java 14735 2008-06-04 14:05:50Z hardy.ferentschik $
+package org.hibernate.test.annotations.quote;
+
+import java.io.Serializable;
+import javax.persistence.Id;
+import javax.persistence.Entity;
+import javax.persistence.GenerationType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "`Role`")
+public class Role implements Serializable {
+
+   @Id
+   @GeneratedValue(strategy = GenerationType.AUTO)
+   private long id;
+
+}
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/quote/User.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/quote/User.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/quote/User.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,44 @@
+//$Id: User.java 14735 2008-06-04 14:05:50Z hardy.ferentschik $
+package org.hibernate.test.annotations.quote;
+
+import java.io.Serializable;
+import java.util.Set;
+import java.util.HashSet;
+import javax.persistence.ManyToMany;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Table;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "`User`")
+public class User implements Serializable {
+
+   @Id
+   @GeneratedValue(strategy = GenerationType.AUTO)
+   private long id;
+
+   @ManyToMany
+   private Set<Role> roles = new HashSet<Role>();
+
+
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	public Set<Role> getRoles() {
+		return roles;
+	}
+
+	public void setRoles(Set<Role> roles) {
+		this.roles = roles;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/Bag.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/Bag.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/Bag.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,56 @@
+//$Id: Bag.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.referencedcolumnname;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Bag {
+	private Integer id;
+	private String serial;
+	private Rambler owner;
+
+	public Bag() {
+	}
+
+	public Bag(String serial, Rambler owner) {
+		this.serial = serial;
+		this.owner = owner;
+	}
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	@Column(unique = true)
+	public String getSerial() {
+		return serial;
+	}
+
+	public void setSerial(String serial) {
+		this.serial = serial;
+	}
+
+	@ManyToOne
+	@JoinColumn(referencedColumnName = "fld_name")
+	public Rambler getOwner() {
+		return owner;
+	}
+
+	public void setOwner(Rambler owner) {
+		this.owner = owner;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/Clothes.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/Clothes.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/Clothes.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,69 @@
+//$Id: Clothes.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.referencedcolumnname;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Clothes {
+	private Integer id;
+	private String type;
+	private String flavor;
+
+	public Clothes() {
+	}
+
+	public Clothes(String type, String flavor) {
+		this.type = type;
+		this.flavor = flavor;
+	}
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	public String getFlavor() {
+		return flavor;
+	}
+
+	public void setFlavor(String flavor) {
+		this.flavor = flavor;
+	}
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( !( o instanceof Clothes ) ) return false;
+
+		final Clothes clothes = (Clothes) o;
+
+		if ( !flavor.equals( clothes.flavor ) ) return false;
+		if ( !type.equals( clothes.type ) ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		int result;
+		result = type.hashCode();
+		result = 29 * result + flavor.hashCode();
+		return result;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/House.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/House.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/House.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,80 @@
+//$Id: House.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.referencedcolumnname;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class House implements Serializable {
+	private Integer id;
+	private String address;
+	private Postman postman;
+	private Set<Inhabitant> hasInhabitants = new HashSet<Inhabitant>();
+
+	@ManyToOne
+	@JoinColumn(referencedColumnName = "name")
+	public Postman getPostman() {
+		return postman;
+	}
+
+	public void setPostman(Postman postman) {
+		this.postman = postman;
+	}
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.AUTO)
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getAddress() {
+		return address;
+	}
+
+	public void setAddress(String address) {
+		this.address = address;
+	}
+
+	@ManyToMany
+	@JoinTable(joinColumns = @JoinColumn(referencedColumnName = "address"),
+			inverseJoinColumns = @JoinColumn(referencedColumnName = "name")
+	)
+	public Set<Inhabitant> getHasInhabitants() {
+		return hasInhabitants;
+	}
+
+	public void setHasInhabitants(Set<Inhabitant> hasInhabitants) {
+		this.hasInhabitants = hasInhabitants;
+	}
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( !( o instanceof House ) ) return false;
+
+		final House house = (House) o;
+
+		if ( address != null ? !address.equals( house.address ) : house.address != null ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		return ( address != null ? address.hashCode() : 0 );
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/Inhabitant.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/Inhabitant.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/Inhabitant.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,62 @@
+//$Id: Inhabitant.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.referencedcolumnname;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Inhabitant implements Serializable {
+	private Integer id;
+	private String name;
+	private Set<House> livesIn = new HashSet<House>();
+
+	@Id
+	@GeneratedValue
+	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;
+	}
+
+	@ManyToMany(mappedBy = "hasInhabitants")
+	public Set<House> getLivesIn() {
+		return livesIn;
+	}
+
+	public void setLivesIn(Set<House> livesIn) {
+		this.livesIn = livesIn;
+	}
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( !( o instanceof Inhabitant ) ) return false;
+
+		final Inhabitant inhabitant = (Inhabitant) o;
+
+		if ( name != null ? !name.equals( inhabitant.name ) : inhabitant.name != null ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		return ( name != null ? name.hashCode() : 0 );
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/Item.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/Item.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/Item.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,23 @@
+//$Id: Item.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.referencedcolumnname;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Item {
+	int id;
+
+	@Id
+	public int getId() {
+		return id;
+	}
+
+	public void setId(int id) {
+		this.id = id;
+	}
+
+}
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/ItemCost.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/ItemCost.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/ItemCost.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,55 @@
+//$Id: ItemCost.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.referencedcolumnname;
+
+import java.math.BigDecimal;
+import java.io.Serializable;
+import javax.persistence.Id;
+import javax.persistence.Entity;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class ItemCost implements Serializable {
+	int id;
+	Item item;
+	Vendor vendor;
+	BigDecimal cost;
+
+
+	@Id
+	public int getId() {
+		return id;
+	}
+
+	public void setId(int id) {
+		this.id = id;
+	}
+
+	@ManyToOne
+	public Item getItem() {
+		return item;
+	}
+
+	public void setItem(Item item) {
+		this.item = item;
+	}
+
+	@ManyToOne
+	public Vendor getVendor() {
+		return vendor;
+	}
+
+	public void setVendor(Vendor vendor) {
+		this.vendor = vendor;
+	}
+
+	public BigDecimal getCost() {
+		return cost;
+	}
+
+	public void setCost(BigDecimal cost) {
+		this.cost = cost;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/Luggage.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/Luggage.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/Luggage.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,90 @@
+//$Id: Luggage.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.referencedcolumnname;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
+import javax.persistence.OneToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Luggage implements Serializable {
+	private Integer id;
+	private String owner;
+	private String type;
+	private Set<Clothes> hasInside = new HashSet<Clothes>();
+
+	public Luggage() {
+	}
+
+	public Luggage(String owner, String type) {
+		this.owner = owner;
+		this.type = type;
+	}
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getOwner() {
+		return owner;
+	}
+
+	public void setOwner(String owner) {
+		this.owner = owner;
+	}
+
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
+	@JoinColumns({
+	@JoinColumn(name = "lug_type", referencedColumnName = "type"),
+	@JoinColumn(name = "lug_owner", referencedColumnName = "owner")
+			})
+	public Set<Clothes> getHasInside() {
+		return hasInside;
+	}
+
+	public void setHasInside(Set<Clothes> hasInside) {
+		this.hasInside = hasInside;
+	}
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( !( o instanceof Luggage ) ) return false;
+
+		final Luggage luggage = (Luggage) o;
+
+		if ( !owner.equals( luggage.owner ) ) return false;
+		if ( !type.equals( luggage.type ) ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		int result;
+		result = owner.hashCode();
+		result = 29 * result + type.hashCode();
+		return result;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/Postman.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/Postman.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/Postman.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,40 @@
+//$Id: Postman.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.referencedcolumnname;
+
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Postman implements Serializable {
+	private String name;
+	private String id;
+
+	public Postman() {
+	}
+
+	@Id
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	public Postman(String name, String id) {
+		this.name = name;
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/Rambler.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/Rambler.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/Rambler.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,57 @@
+//$Id: Rambler.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.referencedcolumnname;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Rambler implements Serializable {
+	private Integer id;
+	private String name;
+	private Set<Bag> bags = new HashSet<Bag>();
+
+	public Rambler() {
+	}
+
+	public Rambler(String name) {
+		this.name = name;
+	}
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	@Column(name = "fld_name")
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	@OneToMany(mappedBy = "owner", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
+	public Set<Bag> getBags() {
+		return bags;
+	}
+
+	public void setBags(Set<Bag> bags) {
+		this.bags = bags;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/ReferencedColumnNameTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/ReferencedColumnNameTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/ReferencedColumnNameTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,196 @@
+//$Id: ReferencedColumnNameTest.java 16289 2009-04-09 22:09:50Z gbadner $
+package org.hibernate.test.annotations.referencedcolumnname;
+
+import java.util.Iterator;
+import java.math.BigDecimal;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ReferencedColumnNameTest extends TestCase {
+	public void testManyToOne() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Postman pm = new Postman( "Bob", "A01" );
+		House house = new House();
+		house.setPostman( pm );
+		house.setAddress( "Rue des pres" );
+		s.persist( pm );
+		s.persist( house );
+		tx.commit();
+		s.close();
+		s = openSession();
+		tx = s.beginTransaction();
+		house = (House) s.get( House.class, house.getId() );
+		assertNotNull( house.getPostman() );
+		assertEquals( "Bob", house.getPostman().getName() );
+		pm = house.getPostman();
+		s.delete( house );
+		s.delete( pm );
+		tx.commit();
+		s.close();
+	}
+
+	public void testOneToMany() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+
+		Rambler rambler = new Rambler( "Emmanuel" );
+		Bag bag = new Bag( "0001", rambler );
+		rambler.getBags().add( bag );
+		s.persist( rambler );
+
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+
+		bag = (Bag) s.createQuery( "select b from Bag b left join fetch b.owner" ).uniqueResult();
+		assertNotNull( bag );
+		assertNotNull( bag.getOwner() );
+
+		rambler = (Rambler) s.createQuery( "select r from Rambler r left join fetch r.bags" ).uniqueResult();
+		assertNotNull( rambler );
+		assertNotNull( rambler.getBags() );
+		assertEquals( 1, rambler.getBags().size() );
+		s.delete( rambler.getBags().iterator().next() );
+		s.delete( rambler );
+
+		tx.commit();
+		s.close();
+	}
+
+	public void testUnidirectionalOneToMany() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+
+		Clothes clothes = new Clothes( "underwear", "interesting" );
+		Luggage luggage = new Luggage( "Emmanuel", "Cabin Luggage" );
+		luggage.getHasInside().add( clothes );
+		s.persist( luggage );
+
+		tx.commit();
+		s.close();
+
+		s = openSession();
+		tx = s.beginTransaction();
+
+		luggage = (Luggage) s.createQuery( "select l from Luggage l left join fetch l.hasInside" ).uniqueResult();
+		assertNotNull( luggage );
+		assertNotNull( luggage.getHasInside() );
+		assertEquals( 1, luggage.getHasInside().size() );
+
+		s.delete( luggage.getHasInside().iterator().next() );
+		s.delete( luggage );
+
+		tx.commit();
+		s.close();
+	}
+
+	public void testManyToMany() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+
+		House whiteHouse = new House();
+		whiteHouse.setAddress( "1600 Pennsylvania Avenue, Washington" );
+		Inhabitant bill = new Inhabitant();
+		bill.setName( "Bill Clinton" );
+		Inhabitant george = new Inhabitant();
+		george.setName( "George W Bush" );
+		s.persist( george );
+		s.persist( bill );
+		whiteHouse.getHasInhabitants().add( bill );
+		whiteHouse.getHasInhabitants().add( george );
+		//bill.getLivesIn().add( whiteHouse );
+		//george.getLivesIn().add( whiteHouse );
+
+		s.persist( whiteHouse );
+		tx.commit();
+		s = openSession();
+		tx = s.beginTransaction();
+
+		whiteHouse = (House) s.get( House.class, whiteHouse.getId() );
+		assertNotNull( whiteHouse );
+		assertEquals( 2, whiteHouse.getHasInhabitants().size() );
+
+		tx.commit();
+		s.clear();
+		tx = s.beginTransaction();
+		bill = (Inhabitant) s.get( Inhabitant.class, bill.getId() );
+		assertNotNull( bill );
+		assertEquals( 1, bill.getLivesIn().size() );
+		assertEquals( whiteHouse.getAddress(), bill.getLivesIn().iterator().next().getAddress() );
+
+		whiteHouse = bill.getLivesIn().iterator().next();
+		s.delete( whiteHouse );
+		Iterator it = whiteHouse.getHasInhabitants().iterator();
+		while ( it.hasNext() ) {
+			s.delete( it.next() );
+		}
+		tx.commit();
+		s.close();
+	}
+
+	public void testManyToOneReferenceManyToOne() throws Exception {
+		Item item = new Item();
+		item.setId( 1 );
+		Vendor vendor = new Vendor();
+		vendor.setId( 1 );
+		ItemCost cost = new ItemCost();
+		cost.setCost( new BigDecimal(1) );
+		cost.setId( 1 );
+		cost.setItem( item );
+		cost.setVendor( vendor );
+		WarehouseItem wItem = new WarehouseItem();
+		wItem.setDefaultCost( cost );
+		wItem.setId( 1 );
+		wItem.setItem( item );
+		wItem.setQtyInStock( new BigDecimal(1) );
+		wItem.setVendor( vendor );
+		Session s = openSession( );
+		s.getTransaction().begin();
+		s.persist( item );
+		s.persist( vendor );
+		s.persist( cost );
+		s.persist( wItem );
+		s.flush();
+		s.clear();
+		wItem = (WarehouseItem) s.get(WarehouseItem.class, wItem.getId() );
+		assertNotNull( wItem.getDefaultCost().getItem() );
+		s.getTransaction().rollback();
+		s.close();
+	}
+
+	public ReferencedColumnNameTest(String x) {
+		super( x );
+	}
+
+	protected Class[] getMappings() {
+		return new Class[]{
+				House.class,
+				Postman.class,
+				Bag.class,
+				Rambler.class,
+				Luggage.class,
+				Clothes.class,
+				Inhabitant.class,
+				Item.class,
+				ItemCost.class,
+				Vendor.class,
+				WarehouseItem.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/Vendor.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/Vendor.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/Vendor.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,24 @@
+//$Id: Vendor.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.referencedcolumnname;
+
+import javax.persistence.Id;
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Vendor {
+	int id;
+
+	@Id
+	public int getId() {
+		return id;
+	}
+
+	public void setId(int id) {
+		this.id = id;
+	}
+
+}
+

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/WarehouseItem.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/WarehouseItem.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/referencedcolumnname/WarehouseItem.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,71 @@
+//$Id: WarehouseItem.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.referencedcolumnname;
+
+import java.math.BigDecimal;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumns;
+import javax.persistence.ManyToOne;
+import javax.persistence.JoinColumn;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class WarehouseItem {
+
+	int id;
+	Item item;
+	Vendor vendor;
+	ItemCost defaultCost;
+	BigDecimal qtyInStock;
+
+	@Id
+	public int getId() {
+		return id;
+	}
+
+	public void setId(int id) {
+		this.id = id;
+	}
+
+	public BigDecimal getQtyInStock() {
+		return qtyInStock;
+	}
+
+	public void setQtyInStock(BigDecimal qtyInStock) {
+		this.qtyInStock = qtyInStock;
+	}
+
+	@ManyToOne
+	public Item getItem() {
+		return item;
+	}
+
+	public void setItem(Item item) {
+		this.item = item;
+	}
+
+	@ManyToOne
+	public Vendor getVendor() {
+		return vendor;
+	}
+
+	public void setVendor(Vendor vendor) {
+		this.vendor = vendor;
+	}
+
+    @ManyToOne
+	@JoinColumns({
+     	@JoinColumn(name="vendor_id", referencedColumnName="vendor_id", insertable=false, updatable=false),
+     	@JoinColumn(name="item_id", referencedColumnName="item_id", insertable=false, updatable=false)
+     })
+	public ItemCost getDefaultCost() {
+		return defaultCost;
+	}
+
+	public void setDefaultCost(ItemCost defaultCost) {
+		this.defaultCost = defaultCost;
+	}
+}
+

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/Administration.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/Administration.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/Administration.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,77 @@
+//$Id: Administration.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.reflection;
+
+import javax.persistence.Basic;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
+import javax.persistence.OneToOne;
+import javax.persistence.PostLoad;
+import javax.persistence.SecondaryTable;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity(name = "JavaAdministration")
+ at Table(name = "JavaAdministration")
+ at SecondaryTable(name = "Extend")
+public class Administration extends Organization {
+	@Id
+	private Integer id;
+	private String firstname;
+	private String lastname;
+	private String address;
+	private Integer version;
+	@Basic
+	private String transientField;
+	@OneToOne
+	@JoinColumns({@JoinColumn(name = "busNumber_fk"), @JoinColumn(name = "busDriver_fk")})
+	private BusTrip defaultBusTrip;
+
+	public String getAddress() {
+		return address;
+	}
+
+	public void setAddress(String address) {
+		this.address = address;
+	}
+
+	public Integer getVersion() {
+		return version;
+	}
+
+	public void setVersion(Integer version) {
+		this.version = version;
+	}
+
+	public String getFirstname() {
+		return firstname;
+	}
+
+	public void setFirstname(String firstname) {
+		this.firstname = firstname;
+	}
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getLastname() {
+		return lastname;
+	}
+
+	public void setLastname(String lastname) {
+		this.lastname = lastname;
+	}
+
+	@PostLoad
+	public void calculate() {
+		//...
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/Availability.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/Availability.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/Availability.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,10 @@
+//$Id: Availability.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.reflection;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public enum Availability {
+	ON_DUTY,
+	NO_SERVICE
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/BusTrip.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/BusTrip.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/BusTrip.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,54 @@
+//$Id: BusTrip.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.reflection;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class BusTrip {
+	private BusTripPk id;
+	private Availability status;
+	private byte[] serial;
+	private Date terminusTime;
+	private Map<String, SocialSecurityPhysicalAccount> players;
+	private List roads;
+
+	@EmbeddedId
+	public BusTripPk getId() {
+		return id;
+	}
+
+	public void setId(BusTripPk id) {
+		this.id = id;
+	}
+
+	public Availability getStatus() {
+		return status;
+	}
+
+	public void setStatus(Availability status) {
+		this.status = status;
+	}
+
+	public byte[] getSerial() {
+		return serial;
+	}
+
+	public void setSerial(byte[] serial) {
+		this.serial = serial;
+	}
+
+	public Date getTerminusTime() {
+		return terminusTime;
+	}
+
+	public void setTerminusTime(Date terminusTime) {
+		this.terminusTime = terminusTime;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/BusTripPk.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/BusTripPk.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/BusTripPk.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,26 @@
+//$Id: BusTripPk.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.reflection;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class BusTripPk {
+	private String busNumber;
+	private String busDriver;
+
+	public String getBusDriver() {
+		return busDriver;
+	}
+
+	public void setBusDriver(String busDriver) {
+		this.busDriver = busDriver;
+	}
+
+	public String getBusNumber() {
+		return busNumber;
+	}
+
+	public void setBusNumber(String busNumber) {
+		this.busNumber = busNumber;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/Competition.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/Competition.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/Competition.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,11 @@
+//$Id: Competition.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.reflection;
+
+import javax.persistence.MappedSuperclass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MappedSuperclass
+public class Competition {
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/EJB3OverridenAnnotationReaderTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/EJB3OverridenAnnotationReaderTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/EJB3OverridenAnnotationReaderTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,434 @@
+//$Id: EJB3OverridenAnnotationReaderTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.reflection;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+import javax.persistence.AssociationOverrides;
+import javax.persistence.AttributeOverrides;
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.DiscriminatorColumn;
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Embedded;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.ExcludeDefaultListeners;
+import javax.persistence.ExcludeSuperclassListeners;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.JoinColumns;
+import javax.persistence.JoinTable;
+import javax.persistence.Lob;
+import javax.persistence.ManyToMany;
+import javax.persistence.MapKey;
+import javax.persistence.MappedSuperclass;
+import javax.persistence.NamedNativeQueries;
+import javax.persistence.NamedQueries;
+import javax.persistence.OneToMany;
+import javax.persistence.OneToOne;
+import javax.persistence.OrderBy;
+import javax.persistence.PrimaryKeyJoinColumn;
+import javax.persistence.PrimaryKeyJoinColumns;
+import javax.persistence.SecondaryTable;
+import javax.persistence.SecondaryTables;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.SqlResultSetMappings;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+import javax.persistence.Transient;
+import javax.persistence.Version;
+import javax.persistence.PrePersist;
+import javax.persistence.EntityListeners;
+import javax.persistence.PostLoad;
+import javax.persistence.PostPersist;
+
+import junit.framework.TestCase;
+import org.dom4j.DocumentException;
+import org.dom4j.io.SAXReader;
+import org.hibernate.annotations.Columns;
+import org.hibernate.cfg.EJB3DTDEntityResolver;
+import org.hibernate.cfg.annotations.reflection.EJB3OverridenAnnotationReader;
+import org.hibernate.cfg.annotations.reflection.XMLContext;
+import org.hibernate.util.XMLHelper;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXNotSupportedException;
+
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class EJB3OverridenAnnotationReaderTest extends TestCase {
+	public void testMappedSuperclassAnnotations() throws Exception {
+		XMLContext context = buildContext(
+				"org/hibernate/test/annotations/reflection/metadata-complete.xml" );
+		EJB3OverridenAnnotationReader reader = new EJB3OverridenAnnotationReader( Organization.class, context );
+		assertTrue( reader.isAnnotationPresent( MappedSuperclass.class ) );
+	}
+
+	public void testEntityRelatedAnnotations() throws Exception {
+		XMLContext context = buildContext( "org/hibernate/test/annotations/reflection/orm.xml" );
+		EJB3OverridenAnnotationReader reader = new EJB3OverridenAnnotationReader( Administration.class, context );
+		assertNotNull( reader.getAnnotation( Entity.class ) );
+		assertEquals(
+				"Default value in xml entity should not override @Entity.name", "JavaAdministration",
+				reader.getAnnotation( Entity.class ).name()
+		);
+		assertNotNull( reader.getAnnotation( Table.class ) );
+		assertEquals( "@Table not overriden", "tbl_admin", reader.getAnnotation( Table.class ).name() );
+		assertEquals( "Default schema not overriden", "myschema", reader.getAnnotation( Table.class ).schema() );
+		assertEquals(
+				"Proper @Table.uniqueConstraints", 2,
+				reader.getAnnotation( Table.class ).uniqueConstraints()[0].columnNames().length
+		);
+		String columnName = reader.getAnnotation( Table.class ).uniqueConstraints()[0].columnNames()[0];
+		assertTrue(
+				"Proper @Table.uniqueConstraints", "firstname".equals( columnName ) || "lastname".equals( columnName )
+		);
+		assertNull( "Both Java and XML used", reader.getAnnotation( SecondaryTable.class ) );
+		assertNotNull( "XML does not work", reader.getAnnotation( SecondaryTables.class ) );
+		SecondaryTable[] tables = reader.getAnnotation( SecondaryTables.class ).value();
+		assertEquals( 1, tables.length );
+		assertEquals( "admin2", tables[0].name() );
+		assertEquals( "unique constraints ignored", 1, tables[0].uniqueConstraints().length );
+		assertEquals( "pk join column ignored", 1, tables[0].pkJoinColumns().length );
+		assertEquals( "pk join column ignored", "admin_id", tables[0].pkJoinColumns()[0].name() );
+		assertNotNull( "Sequence Overriding not working", reader.getAnnotation( SequenceGenerator.class ) );
+		assertEquals(
+				"wrong sequence name", "seqhilo", reader.getAnnotation( SequenceGenerator.class ).sequenceName()
+		);
+		assertEquals( "default fails", 50, reader.getAnnotation( SequenceGenerator.class ).allocationSize() );
+		assertNotNull( "TableOverriding not working", reader.getAnnotation( TableGenerator.class ) );
+		assertEquals( "wrong tble name", "tablehilo", reader.getAnnotation( TableGenerator.class ).table() );
+		assertEquals( "no schema overriding", "myschema", reader.getAnnotation( TableGenerator.class ).schema() );
+
+		reader = new EJB3OverridenAnnotationReader( Match.class, context );
+		assertNotNull( reader.getAnnotation( Table.class ) );
+		assertEquals(
+				"Java annotation not taken into account", "matchtable", reader.getAnnotation( Table.class ).name()
+		);
+		assertEquals(
+				"Java annotation not taken into account", "matchschema", reader.getAnnotation( Table.class ).schema()
+		);
+		assertEquals( "Overriding not taken into account", "mycatalog", reader.getAnnotation( Table.class ).catalog() );
+		assertNotNull( "SecondaryTable swallowed", reader.getAnnotation( SecondaryTables.class ) );
+		assertEquals(
+				"Default schema not taken into account", "myschema",
+				reader.getAnnotation( SecondaryTables.class ).value()[0].schema()
+		);
+		assertNotNull( reader.getAnnotation( Inheritance.class ) );
+		assertEquals(
+				"inheritance strategy not overriden", InheritanceType.JOINED,
+				reader.getAnnotation( Inheritance.class ).strategy()
+		);
+		assertNotNull( "NamedQuery not overriden", reader.getAnnotation( NamedQueries.class ) );
+		assertEquals( "No deduplication", 3, reader.getAnnotation( NamedQueries.class ).value().length );
+		assertEquals(
+				"deduplication kept the Java version", 1,
+				reader.getAnnotation( NamedQueries.class ).value()[1].hints().length
+		);
+		assertEquals(
+				"org.hibernate.timeout", reader.getAnnotation( NamedQueries.class ).value()[1].hints()[0].name()
+		);
+		assertNotNull( "NamedNativeQuery not overriden", reader.getAnnotation( NamedNativeQueries.class ) );
+		assertEquals( "No deduplication", 3, reader.getAnnotation( NamedNativeQueries.class ).value().length );
+		assertEquals(
+				"deduplication kept the Java version", 1,
+				reader.getAnnotation( NamedNativeQueries.class ).value()[1].hints().length
+		);
+		assertEquals(
+				"org.hibernate.timeout", reader.getAnnotation( NamedNativeQueries.class ).value()[1].hints()[0].name()
+		);
+		assertNotNull( reader.getAnnotation( SqlResultSetMappings.class ) );
+		assertEquals(
+				"competitor1Point", reader.getAnnotation( SqlResultSetMappings.class ).value()[0].columns()[0].name()
+		);
+		assertEquals(
+				"competitor1Point",
+				reader.getAnnotation( SqlResultSetMappings.class ).value()[0].entities()[0].fields()[0].column()
+		);
+		assertNotNull( reader.getAnnotation( ExcludeSuperclassListeners.class ) );
+		assertNotNull( reader.getAnnotation( ExcludeDefaultListeners.class ) );
+
+		reader = new EJB3OverridenAnnotationReader( Competition.class, context );
+		assertNotNull( reader.getAnnotation( MappedSuperclass.class ) );
+
+		reader = new EJB3OverridenAnnotationReader( TennisMatch.class, context );
+		assertNull( "Mutualize PKJC into PKJCs", reader.getAnnotation( PrimaryKeyJoinColumn.class ) );
+		assertNotNull( reader.getAnnotation( PrimaryKeyJoinColumns.class ) );
+		assertEquals(
+				"PrimaryKeyJoinColumn overrden", "id",
+				reader.getAnnotation( PrimaryKeyJoinColumns.class ).value()[0].name()
+		);
+		assertNotNull( reader.getAnnotation( AttributeOverrides.class ) );
+		assertEquals( "Wrong deduplication", 3, reader.getAnnotation( AttributeOverrides.class ).value().length );
+		assertEquals(
+				"Wrong priority (XML vs java annotations)", "fld_net",
+				reader.getAnnotation( AttributeOverrides.class ).value()[0].column().name()
+		);
+		assertEquals(
+				"Column mapping", 2, reader.getAnnotation( AttributeOverrides.class ).value()[1].column().scale()
+		);
+		assertEquals(
+				"Column mapping", true, reader.getAnnotation( AttributeOverrides.class ).value()[1].column().unique()
+		);
+		assertNotNull( reader.getAnnotation( AssociationOverrides.class ) );
+		assertEquals( "no XML processing", 1, reader.getAnnotation( AssociationOverrides.class ).value().length );
+		assertEquals(
+				"wrong xml processing", "id",
+				reader.getAnnotation( AssociationOverrides.class ).value()[0].joinColumns()[0].referencedColumnName()
+		);
+
+
+		reader = new EJB3OverridenAnnotationReader( SocialSecurityPhysicalAccount.class, context );
+		assertNotNull( reader.getAnnotation( IdClass.class ) );
+		assertEquals( "id-class not used", SocialSecurityNumber.class, reader.getAnnotation( IdClass.class ).value() );
+		assertEquals(
+				"discriminator-value not used", "Physical", reader.getAnnotation( DiscriminatorValue.class ).value()
+		);
+		assertNotNull( "discriminator-column not used", reader.getAnnotation( DiscriminatorColumn.class ) );
+		assertEquals(
+				"discriminator-column.name default value broken", "DTYPE",
+				reader.getAnnotation( DiscriminatorColumn.class ).name()
+		);
+		assertEquals(
+				"discriminator-column.length broken", 34, reader.getAnnotation( DiscriminatorColumn.class ).length()
+		);
+	}
+
+	public void testEntityRelatedAnnotationsMetadataComplete() throws Exception {
+		XMLContext context = buildContext(
+				"org/hibernate/test/annotations/reflection/metadata-complete.xml" );
+		EJB3OverridenAnnotationReader reader = new EJB3OverridenAnnotationReader( Administration.class, context );
+		assertNotNull( reader.getAnnotation( Entity.class ) );
+		assertEquals(
+				"Metadata complete should ignore java annotations", "", reader.getAnnotation( Entity.class ).name()
+		);
+		assertNotNull( reader.getAnnotation( Table.class ) );
+		assertEquals( "@Table should not be used", "", reader.getAnnotation( Table.class ).name() );
+		assertEquals( "Default schema not overriden", "myschema", reader.getAnnotation( Table.class ).schema() );
+
+		reader = new EJB3OverridenAnnotationReader( Match.class, context );
+		assertNotNull( reader.getAnnotation( Table.class ) );
+		assertEquals( "@Table should not be used", "", reader.getAnnotation( Table.class ).name() );
+		assertEquals( "Overriding not taken into account", "myschema", reader.getAnnotation( Table.class ).schema() );
+		assertEquals( "Overriding not taken into account", "mycatalog", reader.getAnnotation( Table.class ).catalog() );
+		assertNull( "Ignore Java annotation", reader.getAnnotation( SecondaryTable.class ) );
+		assertNull( "Ignore Java annotation", reader.getAnnotation( SecondaryTables.class ) );
+		assertNull( "Ignore Java annotation", reader.getAnnotation( Inheritance.class ) );
+		assertNull( reader.getAnnotation( NamedQueries.class ) );
+		assertNull( reader.getAnnotation( NamedNativeQueries.class ) );
+
+		reader = new EJB3OverridenAnnotationReader( TennisMatch.class, context );
+		assertNull( reader.getAnnotation( PrimaryKeyJoinColumn.class ) );
+		assertNull( reader.getAnnotation( PrimaryKeyJoinColumns.class ) );
+
+		reader = new EJB3OverridenAnnotationReader( Competition.class, context );
+		assertNull( reader.getAnnotation( MappedSuperclass.class ) );
+
+		reader = new EJB3OverridenAnnotationReader( SocialSecurityMoralAccount.class, context );
+		assertNull( reader.getAnnotation( IdClass.class ) );
+		assertNull( reader.getAnnotation( DiscriminatorValue.class ) );
+		assertNull( reader.getAnnotation( DiscriminatorColumn.class ) );
+		assertNull( reader.getAnnotation( SequenceGenerator.class ) );
+		assertNull( reader.getAnnotation( TableGenerator.class ) );
+	}
+
+	public void testIdRelatedAnnotations() throws Exception {
+		XMLContext context = buildContext( "org/hibernate/test/annotations/reflection/orm.xml" );
+		Method method = Administration.class.getDeclaredMethod( "getId" );
+		EJB3OverridenAnnotationReader reader = new EJB3OverridenAnnotationReader( method, context );
+		assertNull( reader.getAnnotation( Id.class ) );
+		assertNull( reader.getAnnotation( Column.class ) );
+		Field field = Administration.class.getDeclaredField( "id" );
+		reader = new EJB3OverridenAnnotationReader( field, context );
+		assertNotNull( reader.getAnnotation( Id.class ) );
+		assertNotNull( reader.getAnnotation( GeneratedValue.class ) );
+		assertEquals( GenerationType.SEQUENCE, reader.getAnnotation( GeneratedValue.class ).strategy() );
+		assertEquals( "generator", reader.getAnnotation( GeneratedValue.class ).generator() );
+		assertNotNull( reader.getAnnotation( SequenceGenerator.class ) );
+		assertEquals( "seq", reader.getAnnotation( SequenceGenerator.class ).sequenceName() );
+		assertNotNull( reader.getAnnotation( Columns.class ) );
+		assertEquals( 1, reader.getAnnotation( Columns.class ).columns().length );
+		assertEquals( "fld_id", reader.getAnnotation( Columns.class ).columns()[0].name() );
+		assertNotNull( reader.getAnnotation( Temporal.class ) );
+		assertEquals( TemporalType.DATE, reader.getAnnotation( Temporal.class ).value() );
+
+		context = buildContext(
+				"org/hibernate/test/annotations/reflection/metadata-complete.xml" );
+		method = Administration.class.getDeclaredMethod( "getId" );
+		reader = new EJB3OverridenAnnotationReader( method, context );
+		assertNotNull(
+				"Default access type when not defined in metadata complete should be property",
+				reader.getAnnotation( Id.class )
+		);
+		field = Administration.class.getDeclaredField( "id" );
+		reader = new EJB3OverridenAnnotationReader( field, context );
+		assertNull(
+				"Default access type when not defined in metadata complete should be property",
+				reader.getAnnotation( Id.class )
+		);
+
+		method = BusTrip.class.getDeclaredMethod( "getId" );
+		reader = new EJB3OverridenAnnotationReader( method, context );
+		assertNull( reader.getAnnotation( EmbeddedId.class ) );
+		field = BusTrip.class.getDeclaredField( "id" );
+		reader = new EJB3OverridenAnnotationReader( field, context );
+		assertNotNull( reader.getAnnotation( EmbeddedId.class ) );
+		assertNotNull( reader.getAnnotation( AttributeOverrides.class ) );
+		assertEquals( 1, reader.getAnnotation( AttributeOverrides.class ).value().length );
+	}
+
+	public void testBasicRelatedAnnotations() throws Exception {
+		XMLContext context = buildContext(
+				"org/hibernate/test/annotations/reflection/metadata-complete.xml" );
+		Field field = BusTrip.class.getDeclaredField( "status" );
+		EJB3OverridenAnnotationReader reader = new EJB3OverridenAnnotationReader( field, context );
+		assertNotNull( reader.getAnnotation( Enumerated.class ) );
+		assertEquals( EnumType.STRING, reader.getAnnotation( Enumerated.class ).value() );
+		assertEquals( false, reader.getAnnotation( Basic.class ).optional() );
+		field = BusTrip.class.getDeclaredField( "serial" );
+		reader = new EJB3OverridenAnnotationReader( field, context );
+		assertNotNull( reader.getAnnotation( Lob.class ) );
+		assertEquals( "serialbytes", reader.getAnnotation( Columns.class ).columns()[0].name() );
+		field = BusTrip.class.getDeclaredField( "terminusTime" );
+		reader = new EJB3OverridenAnnotationReader( field, context );
+		assertNotNull( reader.getAnnotation( Temporal.class ) );
+		assertEquals( TemporalType.TIMESTAMP, reader.getAnnotation( Temporal.class ).value() );
+		assertEquals( FetchType.LAZY, reader.getAnnotation( Basic.class ).fetch() );
+
+		field = BusTripPk.class.getDeclaredField( "busDriver" );
+		reader = new EJB3OverridenAnnotationReader( field, context );
+		assertNotNull( reader.isAnnotationPresent( Basic.class ) );
+	}
+
+	public void testVersionRelatedAnnotations() throws Exception {
+		XMLContext context = buildContext( "org/hibernate/test/annotations/reflection/orm.xml" );
+		Method method = Administration.class.getDeclaredMethod( "getVersion" );
+		EJB3OverridenAnnotationReader reader = new EJB3OverridenAnnotationReader( method, context );
+		assertNotNull( reader.getAnnotation( Version.class ) );
+
+		Field field = Match.class.getDeclaredField( "version" );
+		reader = new EJB3OverridenAnnotationReader( field, context );
+		assertNotNull( reader.getAnnotation( Version.class ) );
+	}
+
+	public void testTransientAndEmbeddedRelatedAnnotations() throws Exception {
+		XMLContext context = buildContext( "org/hibernate/test/annotations/reflection/orm.xml" );
+
+		Field field = Administration.class.getDeclaredField( "transientField" );
+		EJB3OverridenAnnotationReader reader = new EJB3OverridenAnnotationReader( field, context );
+		assertNotNull( reader.getAnnotation( Transient.class ) );
+		assertNull( reader.getAnnotation( Basic.class ) );
+
+		field = Match.class.getDeclaredField( "playerASSN" );
+		reader = new EJB3OverridenAnnotationReader( field, context );
+		assertNotNull( reader.getAnnotation( Embedded.class ) );
+	}
+
+	public void testAssociationRelatedAnnotations() throws Exception {
+		XMLContext context = buildContext( "org/hibernate/test/annotations/reflection/orm.xml" );
+
+		Field field = Administration.class.getDeclaredField( "defaultBusTrip" );
+		EJB3OverridenAnnotationReader reader = new EJB3OverridenAnnotationReader( field, context );
+		assertNotNull( reader.getAnnotation( OneToOne.class ) );
+		assertNull( reader.getAnnotation( JoinColumns.class ) );
+		assertNotNull( reader.getAnnotation( PrimaryKeyJoinColumns.class ) );
+		assertEquals( "pk", reader.getAnnotation( PrimaryKeyJoinColumns.class ).value()[0].name() );
+		assertEquals( 5, reader.getAnnotation( OneToOne.class ).cascade().length );
+		assertEquals( FetchType.LAZY, reader.getAnnotation( OneToOne.class ).fetch() );
+		assertEquals( "test", reader.getAnnotation( OneToOne.class ).mappedBy() );
+
+		context = buildContext(
+				"org/hibernate/test/annotations/reflection/metadata-complete.xml" );
+		field = BusTrip.class.getDeclaredField( "players" );
+		reader = new EJB3OverridenAnnotationReader( field, context );
+		assertNotNull( reader.getAnnotation( OneToMany.class ) );
+		assertNotNull( reader.getAnnotation( JoinColumns.class ) );
+		assertEquals( 2, reader.getAnnotation( JoinColumns.class ).value().length );
+		assertEquals( "driver", reader.getAnnotation( JoinColumns.class ).value()[0].name() );
+		assertNotNull( reader.getAnnotation( MapKey.class ) );
+		assertEquals( "name", reader.getAnnotation( MapKey.class ).name() );
+
+		field = BusTrip.class.getDeclaredField( "roads" );
+		reader = new EJB3OverridenAnnotationReader( field, context );
+		assertNotNull( reader.getAnnotation( ManyToMany.class ) );
+		assertNotNull( reader.getAnnotation( JoinTable.class ) );
+		assertEquals( "bus_road", reader.getAnnotation( JoinTable.class ).name() );
+		assertEquals( 2, reader.getAnnotation( JoinTable.class ).joinColumns().length );
+		assertEquals( 1, reader.getAnnotation( JoinTable.class ).inverseJoinColumns().length );
+		assertEquals( 2, reader.getAnnotation( JoinTable.class ).uniqueConstraints()[0].columnNames().length );
+		assertNotNull( reader.getAnnotation( OrderBy.class ) );
+		assertEquals( "maxSpeed", reader.getAnnotation( OrderBy.class ).value() );
+	}
+
+	public void testEntityListeners() throws Exception {
+		XMLContext context = buildContext( "org/hibernate/test/annotations/reflection/orm.xml" );
+
+		Method method = Administration.class.getDeclaredMethod( "calculate" );
+		EJB3OverridenAnnotationReader reader = new EJB3OverridenAnnotationReader( method, context );
+		assertTrue( reader.isAnnotationPresent( PrePersist.class ) );
+
+		reader = new EJB3OverridenAnnotationReader( Administration.class, context );
+		assertTrue( reader.isAnnotationPresent( EntityListeners.class ) );
+		assertEquals( 1, reader.getAnnotation( EntityListeners.class ).value().length );
+		assertEquals( LogListener.class, reader.getAnnotation( EntityListeners.class ).value()[0] );
+
+		method = LogListener.class.getDeclaredMethod( "noLog", Object.class );
+		reader = new EJB3OverridenAnnotationReader( method, context );
+		assertTrue( reader.isAnnotationPresent( PostLoad.class ) );
+
+		method = LogListener.class.getDeclaredMethod( "log", Object.class );
+		reader = new EJB3OverridenAnnotationReader( method, context );
+		assertTrue( reader.isAnnotationPresent( PrePersist.class ) );
+		assertFalse( reader.isAnnotationPresent( PostPersist.class ) );
+
+		assertEquals( 1, context.getDefaultEntityListeners().size() );
+		assertEquals( OtherLogListener.class.getName(), context.getDefaultEntityListeners().get(0) );
+	}
+
+	private XMLContext buildContext(String ormfile) throws SAXException, DocumentException, IOException {
+		XMLHelper xmlHelper = new XMLHelper();
+		ClassLoader cl = Thread.currentThread().getContextClassLoader();
+		InputStream is = cl.getResourceAsStream( ormfile );
+		assertNotNull( "ORM.xml not found: " + ormfile, is );
+		XMLContext context = new XMLContext();
+		List errors = new ArrayList();
+		SAXReader saxReader = xmlHelper.createSAXReader( "XML InputStream", errors, EJB3DTDEntityResolver.INSTANCE );
+		//saxReader.setValidation( false );
+		try {
+			saxReader.setFeature( "http://apache.org/xml/features/validation/schema", true );
+		}
+		catch (SAXNotSupportedException e) {
+			saxReader.setValidation( false );
+		}
+		org.dom4j.Document doc;
+		try {
+			doc = saxReader
+					.read( new InputSource( new BufferedInputStream( is ) ) );
+		}
+		finally {
+			is.close();
+		}
+		if (errors.size() > 0) {
+			System.out.println( errors.get( 0 ) );
+		}
+		assertEquals( 0, errors.size() );
+		context.addDocument( doc );
+		return context;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/LogListener.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/LogListener.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/LogListener.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,27 @@
+//$Id: LogListener.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.reflection;
+
+import javax.persistence.PrePersist;
+import javax.persistence.PostPersist;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class LogListener {
+	private final Logger log = LoggerFactory.getLogger( LogListener.class );
+
+	@PrePersist
+	@PostPersist
+	public void log(Object entity) {
+		log.debug( "Logging entity {} with hashCode: {}", entity.getClass().getName(), entity.hashCode() );
+	}
+
+
+	public void noLog(Object entity) {
+		log.debug( "NoLogging entity {} with hashCode: {}", entity.getClass().getName(), entity.hashCode() );
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/Match.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/Match.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/Match.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,35 @@
+//$Id: Match.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.reflection;
+
+import javax.persistence.Entity;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.NamedNativeQueries;
+import javax.persistence.NamedNativeQuery;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.persistence.SecondaryTable;
+import javax.persistence.Table;
+import javax.persistence.Version;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "matchtable", schema = "matchschema")
+ at SecondaryTable(name = "extendedMatch")
+ at Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+ at NamedQueries({
+ at NamedQuery(name = "matchbyid", query = "select m from Match m where m.id = :id"),
+ at NamedQuery(name = "getAllMatches2", query = "select m from Match m")
+		})
+ at NamedNativeQueries({
+ at NamedNativeQuery(name = "matchbyid", query = "select m from Match m where m.id = :id", resultSetMapping = "matchrs"),
+ at NamedNativeQuery(name = "getAllMatches2", query = "select m from Match m", resultSetMapping = "matchrs")
+		})
+public class Match extends Competition {
+	public String competitor1Point;
+	@Version
+	public Integer version;
+	public SocialSecurityNumber playerASSN;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/Organization.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/Organization.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/Organization.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,17 @@
+//$Id: Organization.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.reflection;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Organization {
+	private String organizationId;
+
+	public String getOrganizationId() {
+		return organizationId;
+	}
+
+	public void setOrganizationId(String organizationId) {
+		this.organizationId = organizationId;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/OtherLogListener.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/OtherLogListener.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/OtherLogListener.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,27 @@
+//$Id: OtherLogListener.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.reflection;
+
+import javax.persistence.PrePersist;
+import javax.persistence.PostPersist;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class OtherLogListener {
+	private final Logger log = LoggerFactory.getLogger( OtherLogListener.class );
+
+	@PrePersist
+	@PostPersist
+	public void log(Object entity) {
+		log.debug( "Logging entity {} with hashCode: {}", entity.getClass().getName(), entity.hashCode() );
+	}
+
+
+	public void noLog(Object entity) {
+		log.debug( "NoLogging entity {} with hashCode: {}", entity.getClass().getName(), entity.hashCode() );
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/SocialSecurityMoralAccount.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/SocialSecurityMoralAccount.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/SocialSecurityMoralAccount.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,21 @@
+//$Id: SocialSecurityMoralAccount.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.reflection;
+
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+import javax.persistence.IdClass;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.TableGenerator;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at IdClass(SocialSecurityNumber.class)
+ at DiscriminatorValue("Moral")
+ at SequenceGenerator(name = "seq")
+ at TableGenerator(name = "table")
+public class SocialSecurityMoralAccount {
+	public String number;
+	public String countryCode;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/SocialSecurityNumber.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/SocialSecurityNumber.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/SocialSecurityNumber.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,33 @@
+//$Id: SocialSecurityNumber.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.reflection;
+
+import java.io.Serializable;
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class SocialSecurityNumber implements Serializable {
+	public String number;
+	public String countryCode;
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( o == null || getClass() != o.getClass() ) return false;
+
+		final SocialSecurityNumber that = (SocialSecurityNumber) o;
+
+		if ( !countryCode.equals( that.countryCode ) ) return false;
+		if ( !number.equals( that.number ) ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		int result;
+		result = number.hashCode();
+		result = 29 * result + countryCode.hashCode();
+		return result;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/SocialSecurityPhysicalAccount.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/SocialSecurityPhysicalAccount.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/SocialSecurityPhysicalAccount.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,13 @@
+//$Id: SocialSecurityPhysicalAccount.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.reflection;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class SocialSecurityPhysicalAccount {
+	public String number;
+	public String countryCode;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/TennisMatch.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/TennisMatch.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/TennisMatch.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,21 @@
+//$Id: TennisMatch.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.reflection;
+
+import javax.persistence.AttributeOverride;
+import javax.persistence.AttributeOverrides;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.PrimaryKeyJoinColumn;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at PrimaryKeyJoinColumn(name = "match_id")
+ at AttributeOverrides(
+		{@AttributeOverride(name = "net", column = @Column(name = "net")),
+		@AttributeOverride(name = "line", column = @Column(name = "line"))
+				})
+public class TennisMatch {
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/XMLContextTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/XMLContextTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/XMLContextTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,54 @@
+//$Id: XMLContextTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.reflection;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+import org.dom4j.io.SAXReader;
+import org.hibernate.cfg.EJB3DTDEntityResolver;
+import org.hibernate.cfg.annotations.reflection.XMLContext;
+import org.hibernate.util.XMLHelper;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXNotSupportedException;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class XMLContextTest extends TestCase {
+	public void testAll() throws Exception {
+		XMLHelper xmlHelper = new XMLHelper();
+		ClassLoader cl = Thread.currentThread().getContextClassLoader();
+		InputStream is = cl.getResourceAsStream(
+				"org/hibernate/test/annotations/reflection/orm.xml" );
+		assertNotNull( "ORM.xml not found", is );
+		XMLContext context = new XMLContext();
+		List errors = new ArrayList();
+		SAXReader saxReader = xmlHelper.createSAXReader( "XML InputStream", errors, EJB3DTDEntityResolver.INSTANCE );
+		//saxReader.setValidation( false );
+		try {
+			saxReader.setFeature( "http://apache.org/xml/features/validation/schema", true );
+		}
+		catch (SAXNotSupportedException e) {
+			saxReader.setValidation( false );
+		}
+		org.dom4j.Document doc;
+		try {
+			doc = saxReader
+					.read( new InputSource( new BufferedInputStream( is ) ) );
+		}
+		finally {
+			try {
+				is.close();
+			}
+			catch (IOException ioe) {
+				//log.warn( "Could not close input stream", ioe );
+			}
+		}
+		assertEquals( 0, errors.size() );
+		context.addDocument( doc );
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/metadata-complete.xml
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/metadata-complete.xml	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/metadata-complete.xml	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
+                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_1_0.xsd"
+                 version="1.0"
+        >
+    <persistence-unit-metadata>
+        <xml-mapping-metadata-complete/>
+        <persistence-unit-defaults>
+            <schema>myschema</schema>
+            <catalog>mycatalog</catalog>
+            <cascade-persist/>
+        </persistence-unit-defaults>
+    </persistence-unit-metadata>
+    <package>org.hibernate.test.annotations.reflection</package>
+    <mapped-superclass class="Organization">
+        <attributes>
+            <basic name="organizationId"/>
+        </attributes>
+    </mapped-superclass>
+    <entity class="Administration">
+        <attributes>
+            <id name="id"/>
+        </attributes>
+    </entity>
+    <entity class="Match">
+    </entity>
+    <entity class="SocialSecurityMoralAccount"/>
+    <entity class="BusTrip" access="FIELD">
+        <attributes>
+            <embedded-id name="id">
+                <attribute-override name="busDriver">
+                    <column name="fld_busdriver"/>
+                </attribute-override>
+            </embedded-id>
+            <basic name="status" optional="false">
+                <enumerated>STRING</enumerated>
+            </basic>
+            <basic name="serial" optional="true">
+                <column name="serialbytes"/>
+                <lob/>
+            </basic>
+            <basic name="terminusTime" fetch="LAZY">
+                <temporal>TIMESTAMP</temporal>
+            </basic>
+            <one-to-many name="players">
+                <map-key name="name"/>
+                <join-column name="driver"/>
+                <join-column name="number"/>
+            </one-to-many>
+            <many-to-many name="roads" target-entity="Administration">
+                <order-by>maxSpeed</order-by>
+                <join-table name="bus_road">
+                    <join-column name="driver"/>
+                    <join-column name="number"/>
+                    <inverse-join-column name="road_id"/>
+                    <unique-constraint>
+                        <column-name>driver</column-name>
+                        <column-name>number</column-name>
+                    </unique-constraint>
+                </join-table>
+            </many-to-many>
+        </attributes>
+    </entity>
+    <embeddable class="BusTripPk" access="FIELD">
+        <attributes>
+            <basic name="busDriver">
+                <column name="busdriver"/>
+            </basic>
+            <basic name="busNumber">
+                <column name="busnumber"/>
+            </basic>
+        </attributes>
+    </embeddable>
+</entity-mappings>
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/orm.xml
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/orm.xml	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/reflection/orm.xml	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
+                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_1_0.xsd"
+                 version="1.0"
+        >
+    <persistence-unit-metadata>
+        <persistence-unit-defaults>
+            <schema>myschema</schema>
+            <catalog>mycatalog</catalog>
+            <cascade-persist/>
+            <entity-listeners>
+                <entity-listener class="org.hibernate.test.annotations.reflection.OtherLogListener">
+                    <post-update method-name="log"/>
+                </entity-listener>
+            </entity-listeners>
+        </persistence-unit-defaults>
+    </persistence-unit-metadata>
+    <package>org.hibernate.test.annotations.reflection</package>
+    <entity class="Administration">
+        <table name="tbl_admin">
+            <unique-constraint>
+                <column-name>firstname</column-name>
+                <column-name>lastname</column-name>
+            </unique-constraint>
+        </table>
+        <secondary-table name="admin2">
+            <primary-key-join-column name="admin_id" referenced-column-name="id"/>
+            <unique-constraint>
+                <column-name>address</column-name>
+            </unique-constraint>
+        </secondary-table>
+        <sequence-generator name="seqhilo" sequence-name="seqhilo"/>
+        <table-generator name="table" table="tablehilo"/>
+        <entity-listeners>
+            <entity-listener class="LogListener">
+                <pre-persist method-name="log"/>
+                <post-load method-name="noLog"/>
+            </entity-listener>
+        </entity-listeners>
+        <pre-persist method-name="calculate"/>
+        <attributes>
+            <id name="id">
+                <column name="fld_id"/>
+                <generated-value generator="generator" strategy="SEQUENCE"/>
+                <temporal>DATE</temporal>
+                <sequence-generator name="generator" sequence-name="seq"/>
+            </id>
+            <version name="version"/>
+            <one-to-one name="defaultBusTrip" fetch="LAZY" mapped-by="test">
+                <primary-key-join-column name="pk"/>
+                <cascade>
+                    <cascade-all/>
+                    <cascade-persist/>
+                    <cascade-merge/>
+                    <cascade-remove/>
+                    <cascade-refresh/>
+                </cascade>
+            </one-to-one>
+            <transient name="transientField"/>
+        </attributes>
+    </entity>
+    <entity class="Match">
+        <inheritance strategy="JOINED"/>
+        <named-query name="allmatches">
+            <query>select m from Match m</query>
+            <hint name="org.hibernate.timeout" value="200"/>
+        </named-query>
+        <named-query name="matchbyid">
+            <query>select m from Match m where m.id = :id</query>
+            <hint name="org.hibernate.timeout" value="200"/>
+        </named-query>
+        <named-native-query name="allmatches" result-set-mapping="matchrs">
+            <query>select m from Match m</query>
+            <hint name="org.hibernate.timeout" value="200"/>
+        </named-native-query>
+        <named-native-query name="matchbyid" result-set-mapping="matchrs">
+            <query>select m from Match m where m.id = :id</query>
+            <hint name="org.hibernate.timeout" value="200"/>
+        </named-native-query>
+        <sql-result-set-mapping name="matchrs">
+            <entity-result entity-class="org.hibernate.test.annotations.reflection.Match">
+                <field-result name="competitor1Point" column="competitor1Point"/>
+            </entity-result>
+            <column-result name="competitor1Point"/>
+        </sql-result-set-mapping>
+        <exclude-default-listeners/>
+        <exclude-superclass-listeners/>
+        <entity-listeners>
+            <entity-listener class="LogListener">
+                <pre-persist method-name="log"/>
+                <post-load method-name="noLog"/>
+            </entity-listener>
+        </entity-listeners>
+        <attributes>
+            <embedded name="playerASSN"/>
+        </attributes>
+    </entity>
+    <entity class="TennisMatch">
+        <primary-key-join-column name="id"/>
+        <attribute-override name="net">
+            <column name="fld_net"/>
+        </attribute-override>
+        <attribute-override name="ground">
+            <column name="fld_ground" unique="true" scale="2"/>
+        </attribute-override>
+        <association-override name="referer">
+            <join-column name="referer_id" referenced-column-name="id"/>
+        </association-override>
+    </entity>
+    <entity class="SocialSecurityPhysicalAccount">
+        <id-class class="org.hibernate.test.annotations.reflection.SocialSecurityNumber"/>
+        <discriminator-value>Physical</discriminator-value>
+        <discriminator-column length="34"/>
+    </entity>
+</entity-mappings>
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/strategy/Location.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/strategy/Location.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/strategy/Location.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,26 @@
+//$Id: Location.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.strategy;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Location {
+	private String city;
+	private String country;
+
+	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;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/strategy/Storm.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/strategy/Storm.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/strategy/Storm.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,62 @@
+//$Id: Storm.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.strategy;
+
+import javax.persistence.Column;
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.UniqueConstraint;
+import javax.persistence.Table;
+
+import org.hibernate.annotations.Index;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(uniqueConstraints = {@UniqueConstraint(columnNames = {"start.country", "start.city"})})
+public class Storm {
+	private Integer id;
+	private Location start;
+	private Location end;
+	private String stormName;
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	@Embedded
+	public Location getStart() {
+		return start;
+	}
+
+	public void setStart(Location start) {
+		this.start = start;
+	}
+
+	@Embedded
+	public Location getEnd() {
+		return end;
+	}
+
+	public void setEnd(Location end) {
+		this.end = end;
+	}
+
+	@Index(name="storm_name_idx")
+	@Column(unique = true)
+	public String getStormName() {
+		return stormName;
+	}
+
+	public void setStormName(String name) {
+		this.stormName = name;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/strategy/StrategyTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/strategy/StrategyTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/strategy/StrategyTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,44 @@
+//$Id: StrategyTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.strategy;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.DefaultComponentSafeNamingStrategy;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class StrategyTest extends TestCase {
+
+	public void testComponentSafeStrategy() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Location start = new Location();
+		start.setCity( "Paris" );
+		start.setCountry( "France" );
+		Location end = new Location();
+		end.setCity( "London" );
+		end.setCountry( "UK" );
+		Storm storm = new Storm();
+		storm.setEnd( end );
+		storm.setStart( start );
+		s.persist( storm );
+		s.flush();
+		tx.rollback();
+		s.close();
+	}
+
+	protected void configure(Configuration cfg) {
+		cfg.setNamingStrategy( DefaultComponentSafeNamingStrategy.INSTANCE );
+		//cfg.getSessionEventListenerConfig().setFlushEventListener( new EJB3FlushEventListener() );
+		//cfg.getSessionEventListenerConfig().setAutoFlushEventListener( new EJB3AutoFlushEventListener() );
+	}
+
+	protected Class[] getMappings() {
+		return new Class[]{
+				Storm.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tableperclass/Component.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tableperclass/Component.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tableperclass/Component.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,53 @@
+//$Id: Component.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.tableperclass;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+
+import org.hibernate.annotations.Index;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity(name = "xpmComponent")
+ at Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+public abstract class Component {
+	private String manufacturerPartNumber;
+	private Long manufacturerId;
+	private Long id;
+
+
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+
+	@Id
+	public Long getId() {
+		return id;
+	}
+
+	@Column(nullable = false)
+	@Index(name = "manufacturerPartNumber")
+	public String getManufacturerPartNumber() {
+		return manufacturerPartNumber;
+	}
+
+	@Column(nullable = false)
+	public Long getManufacturerId() {
+		return manufacturerId;
+	}
+
+	public void setManufacturerId(Long manufacturerId) {
+		this.manufacturerId = manufacturerId;
+	}
+
+
+	public void setManufacturerPartNumber(String manufacturerPartNumber) {
+		this.manufacturerPartNumber = manufacturerPartNumber;
+	}
+}
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tableperclass/Machine.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tableperclass/Machine.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tableperclass/Machine.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,37 @@
+//$Id: Machine.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.tableperclass;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+public class Machine {
+	private Integer id;
+	private Double weight;
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.TABLE)
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public Double getWeight() {
+		return weight;
+	}
+
+	public void setWeight(Double weight) {
+		this.weight = weight;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tableperclass/Product.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tableperclass/Product.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tableperclass/Product.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,15 @@
+//$Id: Product.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.tableperclass;
+
+import javax.persistence.Entity;
+import javax.persistence.Table;
+import javax.persistence.UniqueConstraint;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table( name = "xPM_Product", uniqueConstraints = {@UniqueConstraint( columnNames = {
+		"manufacturerPartNumber", "manufacturerId"} )} )
+public class Product extends Component {
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tableperclass/Robot.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tableperclass/Robot.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tableperclass/Robot.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,20 @@
+//$Id: Robot.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.tableperclass;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Robot extends Machine {
+	private String name;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tableperclass/T800.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tableperclass/T800.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tableperclass/T800.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,20 @@
+//$Id: T800.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.tableperclass;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class T800 extends Robot {
+	public String getTargetName() {
+		return targetName;
+	}
+
+	public void setTargetName(String targetName) {
+		this.targetName = targetName;
+	}
+
+	private String targetName;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tableperclass/TablePerClassTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tableperclass/TablePerClassTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tableperclass/TablePerClassTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,90 @@
+//$Id: TablePerClassTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.tableperclass;
+
+import java.util.List;
+import java.sql.SQLException;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.JDBCException;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class TablePerClassTest extends TestCase {
+	public void testUnionSubClass() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Machine computer = new Machine();
+		computer.setWeight( new Double( 4 ) );
+		Robot asimov = new Robot();
+		asimov.setWeight( new Double( 120 ) );
+		asimov.setName( "Asimov" );
+		T800 terminator = new T800();
+		terminator.setName( "Terminator" );
+		terminator.setWeight( new Double( 300 ) );
+		terminator.setTargetName( "Sarah Connor" );
+		s.persist( computer );
+		s.persist( asimov );
+		s.persist( terminator );
+		tx.commit();
+		s.close();
+		s = openSession();
+		tx = s.beginTransaction();
+		Query q = s.createQuery( "from Machine m where m.weight >= :weight" );
+		q.setDouble( "weight", new Double( 10 ) );
+		List result = q.list();
+		assertEquals( 2, result.size() );
+		tx.commit();
+		s.close();
+		s = openSession();
+		tx = s.beginTransaction();
+		tx.commit();
+		s.close();
+	}
+
+	public void testConstraintsOnSuperclassProperties() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Product product1 = new Product();
+		product1.setId( 1l );
+		product1.setManufacturerId( 1l );
+		product1.setManufacturerPartNumber( "AAFR");
+		s.persist( product1 );
+		s.flush();
+		Product product2 = new Product();
+		product2.setId( 2l );
+		product2.setManufacturerId( 1l );
+		product2.setManufacturerPartNumber( "AAFR");
+		s.persist( product2 );
+		try {
+			s.flush();
+			fail("Database Exception not handled");
+		}
+		catch( JDBCException e ) {
+			//success
+		}
+		tx.rollback();
+		s.close();
+	}
+
+	
+
+	public TablePerClassTest(String x) {
+		super( x );	//To change body of overridden methods use File | Settings | File Templates.
+	}
+
+	protected Class[] getMappings() {
+		return new Class[]{
+				Robot.class,
+				T800.class,
+				Machine.class,
+				Component.class,
+				Product.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/target/Brand.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/target/Brand.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/target/Brand.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,56 @@
+//$Id: Brand.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.target;
+
+import java.util.Map;
+import java.util.HashMap;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.ManyToMany;
+
+import org.hibernate.annotations.MapKey;
+import org.hibernate.annotations.CollectionOfElements;
+import org.hibernate.annotations.MapKeyManyToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Brand {
+	@Id
+	@GeneratedValue
+	private Long id;
+
+	@ManyToMany(targetEntity = LuggageImpl.class)
+	@MapKey(targetElement = SizeImpl.class)
+	private Map<Size, Luggage> luggagesBySize = new HashMap<Size, Luggage>();
+
+	@CollectionOfElements(targetElement = SizeImpl.class)
+	@MapKeyManyToMany(targetEntity = LuggageImpl.class)
+	private Map<Luggage, Size> sizePerLuggage = new HashMap<Luggage, Size>();
+
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Map<Size, Luggage> getLuggagesBySize() {
+		return luggagesBySize;
+	}
+
+	public void setLuggagesBySize(Map<Size, Luggage> luggagesBySize) {
+		this.luggagesBySize = luggagesBySize;
+	}
+
+	public Map<Luggage, Size> getSizePerLuggage() {
+		return sizePerLuggage;
+	}
+
+	public void setSizePerLuggage(Map<Luggage, Size> sizePerLuggage) {
+		this.sizePerLuggage = sizePerLuggage;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/target/Luggage.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/target/Luggage.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/target/Luggage.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,17 @@
+//$Id: Luggage.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.target;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface Luggage {
+	double getHeight();
+	double getWidth();
+
+	void setHeight(double height);
+	void setWidth(double width);
+
+	Owner getOwner();
+
+	void setOwner(Owner owner);
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/target/LuggageImpl.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/target/LuggageImpl.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/target/LuggageImpl.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,57 @@
+//$Id: LuggageImpl.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.target;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.ManyToOne;
+import javax.persistence.Embedded;
+
+import org.hibernate.annotations.Target;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class LuggageImpl implements Luggage {
+	private Long id;
+	private double height;
+	private double width;
+	private Owner owner;
+
+	@Embedded
+	@Target(OwnerImpl.class)
+	public Owner getOwner() {
+		return owner;
+	}
+
+	public void setOwner(Owner owner) {
+		this.owner = owner;
+	}
+
+	@Id
+	@GeneratedValue
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public double getHeight() {
+		return height;
+	}
+
+	public void setHeight(double height) {
+		this.height = height;
+	}
+
+	public double getWidth() {
+		return width;
+	}
+
+	public void setWidth(double width) {
+		this.width = width;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/target/Owner.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/target/Owner.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/target/Owner.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,12 @@
+//$Id: Owner.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.target;
+
+import java.util.Map;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface Owner {
+	String getName();
+	void setName(String name);
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/target/OwnerImpl.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/target/OwnerImpl.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/target/OwnerImpl.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,24 @@
+//$Id: OwnerImpl.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.target;
+
+import java.util.Map;
+import java.util.HashMap;
+import javax.persistence.Embeddable;
+import org.hibernate.annotations.MapKey;
+import javax.persistence.ManyToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class OwnerImpl implements Owner {
+	private String name;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/target/Size.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/target/Size.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/target/Size.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,10 @@
+//$Id: Size.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.target;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface Size {
+	String getName();
+	void setName(String name);
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/target/SizeImpl.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/target/SizeImpl.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/target/SizeImpl.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,20 @@
+//$Id: SizeImpl.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.target;
+
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class SizeImpl implements Size {
+	private String name;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/target/TargetTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/target/TargetTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/target/TargetTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,82 @@
+//$Id: TargetTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.target;
+
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.Session;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class TargetTest extends TestCase {
+
+	public void testTargetOnEmbedded() throws Exception {
+		Session s = openSession();
+		s.getTransaction().begin();
+		Luggage l = new LuggageImpl();
+		l.setHeight( 12 );
+		l.setWidth( 12 );
+		Owner o = new OwnerImpl();
+		o.setName( "Emmanuel" );
+		l.setOwner( o );
+		s.persist( l );
+		s.flush();
+		s.clear();
+		l = (Luggage) s.get(LuggageImpl.class, ( (LuggageImpl) l).getId() );
+		assertEquals( "Emmanuel", l.getOwner().getName() );
+		s.getTransaction().rollback();
+		s.close();
+	}
+
+	public void testTargetOnMapKey() throws Exception {
+		Session s = openSession();
+		s.getTransaction().begin();
+		Luggage l = new LuggageImpl();
+		l.setHeight( 12 );
+		l.setWidth( 12 );
+		Size size = new SizeImpl();
+		size.setName( "S" );
+		Owner o = new OwnerImpl();
+		o.setName( "Emmanuel" );
+		l.setOwner( o );
+		s.persist( l );
+		Brand b = new Brand();
+		s.persist( b );
+		b.getLuggagesBySize().put( size, l );
+		s.flush();
+		s.clear();
+		b = (Brand) s.get(Brand.class, b.getId() );
+		assertEquals( "S", b.getLuggagesBySize().keySet().iterator().next().getName() );
+		s.getTransaction().rollback();
+		s.close();
+	}
+
+	public void testTargetOnMapKeyManyToMany() throws Exception {
+		Session s = openSession();
+		s.getTransaction().begin();
+		Luggage l = new LuggageImpl();
+		l.setHeight( 12 );
+		l.setWidth( 12 );
+		Size size = new SizeImpl();
+		size.setName( "S" );
+		Owner o = new OwnerImpl();
+		o.setName( "Emmanuel" );
+		l.setOwner( o );
+		s.persist( l );
+		Brand b = new Brand();
+		s.persist( b );
+		b.getSizePerLuggage().put( l, size );
+		s.flush();
+		s.clear();
+		b = (Brand) s.get(Brand.class, b.getId() );
+		assertEquals( 12d, b.getSizePerLuggage().keySet().iterator().next().getWidth() );
+		s.getTransaction().rollback();
+		s.close();
+	}
+
+	protected Class[] getMappings() {
+		return new Class[] {
+				LuggageImpl.class,
+				Brand.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/Country.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/Country.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/Country.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,15 @@
+//$Id: Country.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.tuplizer;
+
+import javax.persistence.Embeddable;
+import javax.persistence.Column;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public interface Country {
+	@Column(name = "CountryName")
+	public String getName();
+	public void setName(String name);
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/Cuisine.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/Cuisine.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/Cuisine.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,29 @@
+//$Id: Cuisine.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.tuplizer;
+
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Entity;
+
+import org.hibernate.annotations.Tuplizer;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Tuplizer(impl = DynamicEntityTuplizer.class)
+public interface Cuisine {
+	@Id
+	@GeneratedValue
+	public Long getId();
+	public void setId(Long id);
+
+	public String getName();
+	public void setName(String name);
+
+	@Tuplizer(impl = DynamicComponentTuplizer.class)
+	public Country getCountry();
+	public void setCountry(Country country);
+
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/DataProxyHandler.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/DataProxyHandler.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/DataProxyHandler.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,53 @@
+//$Id: DataProxyHandler.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.tuplizer;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.io.Serializable;
+
+/**
+ * A simple {@link java.lang.reflect.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;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/DynamicComponentTuplizer.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/DynamicComponentTuplizer.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/DynamicComponentTuplizer.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,29 @@
+//$Id: DynamicComponentTuplizer.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.tuplizer;
+
+import org.hibernate.tuple.entity.PojoEntityTuplizer;
+import org.hibernate.tuple.entity.EntityMetamodel;
+import org.hibernate.tuple.Instantiator;
+import org.hibernate.tuple.component.PojoComponentTuplizer;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.Component;
+import org.hibernate.proxy.ProxyFactory;
+import org.hibernate.property.Getter;
+import org.hibernate.property.Setter;
+import org.hibernate.HibernateException;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class DynamicComponentTuplizer extends PojoComponentTuplizer {
+
+	public DynamicComponentTuplizer(Component component) {
+		super( component );
+	}
+
+
+	protected Instantiator buildInstantiator(Component component) {
+		return new DynamicInstantiator( component.getComponentClassName() );	//To change body of overridden methods use File | Settings | File Templates.
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/DynamicEntityTuplizer.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/DynamicEntityTuplizer.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/DynamicEntityTuplizer.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,32 @@
+//$Id: DynamicEntityTuplizer.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.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 Emmanuel Bernard
+ */
+public class DynamicEntityTuplizer extends PojoEntityTuplizer {
+
+		public DynamicEntityTuplizer(EntityMetamodel entityMetamodel, PersistentClass mappedEntity) {
+			super( entityMetamodel, mappedEntity );
+		}
+
+		protected Instantiator buildInstantiator(PersistentClass persistentClass) {
+			return new DynamicInstantiator( 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 );
+		}
+	}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/DynamicInstantiator.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/DynamicInstantiator.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/DynamicInstantiator.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,56 @@
+//$Id: DynamicInstantiator.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.tuplizer;
+
+import java.io.Serializable;
+import java.lang.reflect.Proxy;
+import java.lang.reflect.InvocationHandler;
+
+import org.hibernate.tuple.Instantiator;
+import org.hibernate.util.ReflectHelper;
+import org.hibernate.HibernateException;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class DynamicInstantiator implements Instantiator {
+	private final String entityName;
+
+	public DynamicInstantiator(String entityName) {
+		this.entityName = entityName;
+	}
+
+	public Object instantiate(Serializable id) {
+		if ( Cuisine.class.getName().equals( entityName ) ) {
+			return ProxyHelper.newCuisineProxy( id );
+		}
+		if ( Country.class.getName().equals( entityName ) ) {
+			return ProxyHelper.newCountryProxy( 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 );
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/EntityNameInterceptor.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/EntityNameInterceptor.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/EntityNameInterceptor.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,25 @@
+//$Id: EntityNameInterceptor.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.tuplizer;
+
+import org.hibernate.EmptyInterceptor;
+
+/**
+ * @author Emmanuel Bernard
+ */
+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;
+	}
+}
+

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/ProxyHelper.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/ProxyHelper.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/ProxyHelper.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,50 @@
+//$Id: ProxyHelper.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.tuplizer;
+
+import java.io.Serializable;
+import java.lang.reflect.Proxy;
+import java.lang.reflect.InvocationHandler;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ProxyHelper {
+
+	public static Country newPersonProxy() {
+		return newCountryProxy( null );
+	}
+
+	public static Country newCountryProxy(Serializable id) {
+		return ( Country ) Proxy.newProxyInstance(
+				Country.class.getClassLoader(),
+		        new Class[] {Country.class},
+		        new DataProxyHandler( Country.class.getName(), id )
+		);
+	}
+
+	public static Cuisine newCustomerProxy() {
+		return newCuisineProxy( null );
+	}
+
+	public static Cuisine newCuisineProxy(Serializable id) {
+		return ( Cuisine ) Proxy.newProxyInstance(
+				Cuisine.class.getClassLoader(),
+		        new Class[] {Cuisine.class},
+		        new DataProxyHandler( Cuisine.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;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/TuplizerTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/TuplizerTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/tuplizer/TuplizerTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,34 @@
+//$Id: TuplizerTest.java 16289 2009-04-09 22:09:50Z gbadner $
+package org.hibernate.test.annotations.tuplizer;
+
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.Session;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class TuplizerTest extends TestCase {
+	public void testEntityTuplizer() throws Exception {
+		Cuisine cuisine = ProxyHelper.newCuisineProxy( null );
+		cuisine.setName( "Francaise" );
+		Country country = ProxyHelper.newCountryProxy( null );
+		country.setName( "France" );
+		cuisine.setCountry( country );
+		Session s = openSession( new EntityNameInterceptor() );
+		s.getTransaction().begin();
+		s.persist( cuisine );
+		s.flush();
+		s.clear();
+		cuisine = (Cuisine) s.get(Cuisine.class, cuisine.getId() );
+		assertNotNull( cuisine );
+		assertEquals( "Francaise", cuisine.getName() );
+		assertEquals( "France", country.getName() );
+		s.getTransaction().rollback();
+		s.close();
+	}
+	protected Class[] getMappings() {
+		return new Class[] {
+				Cuisine.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/type/Dvd.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/type/Dvd.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/type/Dvd.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,48 @@
+//$Id: Dvd.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.type;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+import org.hibernate.annotations.Columns;
+import org.hibernate.annotations.GenericGenerator;
+import org.hibernate.annotations.Type;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Dvd {
+	private MyOid id;
+	private String title;
+
+	@Id
+	@GeneratedValue(generator = "custom-id")
+	@GenericGenerator(name = "custom-id", strategy = "org.hibernate.test.annotations.type.MyOidGenerator")
+	@Type(type = "org.hibernate.test.annotations.type.MyOidType")
+	@Columns(
+			columns = {
+			@Column(name = "high"),
+			@Column(name = "middle"),
+			@Column(name = "low"),
+			@Column(name = "other")
+					}
+	)
+	public MyOid getId() {
+		return id;
+	}
+
+	public void setId(MyOid id) {
+		this.id = id;
+	}
+
+	public String getTitle() {
+		return title;
+	}
+
+	public void setTitle(String title) {
+		this.title = title;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/type/MyOid.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/type/MyOid.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/type/MyOid.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,79 @@
+//$Id: MyOid.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.type;
+
+import java.io.Serializable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class MyOid implements Serializable {
+	private int high;
+	private int middle;
+	private int low;
+	private int other;
+
+	protected MyOid() {
+	}
+
+	public MyOid(int aHigh, int aMiddle, int aLow, int aOther) {
+		high = aHigh;
+		middle = aMiddle;
+		low = aLow;
+		other = aOther;
+	}
+
+	public int getHigh() {
+		return high;
+	}
+
+	public void setHigh(int aHigh) {
+		high = aHigh;
+	}
+
+	public int getMiddle() {
+		return middle;
+	}
+
+	public void setMiddle(int aMiddle) {
+		middle = aMiddle;
+	}
+
+	public int getLow() {
+		return low;
+	}
+
+	public void setLow(int aLow) {
+		low = aLow;
+	}
+
+	public int getOther() {
+		return other;
+	}
+
+	public void setOther(int aOther) {
+		other = aOther;
+	}
+
+	public boolean equals(Object o) {
+		if ( this == o ) return true;
+		if ( o == null || getClass() != o.getClass() ) return false;
+
+		final MyOid myOid = (MyOid) o;
+
+		if ( high != myOid.high ) return false;
+		if ( low != myOid.low ) return false;
+		if ( middle != myOid.middle ) return false;
+		if ( other != myOid.other ) return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		int result;
+		result = low;
+		result = 29 * result + middle;
+		result = 29 * result + high;
+		result = 29 * result + other;
+		return result;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/type/MyOidGenerator.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/type/MyOidGenerator.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/type/MyOidGenerator.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,22 @@
+//$Id: MyOidGenerator.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.type;
+
+import java.io.Serializable;
+
+import org.hibernate.HibernateException;
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.id.IdentifierGenerator;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class MyOidGenerator implements IdentifierGenerator {
+
+	private int counter;
+
+	public Serializable generate(SessionImplementor aSessionImplementor, Object aObject) throws HibernateException {
+		counter++;
+		return new MyOid( 0, 0, 0, counter );
+	}
+}
+

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/type/MyOidType.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/type/MyOidType.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/type/MyOidType.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,147 @@
+//$Id: MyOidType.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.type;
+
+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.SessionImplementor;
+import org.hibernate.type.Type;
+import org.hibernate.usertype.CompositeUserType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class MyOidType implements CompositeUserType {
+
+	public static final String[] PROPERTY_NAMES = new String[]{"high", "middle", "low", "other"};
+	public static final Type[] TYPES = new Type[]{Hibernate.INTEGER, Hibernate.INTEGER, Hibernate.INTEGER, Hibernate.INTEGER};
+
+
+	public String[] getPropertyNames() {
+		return PROPERTY_NAMES;
+	}
+
+	public Type[] getPropertyTypes() {
+		return TYPES;
+	}
+
+	public Object getPropertyValue(Object aObject, int i) throws HibernateException {
+		MyOid dbOid = (MyOid) aObject;
+		switch ( i ) {
+			case 0:
+				return dbOid.getHigh();
+			case 1:
+				return dbOid.getMiddle();
+			case 2:
+				return dbOid.getLow();
+			case 3:
+				return dbOid.getOther();
+			default:
+				throw new HibernateException( "Unsupported property index " + i );
+		}
+
+	}
+
+	public void setPropertyValue(Object aObject, int i, Object aObject1) throws HibernateException {
+		MyOid dbOid = (MyOid) aObject;
+		switch ( i ) {
+			case 0:
+				dbOid.setHigh( (Integer) aObject1 );
+			case 1:
+				dbOid.setMiddle( (Integer) aObject1 );
+			case 2:
+				dbOid.setLow( (Integer) aObject1 );
+			case 3:
+				dbOid.setOther( (Integer) aObject1 );
+			default:
+				throw new HibernateException( "Unsupported property index " + i );
+		}
+	}
+
+	public Class returnedClass() {
+		return MyOid.class;
+	}
+
+	public boolean equals(Object x, Object y) throws HibernateException {
+		if ( x == y ) return true;
+		if ( x == null || y == null ) return false;
+
+		MyOid oid1 = (MyOid) x;
+		MyOid oid2 = (MyOid) y;
+
+		if ( oid1.getHigh() != oid2.getHigh() ) {
+			return false;
+		}
+		if ( oid1.getMiddle() != oid2.getMiddle() ) {
+			return false;
+		}
+		if ( oid1.getLow() != oid2.getLow() ) {
+			return false;
+		}
+		return oid1.getOther() == oid2.getOther();
+
+	}
+
+	public int hashCode(Object aObject) throws HibernateException {
+		return aObject.hashCode();
+	}
+
+	public Object nullSafeGet(
+			ResultSet aResultSet, String[] names, SessionImplementor aSessionImplementor, Object aObject
+	) throws HibernateException, SQLException {
+		Integer highval = (Integer) Hibernate.INTEGER.nullSafeGet( aResultSet, names[0] );
+		Integer midval = (Integer) Hibernate.INTEGER.nullSafeGet( aResultSet, names[1] );
+		Integer lowval = (Integer) Hibernate.INTEGER.nullSafeGet( aResultSet, names[2] );
+		Integer other = (Integer) Hibernate.INTEGER.nullSafeGet( aResultSet, names[3] );
+
+		return new MyOid( highval, midval, lowval, other );
+	}
+
+	public void nullSafeSet(
+			PreparedStatement aPreparedStatement, Object value, int index, SessionImplementor aSessionImplementor
+	) throws HibernateException, SQLException {
+		MyOid c;
+		if ( value == null ) {
+			// todo is this correct?
+			throw new HibernateException( "Oid object may not be null" );
+		}
+		else {
+			c = (MyOid) value;
+		}
+
+		Hibernate.INTEGER.nullSafeSet( aPreparedStatement, c.getHigh(), index );
+		Hibernate.INTEGER.nullSafeSet( aPreparedStatement, c.getMiddle(), index + 1 );
+		Hibernate.INTEGER.nullSafeSet( aPreparedStatement, c.getLow(), index + 2 );
+		Hibernate.INTEGER.nullSafeSet( aPreparedStatement, c.getOther(), index + 3 );
+	}
+
+	public Object deepCopy(Object aObject) throws HibernateException {
+		MyOid oldOid = (MyOid) aObject;
+
+		return new MyOid( oldOid.getHigh(), oldOid.getMiddle(), oldOid.getLow(), oldOid.getOther() );
+	}
+
+	public boolean isMutable() {
+		return false;
+	}
+
+	public Serializable disassemble(Object value, SessionImplementor aSessionImplementor) throws HibernateException {
+		return (Serializable) deepCopy( value );
+	}
+
+	public Object assemble(Serializable cached, SessionImplementor aSessionImplementor, Object aObject)
+			throws HibernateException {
+		return deepCopy( cached );
+	}
+
+	public Object replace(Object original, Object target, SessionImplementor aSessionImplementor, Object aObject2)
+			throws HibernateException {
+		// we are immutable. return original
+		return original;
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/type/TypeTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/type/TypeTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/type/TypeTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,31 @@
+//$Id: TypeTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.type;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class TypeTest extends TestCase {
+	public void testIdWithMulticolumns() throws Exception {
+		Session s;
+		Transaction tx;
+		s = openSession();
+		tx = s.beginTransaction();
+		Dvd lesOiseaux = new Dvd();
+		lesOiseaux.setTitle( "Les oiseaux" );
+		s.persist( lesOiseaux );
+		s.flush();
+		assertNotNull( lesOiseaux.getId() );
+		tx.rollback();
+		s.close();
+	}
+
+	protected Class[] getMappings() {
+		return new Class[]{
+				Dvd.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/various/Antenna.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/various/Antenna.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/various/Antenna.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,25 @@
+//$Id: Antenna.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.various;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Column;
+
+import org.hibernate.annotations.Generated;
+import org.hibernate.annotations.GenerationTime;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Antenna {
+	@Id public Integer id;
+	@Generated(GenerationTime.ALWAYS) @Column()
+	public String longitude;
+
+	@Generated(GenerationTime.INSERT) @Column(insertable = false)
+	public String latitude;
+
+	@Generated(GenerationTime.NEVER)
+	public Double power;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/various/Conductor.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/various/Conductor.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/various/Conductor.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,54 @@
+//$Id: Conductor.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.various;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Version;
+
+import org.hibernate.annotations.Index;
+import org.hibernate.annotations.OptimisticLock;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Conductor {
+	@Id
+	@GeneratedValue
+	private Integer id;
+
+	@Column(name = "cond_name")
+	@Index(name = "cond_name")
+	@OptimisticLock(excluded = true)
+	private String name;
+
+	@Version
+	private Long version;
+
+
+	public Long getVersion() {
+		return version;
+	}
+
+	public void setVersion(Long version) {
+		this.version = version;
+	}
+
+	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;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/various/GeneratedTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/various/GeneratedTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/various/GeneratedTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,30 @@
+//$Id: GeneratedTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.various;
+
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class GeneratedTest extends TestCase {
+
+	public void testGenerated() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Antenna antenna = new Antenna();
+		antenna.id = new Integer(1);
+		s.persist( antenna );
+		assertNull( antenna.latitude );
+		assertNull( antenna.longitude );
+		tx.rollback();
+		s.close();
+	}
+
+	protected Class[] getMappings() {
+		return new Class[] {
+				Antenna.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/various/IndexTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/various/IndexTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/various/IndexTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,63 @@
+//$Id: IndexTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.various;
+
+import java.util.Date;
+
+import org.hibernate.Session;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class IndexTest extends TestCase {
+	public void testIndexManyToOne() throws Exception {
+		//TODO find a way to test indexes???
+		Session s = openSession();
+		s.getTransaction().begin();
+		Conductor emmanuel = new Conductor();
+		emmanuel.setName( "Emmanuel" );
+		s.persist( emmanuel );
+		Vehicule tank = new Vehicule();
+		tank.setCurrentConductor( emmanuel );
+		tank.setRegistrationNumber( "324VX43" );
+		s.persist( tank );
+		s.flush();
+		s.delete( tank );
+		s.delete( emmanuel );
+		s.getTransaction().rollback();
+		s.close();
+	}
+
+	public void testIndexAndJoined() throws Exception {
+		Session s = openSession();
+		s.getTransaction().begin();
+		Conductor cond = new Conductor();
+		cond.setName( "Bob" );
+		s.persist( cond );
+		ProfessionalAgreement agreement = new ProfessionalAgreement();
+		agreement.setExpirationDate( new Date() );
+		s.persist( agreement );
+		Truck truck = new Truck();
+		truck.setAgreement( agreement );
+		truck.setWeight( 20 );
+		truck.setRegistrationNumber( "2003424" );
+		truck.setYear( 2005 );
+		truck.setCurrentConductor( cond );
+		s.persist( truck );
+		s.flush();
+		s.delete( truck );
+		s.delete( agreement );
+		s.delete( cond );
+		s.getTransaction().rollback();
+		s.close();
+	}
+
+	protected Class[] getMappings() {
+		return new Class[]{
+				Conductor.class,
+				Vehicule.class,
+				ProfessionalAgreement.class,
+				Truck.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/various/ProfessionalAgreement.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/various/ProfessionalAgreement.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/various/ProfessionalAgreement.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,34 @@
+//$Id: ProfessionalAgreement.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.various;
+
+import java.util.Date;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class ProfessionalAgreement {
+	@Id
+	@GeneratedValue
+	private Integer id;
+	private Date expirationDate;
+
+	public Date getExpirationDate() {
+		return expirationDate;
+	}
+
+	public void setExpirationDate(Date expirationDate) {
+		this.expirationDate = expirationDate;
+	}
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/various/Truck.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/various/Truck.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/various/Truck.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,39 @@
+//$Id: Truck.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.various;
+
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+import org.hibernate.annotations.Index;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Truck extends Vehicule {
+	@Index(name = "weigth_idx")
+	private int weight;
+
+	@ManyToOne
+	@JoinColumn(name = "agreement_id")
+	@Index(name = "agreement_idx")
+	private ProfessionalAgreement agreement;
+
+	public int getWeight() {
+		return weight;
+	}
+
+	public void setWeight(int weight) {
+		this.weight = weight;
+	}
+
+	public ProfessionalAgreement getAgreement() {
+		return agreement;
+	}
+
+	public void setAgreement(ProfessionalAgreement agreement) {
+		this.agreement = agreement;
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/various/Vehicule.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/various/Vehicule.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/various/Vehicule.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,83 @@
+//$Id: Vehicule.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.various;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+import org.hibernate.annotations.GenericGenerator;
+import org.hibernate.annotations.Index;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Inheritance(strategy = InheritanceType.JOINED)
+ at org.hibernate.annotations.Table(appliesTo = "Vehicule",
+		indexes = {
+		@Index(name = "improbableindex", columnNames = {"registration", "Conductor_fk"}),
+		@Index(name = "secondone", columnNames = {"Conductor_fk"})
+				}
+)
+public class Vehicule {
+	@Id
+	@GeneratedValue(generator = "gen")
+	@GenericGenerator(name = "gen", strategy = "uuid")
+	private String id;
+	@Column(name = "registration")
+	private String registrationNumber;
+	@ManyToOne(optional = false)
+	@JoinColumn(name = "Conductor_fk")
+	@Index(name = "thirdone")
+	private Conductor currentConductor;
+	@Index(name = "year_idx")
+	private Integer year;
+	@ManyToOne(optional = true)
+	@Index(name = "forthone")
+	private Conductor previousConductor;
+
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	public String getRegistrationNumber() {
+		return registrationNumber;
+	}
+
+	public void setRegistrationNumber(String registrationNumber) {
+		this.registrationNumber = registrationNumber;
+	}
+
+	public Conductor getCurrentConductor() {
+		return currentConductor;
+	}
+
+	public void setCurrentConductor(Conductor currentConductor) {
+		this.currentConductor = currentConductor;
+	}
+
+	public Integer getYear() {
+		return year;
+	}
+
+	public void setYear(Integer year) {
+		this.year = year;
+	}
+
+	public Conductor getPreviousConductor() {
+		return previousConductor;
+	}
+
+	public void setPreviousConductor(Conductor previousConductor) {
+		this.previousConductor = previousConductor;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/various/VersionTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/various/VersionTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/various/VersionTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,41 @@
+//$Id: VersionTest.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.various;
+
+import org.hibernate.Session;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class VersionTest extends TestCase {
+
+	public void testOptimisticLockDisabled() throws Exception {
+		Conductor c = new Conductor();
+		c.setName( "Bob" );
+		Session s = openSession( );
+		s.getTransaction().begin();
+		s.persist( c );
+		s.flush();
+
+		s.clear();
+
+		c = (Conductor) s.get( Conductor.class, c.getId() );
+		Long version = c.getVersion();
+		c.setName( "Don" );
+		s.flush();
+
+		s.clear();
+
+		c = (Conductor) s.get( Conductor.class, c.getId() );
+		assertEquals( version, c.getVersion() );
+
+		s.getTransaction().rollback();
+		s.close();
+	}
+
+	protected Class[] getMappings() {
+		return new Class[] {
+				Conductor.class
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/CarModel.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/CarModel.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/CarModel.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,19 @@
+//$Id: CarModel.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.xml.ejb3;
+
+import java.util.Date;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class CarModel extends Model {
+	private Date year;
+
+	public Date getYear() {
+		return year;
+	}
+
+	public void setYear(Date year) {
+		this.year = year;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/Ejb3XmlTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/Ejb3XmlTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/Ejb3XmlTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,86 @@
+//$Id: Ejb3XmlTest.java 16301 2009-04-10 23:26:04Z gbadner $
+package org.hibernate.test.annotations.xml.ejb3;
+
+import java.util.Date;
+import java.util.List;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Ejb3XmlTest extends TestCase {
+	public void testEjb3Xml() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		CarModel model = new CarModel();
+		model.setYear( new Date() );
+		Manufacturer manufacturer = new Manufacturer();
+		//s.persist( manufacturer );
+		model.setManufacturer( manufacturer );
+		manufacturer.getModels().add( model );
+		s.persist( model );
+		s.flush();
+		s.clear();
+
+		model.setYear( new Date() );
+		manufacturer = (Manufacturer) s.get( Manufacturer.class, manufacturer.getId() );
+		List<Model> cars = s.getNamedQuery( "allModelsPerManufacturer" )
+				.setParameter( "manufacturer", manufacturer )
+				.list();
+		assertEquals( 1, cars.size() );
+		for ( Model car : cars ) {
+			assertNotNull( car.getManufacturer() );
+			s.delete( manufacturer );
+			s.delete( car );
+		}
+		tx.rollback();
+		s.close();
+	}
+
+	public void testXMLEntityHandled() throws Exception {
+		Session s = openSession();
+		s.getTransaction().begin();
+		Lighter l = new Lighter();
+		l.name = "Blue";
+		l.power = "400F";
+		s.persist( l );
+		s.flush();
+		s.getTransaction().rollback();
+		s.close();
+	}
+
+	public void testXmlDefaultOverriding() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Manufacturer manufacturer = new Manufacturer();
+		s.persist( manufacturer );
+		s.flush();
+		s.clear();
+
+		assertEquals( 1, s.getNamedQuery( "manufacturer.findAll" ).list().size() );
+		tx.rollback();
+		s.close();
+	}
+
+	protected Class[] getMappings() {
+		return new Class[]{
+				CarModel.class,
+				Manufacturer.class,
+				Model.class,
+				Light.class
+				//Lighter.class xml only entuty
+		};
+	}
+
+	@Override
+	protected String[] getXmlFiles() {
+		return new String[]{
+				"org/hibernate/test/annotations/xml/ejb3/orm.xml",
+				"org/hibernate/test/annotations/xml/ejb3/orm2.xml",
+				"org/hibernate/test/annotations/xml/ejb3/orm3.xml"
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/Light.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/Light.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/Light.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,10 @@
+//$Id: Light.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.xml.ejb3;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Light {
+	public String name;
+	public String power;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/Lighter.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/Lighter.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/Lighter.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,10 @@
+//$Id: Lighter.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.xml.ejb3;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Lighter {
+	public String name;
+	public String power;
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/Manufacturer.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/Manufacturer.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/Manufacturer.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,39 @@
+//$Id: Manufacturer.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.xml.ejb3;
+
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.NamedQuery;
+import javax.persistence.TableGenerator;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at NamedQuery(name="manufacturer.findAll", query = "from Manufacturer where 1 = 2")
+ at TableGenerator(name="generator", table = "this is a broken name with select from and other SQL keywords")
+public class Manufacturer {
+	private Integer id;
+	private Set<Model> models = new HashSet<Model>();
+
+	@Id
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	@OneToMany
+	public Set<Model> getModels() {
+		return models;
+	}
+
+	public void setModels(Set<Model> models) {
+		this.models = models;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/Model.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/Model.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/Model.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,26 @@
+//$Id: Model.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.xml.ejb3;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Model {
+	private Integer id;
+	private Manufacturer manufacturer;
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public Manufacturer getManufacturer() {
+		return manufacturer;
+	}
+
+	public void setManufacturer(Manufacturer manufacturer) {
+		this.manufacturer = manufacturer;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/orm.xml
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/orm.xml	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/orm.xml	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
+                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                 version="1.0"
+        >
+    <!-- no grammar specified should pass -->
+    <persistence-unit-metadata>
+        <persistence-unit-defaults>
+            <cascade-persist/>
+        </persistence-unit-defaults>
+    </persistence-unit-metadata>
+    <package>org.hibernate.test.annotations.xml.ejb3</package>
+    <table-generator name="generator" table="table_id"/>
+    <named-query name="manufacturer.findAll">
+        <query>select m from Manufacturer m</query>
+    </named-query>
+    <entity class="Model" access="PROPERTY" name="ModelZ" metadata-complete="true">
+        <table name="ModelZ">
+        </table>
+        <inheritance strategy="JOINED"/>
+        <attributes>
+            <id name="id">
+                <column name="fld_id"/>
+                <generated-value strategy="TABLE" generator="generator"/>
+            </id>
+            <basic name="unknownProperty"/>
+            <many-to-one name="manufacturer" fetch="LAZY">
+                <join-column name="manufacturer_pk"/>
+            </many-to-one>
+        </attributes>
+    </entity>
+    <entity class="CarModel" metadata-complete="true">
+        <primary-key-join-column name="model_id"/>
+        <inheritance strategy="JOINED"/>
+        <named-query name="allModelsPerManufacturer">
+            <query>from ModelZ m where m.manufacturer = :manufacturer</query>
+            <hint name="org.hibernate.timeout" value="200"/>
+        </named-query>
+        <exclude-default-listeners/>
+        <exclude-superclass-listeners/>
+        <attributes>
+            <basic name="year" optional="false">
+                <temporal>DATE</temporal>
+            </basic>
+        </attributes>
+    </entity>
+    <entity class="Manufacturer">
+        <attributes>
+            <id name="id">
+                <generated-value strategy="AUTO"/>
+            </id>
+            <one-to-many name="models" mapped-by="manufacturer"/>
+        </attributes>
+    </entity>
+</entity-mappings>
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/orm2.xml
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/orm2.xml	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/orm2.xml	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
+                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_1_0.xsd"
+                 version="1.0"
+        >
+    <package>org.hibernate.test.annotations.xml.ejb3</package>
+    <entity class="Light" access="FIELD" metadata-complete="true">
+        <attributes>
+            <id name="name">
+                <column name="fld_id"/>
+            </id>
+            <basic name="power"></basic>
+        </attributes>
+    </entity>
+</entity-mappings>
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/orm3.xml
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/orm3.xml	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/ejb3/orm3.xml	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
+                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_1_0.xsd"
+                 version="1.0"
+        >
+    <package>org.hibernate.test.annotations.xml.ejb3</package>
+    <entity class="Lighter" access="FIELD" metadata-complete="true">
+        <attributes>
+            <id name="name">
+                <column name="fld_id"/>
+            </id>
+            <basic name="power"></basic>
+        </attributes>
+    </entity>
+</entity-mappings>
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/A.hbm.xml
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/A.hbm.xml	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/A.hbm.xml	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<!-- Generated Nov 9, 2006 6:27:53 PM by Hibernate Tools 3.2.0.beta7 -->
+<hibernate-mapping>
+    <class name="org.hibernate.test.annotations.xml.hbm.AImpl" table="A"
+           proxy="org.hibernate.test.annotations.xml.hbm.A">
+        <id name="AId" column="aID" type="java.lang.Integer">
+            <generator class="identity"/>
+        </id>
+    </class>
+</hibernate-mapping>
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/A.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/A.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/A.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,11 @@
+//$Id: A.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.xml.hbm;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface A extends java.io.Serializable {
+	public Integer getAId();
+
+	public void setAId(Integer aId);
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/AImpl.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/AImpl.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/AImpl.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,34 @@
+//$Id: AImpl.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.xml.hbm;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+
+ at Entity
+ at Inheritance( strategy = InheritanceType.JOINED )
+ at org.hibernate.annotations.Proxy( proxyClass = A.class )
+ at Table( name = "A" )
+public class AImpl implements A {
+	private static final long serialVersionUID = 1L;
+
+	private Integer aId = 0;
+
+	public AImpl() {
+	}
+
+	@Id
+	@GeneratedValue
+	@Column( name = "aID" )
+	public Integer getAId() {
+		return this.aId;
+	}
+
+	public void setAId(Integer aId) {
+		this.aId = aId;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/B.hbm.xml
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/B.hbm.xml	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/B.hbm.xml	2009-11-24 21:03:15 UTC (rev 18049)
@@ -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">
+<!-- Generated Nov 9, 2006 6:27:53 PM by Hibernate Tools 3.2.0.beta7 -->
+<hibernate-mapping>
+    <joined-subclass name="org.hibernate.test.annotations.xml.hbm.BImpl" table="B"
+                     proxy="org.hibernate.test.annotations.xml.hbm.B"
+                     extends="org.hibernate.test.annotations.xml.hbm.AImpl">
+        <key column="aID"/>
+        <property name="BId" column="bID" type="java.lang.Integer"
+                  not-null="true"/>
+    </joined-subclass>
+</hibernate-mapping>
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/B.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/B.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/B.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,11 @@
+//$Id: B.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.xml.hbm;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface B extends A {
+	public Integer getBId();
+
+	public void setBId(Integer bId);
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/BImpl.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/BImpl.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/BImpl.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,26 @@
+//$Id: BImpl.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.xml.hbm;
+
+import javax.persistence.Entity;
+import javax.persistence.Table;
+
+ at Entity
+ at org.hibernate.annotations.Proxy( proxyClass = B.class )
+ at Table( name = "B" )
+public class BImpl extends AImpl implements B {
+	private static final long serialVersionUID = 1L;
+
+	private Integer bId = 0;
+
+	public BImpl() {
+		super();
+	}
+
+	public Integer getBId() {
+		return bId;
+	}
+
+	public void setBId(Integer bId) {
+		this.bId = bId;
+	}
+}
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/CloudType.hbm.xml
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/CloudType.hbm.xml	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/CloudType.hbm.xml	2009-11-24 21:03:15 UTC (rev 18049)
@@ -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 package="org.hibernate.test.annotations.xml.hbm">
+
+    <class name="CloudType">
+        <id name="id">
+            <generator class="native"/>
+        </id>
+        <property name="name"/>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/CloudType.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/CloudType.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/CloudType.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,26 @@
+//$Id: CloudType.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.xml.hbm;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class CloudType {
+	private Integer id;
+	private String 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;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/Government.hbm.xml
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/Government.hbm.xml	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/Government.hbm.xml	2009-11-24 21:03:15 UTC (rev 18049)
@@ -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 package="org.hibernate.test.annotations.xml.hbm">
+
+    <class name="Government">
+        <id name="id">
+            <generator class="native"/>
+        </id>
+        <property name="name"/>
+        <many-to-one name="primeMinister" column="primeMinister_id"/>
+    </class>
+
+</hibernate-mapping>
\ No newline at end of file

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/Government.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/Government.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/Government.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,35 @@
+//$Id: Government.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.xml.hbm;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Government {
+	private Integer id;
+	private String name;
+	private PrimeMinister primeMinister;
+
+	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 PrimeMinister getPrimeMinister() {
+		return primeMinister;
+	}
+
+	public void setPrimeMinister(PrimeMinister primeMinister) {
+		this.primeMinister = primeMinister;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/HbmTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/HbmTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/HbmTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,82 @@
+//$Id:HbmTest.java 9793 2006-04-26 02:20:18 -0400 (mer., 26 avr. 2006) epbernard $
+package org.hibernate.test.annotations.xml.hbm;
+
+import java.util.HashSet;
+
+import org.hibernate.Session;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class HbmTest extends TestCase {
+
+	public void testManyToOne() throws Exception {
+		Session s = openSession();
+		s.getTransaction().begin();
+		Government gov = new Government();
+		gov.setName( "Liberals" );
+		s.save( gov );
+		PrimeMinister pm = new PrimeMinister();
+		pm.setName( "Murray" );
+		pm.setCurrentGovernment( gov );
+		s.save( pm );
+		s.getTransaction().rollback();
+		s.close();
+	}
+
+	public void testOneToMany() throws Exception {
+		Session s = openSession();
+		s.getTransaction().begin();
+		Government gov = new Government();
+		gov.setName( "Liberals" );
+		Government gov2 = new Government();
+		gov2.setName( "Liberals2" );
+		s.save( gov );
+		s.save( gov2 );
+		PrimeMinister pm = new PrimeMinister();
+		pm.setName( "Murray" );
+		pm.setCurrentGovernment( gov );
+		pm.setGovernments( new HashSet() );
+		pm.getGovernments().add( gov2 );
+		pm.getGovernments().add( gov );
+		gov.setPrimeMinister( pm );
+		gov2.setPrimeMinister( pm );
+		s.save( pm );
+		s.flush();
+		s.getTransaction().rollback();
+		s.close();
+	}
+
+	public void testManyToMany() throws Exception {
+		Session s = openSession();
+		s.getTransaction().begin();
+		CloudType type = new CloudType();
+		type.setName( "Cumulus" );
+		Sky sky = new Sky();
+		s.persist( type );
+		sky.getCloudTypes().add(type);
+		s.persist( sky );
+		s.flush();
+		s.getTransaction().rollback();
+		s.close();
+	}
+
+
+	protected Class[] getMappings() {
+		return new Class[]{
+				PrimeMinister.class,
+				Sky.class,
+
+		};
+	}
+
+	@Override
+	protected String[] getXmlFiles() {
+		return new String[]{
+				"org/hibernate/test/annotations/xml/hbm/Government.hbm.xml",
+				"org/hibernate/test/annotations/xml/hbm/CloudType.hbm.xml",
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/HbmWithIdentityTest.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/HbmWithIdentityTest.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/HbmWithIdentityTest.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,51 @@
+//$Id:HbmTest.java 9793 2006-04-26 02:20:18 -0400 (mer., 26 avr. 2006) epbernard $
+package org.hibernate.test.annotations.xml.hbm;
+
+import java.util.HashSet;
+
+import org.hibernate.Session;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class HbmWithIdentityTest extends TestCase {
+
+	public void testManyToOneAndInterface() throws Exception {
+		Session s = openSession();
+		s.getTransaction().begin();
+		B b = new BImpl();
+		b.setBId( 1 );
+		s.persist( b );
+		Z z = new ZImpl();
+		z.setB( b );
+		s.persist( z );
+		s.flush();
+		s.getTransaction().rollback();
+		s.close();
+	}
+
+	
+	
+	@Override
+	protected boolean runForCurrentDialect() {
+		return super.runForCurrentDialect() && getDialect().supportsIdentityColumns();
+	}
+
+
+
+	protected Class[] getMappings() {
+		return new Class[]{
+				ZImpl.class
+		};
+	}
+
+	@Override
+	protected String[] getXmlFiles() {
+		return new String[]{
+				"org/hibernate/test/annotations/xml/hbm/A.hbm.xml",
+				"org/hibernate/test/annotations/xml/hbm/B.hbm.xml"
+		};
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/PrimeMinister.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/PrimeMinister.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/PrimeMinister.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,57 @@
+//$Id:PrimeMinister.java 9793 2006-04-26 02:20:18 -0400 (mer., 26 avr. 2006) epbernard $
+package org.hibernate.test.annotations.xml.hbm;
+
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class PrimeMinister {
+	private Integer id;
+	private String name;
+	private Government currentGovernment;
+	private Set<Government> governments;
+
+	@ManyToOne
+	public Government getCurrentGovernment() {
+		return currentGovernment;
+	}
+
+	public void setCurrentGovernment(Government currentGovernment) {
+		this.currentGovernment = currentGovernment;
+	}
+
+	@Id
+	@GeneratedValue
+	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;
+	}
+
+	@OneToMany(mappedBy = "primeMinister")
+	public Set<Government> getGovernments() {
+		return governments;
+	}
+
+	public void setGovernments(Set<Government> governments) {
+		this.governments = governments;
+	}
+
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/Sky.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/Sky.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/Sky.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,47 @@
+//$Id: Sky.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.xml.hbm;
+
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToMany;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity(name="EarthSky")
+public class Sky {
+	private Integer id;
+	private Set<CloudType> cloudTypes = new HashSet<CloudType>();
+	private CloudType mainCloud;
+
+	@ManyToMany
+	public Set<CloudType> getCloudTypes() {
+		return cloudTypes;
+	}
+
+	public void setCloudTypes(Set<CloudType> cloudTypes) {
+		this.cloudTypes = cloudTypes;
+	}
+
+	@Id @GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	@ManyToOne
+	public CloudType getMainCloud() {
+		return mainCloud;
+	}
+
+	public void setMainCloud(CloudType mainCloud) {
+		this.mainCloud = mainCloud;
+	}
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/Z.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/Z.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/Z.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,15 @@
+//$Id: Z.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.xml.hbm;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface Z extends java.io.Serializable {
+  public Integer getZId();
+
+  public void setZId(Integer zId);
+
+  public B getB();
+
+  public void setB(B b);
+}

Added: annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/ZImpl.java
===================================================================
--- annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/ZImpl.java	                        (rev 0)
+++ annotations/branches/v3_4_0_GA_CP/src/test/java/org/hibernate/test/annotations/xml/hbm/ZImpl.java	2009-11-24 21:03:15 UTC (rev 18049)
@@ -0,0 +1,45 @@
+//$Id: ZImpl.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
+package org.hibernate.test.annotations.xml.hbm;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+
+ at Entity
+ at Inheritance( strategy = InheritanceType.JOINED )
+ at org.hibernate.annotations.Proxy( proxyClass = Z.class )
+ at Table( name = "Z" )
+public class ZImpl implements Z {
+	private static final long serialVersionUID = 1L;
+
+	private Integer zId = null;
+	private B b = null;
+
+	@Id
+	@GeneratedValue
+	@Column( name = "zID" )
+	public Integer getZId() {
+		return zId;
+	}
+
+	public void setZId(Integer zId) {
+		this.zId = zId;
+	}
+
+	@ManyToOne( optional = false, targetEntity = BImpl.class, fetch = FetchType.LAZY )
+	@JoinColumn( name = "bID", referencedColumnName = "bID")
+	public B getB() {
+		return b;
+	}
+
+	public void setB(B b) {
+		this.b = b;
+	}
+}



More information about the hibernate-commits mailing list