[hibernate-commits] Hibernate SVN: r14686 - in core/trunk: testsuite/src/test/java/org/hibernate/test/cid and 1 other directory.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Thu May 22 11:43:24 EDT 2008


Author: steve.ebersole at jboss.com
Date: 2008-05-22 11:43:24 -0400 (Thu, 22 May 2008)
New Revision: 14686

Added:
   core/trunk/testsuite/src/test/java/org/hibernate/test/cid/CompositeIdWithGeneratorTest.java
   core/trunk/testsuite/src/test/java/org/hibernate/test/cid/PurchaseDetail.java
   core/trunk/testsuite/src/test/java/org/hibernate/test/cid/PurchaseRecord.hbm.xml
   core/trunk/testsuite/src/test/java/org/hibernate/test/cid/PurchaseRecord.java
   core/trunk/testsuite/src/test/java/org/hibernate/test/cid/PurchaseRecordIdGenerator.java
Modified:
   core/trunk/core/src/main/resources/org/hibernate/hibernate-mapping-3.0.dtd
Log:
HHH-2060 : composite-id + generator

Modified: core/trunk/core/src/main/resources/org/hibernate/hibernate-mapping-3.0.dtd
===================================================================
--- core/trunk/core/src/main/resources/org/hibernate/hibernate-mapping-3.0.dtd	2008-05-22 15:01:15 UTC (rev 14685)
+++ core/trunk/core/src/main/resources/org/hibernate/hibernate-mapping-3.0.dtd	2008-05-22 15:43:24 UTC (rev 14686)
@@ -174,7 +174,7 @@
 key column. The class must implement java.io.Serializable and reimplement equals() 
 and hashCode(). -->
 
-<!ELEMENT composite-id ( meta*, (key-property|key-many-to-one)+ )>
+<!ELEMENT composite-id ( meta*, (key-property|key-many-to-one)+, generator? )>
 	<!ATTLIST composite-id class CDATA #IMPLIED>
 	<!ATTLIST composite-id mapped (true|false) "false">
 	<!ATTLIST composite-id name CDATA #IMPLIED>

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

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

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

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

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




More information about the hibernate-commits mailing list