Index: jdo/c1409/LazyLoadRelationship1409Test.java =================================================================== --- jdo/c1409/LazyLoadRelationship1409Test.java (Revision 0) +++ jdo/c1409/LazyLoadRelationship1409Test.java (Revision 0) @@ -0,0 +1,128 @@ +package jdo.c1409; + +import jdo.c1409.app.*; +import java.util.Collection; +import java.util.NoSuchElementException; +import junit.framework.TestCase; +import org.exolab.castor.jdo.Database; +import org.exolab.castor.jdo.JDOManager; +import org.exolab.castor.jdo.OQLQuery; +import org.exolab.castor.jdo.QueryResults; +import org.exolab.castor.mapping.AccessMode; + +/** + * Demonstrates a bug(s)? present in Castor JDO Lazy Loading logic. + */ +public class LazyLoadRelationship1409Test extends TestCase { + + private static final Long TEST_CITY_ID = new Long(1); + private static final Long TEST_COURSE_ID = new Long(1); + + private static final String SELECT_COURSE_WITY_CITY_OQL = + " SELECT o " + + " FROM " + GolfCourse.class.getName() + " o " + + " WHERE id=$1" + + " AND is_defined(city.id)"; + + private static final String SELECT_COURSE_OQL = + " SELECT o " + + " FROM " + GolfCourse.class.getName() + " o " + + " WHERE id=$1"; + + JDOManager jdoMgr = null; + + protected void setUp() throws Exception { + JDOManager.loadConfiguration(getClass().getResource("jdo-conf.xml").toExternalForm()); + jdoMgr = JDOManager.createInstance("test"); + + //Fix test data broken by testLoadLazyCollectionRepeatedlyWOLazyOneToOne failures + Database database = jdoMgr.getDatabase(); + database.begin(); + GolfCourse course = getTestCourse(database, SELECT_COURSE_OQL); + course.setCity(getTestCity(database)); + database.update(course); + database.commit(); + database.close(); + } + + /** + * Test an object with several lazy-loaded properties (some 1:M, some 1:1) can + * be loaded in via read-only queries repeatedly without any loss of information. + * + * This bug was discovered after the patch for 1355 was applied. + */ + public void testLoadLazyCollectionRepeatedlyWOLazyOneToOne() throws Exception { + Database database = jdoMgr.getDatabase(); + database.begin(); + GolfCourse course = null; + //Use this OQL statement to ensure the intended test fixture is present for starting this test case + try { + course = getTestCourse(database, SELECT_COURSE_WITY_CITY_OQL); + } catch (NoSuchElementException nsee) { + fail("Invalid test fixture; database doesn't contain a course with ID=" + + TEST_COURSE_ID + " and a not-null city_id"); + } + + //search courses and load lazy-loaded collection property + Collection tees = course.getTees(); + for (GolfCourseTees tee : tees) { + //("Loaded " + tee); + + Collection holes = tee.getHoles(); + for (GolfCourseHole hole : holes) { + hole.getNumber(); + } + } + database.commit(); + database.close(); + +// //try accessing lazy-loaded collection property items outside txn +// tees = course.getTees(); +// for (GolfCourseTees tee : tees) { +// assertNotNull("Tee name shouldn't be null", tee.getName()); +// Collection holes = tee.getHoles(); +// for (GolfCourseHole hole : holes) { +// assertNotNull("Hole should have a number, but doesn't", hole.getNumber()); +// } +// } + + //Make sures there aren't any side effects (i.e. independent objects getting updated). + //Search courses again and load lazy-loaded 1:1 property. + database = jdoMgr.getDatabase(); + database.begin(); + + //Use this OQL statement to allow test case to demonstrate missing lazy-loaded property + course = getTestCourse(database, SELECT_COURSE_OQL); + City city = course.getCity(); + //Make sure 1:1 lazy-loaded city is available inside the txn + assertNotNull("Golf Course no longer has a relationship to independent object not loaded above: IN TXN", city); + assertEquals("GolfCourse's associated independant city has changed!: IN TXN", TEST_COURSE_ID, city.getId()); + + database.commit(); + database.close(); + + //Make sure 1:1 lazy-loaded city is available outside the txn + city = course.getCity(); + assertNotNull("Golf Course no longer has a relationship to independent object not loaded above: AFTER TXN", city); + assertEquals("GolfCourse's associated independant city has changed!: AFTER TXN", TEST_COURSE_ID, city.getId()); + } + + private GolfCourse getTestCourse(Database database, String oql) throws Exception { + OQLQuery query = database.getOQLQuery(oql); + query.bind(TEST_COURSE_ID); + QueryResults queryResults = query.execute(AccessMode.ReadOnly); + + GolfCourse course = (GolfCourse) queryResults.next(); + return course; + } + + private City getTestCity(Database database) throws Exception { + City result = null; + String oql = "SELECT o FROM " + City.class.getName() + " o WHERE id=$1"; + OQLQuery query = database.getOQLQuery(oql); + query.bind(TEST_CITY_ID); + QueryResults queryResults = query.execute(AccessMode.ReadOnly); + result = (City) queryResults.next(); + return result; + } +} \ No newline at end of file Index: jdo/c1409/app/GolfRound.java =================================================================== --- jdo/c1409/app/GolfRound.java (Revision 0) +++ jdo/c1409/app/GolfRound.java (Revision 0) @@ -0,0 +1,63 @@ +package jdo.c1409.app; + +import java.util.ArrayList; +import java.util.Collection; + +public class GolfRound extends MyAppObject { + + protected Person user = new Person(); + protected GolfCourse course = new GolfCourse(); + protected GolfCourseTees teesPlayed = new GolfCourseTees(); + protected java.util.Date date; + protected Integer score; + //Marked as transient because the castor persistent collection is not serializeable + protected transient Collection details = new ArrayList(); + + public Person getUser() { + return user; + } + + public void setUser(Person value) { + user = value; + } + + public GolfCourse getCourse() { + return course; + } + + public void setCourse(GolfCourse value) { + course = value; + } + + public GolfCourseTees getTeesPlayed() { + return teesPlayed; + } + + public void setTeesPlayed(GolfCourseTees value) { + teesPlayed = value; + } + + public java.util.Date getDate() { + return date; + } + + public void setDate(java.util.Date value) { + date = value; + } + + public Integer getScore() { + return score; + } + + public void setScore(Integer value) { + score = value; + } + + public Collection getDetails() { + return details; + } + + public void setDetails(Collection value) { + details = value; + } +} Index: jdo/c1409/app/GolfCourseHole.java =================================================================== --- jdo/c1409/app/GolfCourseHole.java (Revision 0) +++ jdo/c1409/app/GolfCourseHole.java (Revision 0) @@ -0,0 +1,53 @@ +package jdo.c1409.app; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class GolfCourseHole extends MyAppObject { + + protected GolfCourseTees courseTees = new GolfCourseTees(); + protected Integer number; + protected String name; + protected Integer par; + protected Integer yardage; + + public GolfCourseTees getCourseTees() { + return courseTees; + } + + public void setCourseTees(GolfCourseTees value) { + courseTees = value; + } + + public Integer getNumber() { + return number; + } + public void setNumber(Integer value) { + number = value; + } + + public String getName() { + return name; + } + public void setName(String value) { + name = value; + } + + public Integer getPar() { + return par; + } + public void setPar(Integer value) { + par = value; + } + + public Integer getYardage() { + return yardage; + } + public void setYardage(Integer value) { + yardage = value; + } +} Index: jdo/c1409/app/GolfRoundDetail.java =================================================================== --- jdo/c1409/app/GolfRoundDetail.java (Revision 0) +++ jdo/c1409/app/GolfRoundDetail.java (Revision 0) @@ -0,0 +1,41 @@ +package jdo.c1409.app; + +public class GolfRoundDetail extends MyAppObject { + + protected String type; + protected String value; + protected Integer hole; + protected GolfRound round = new GolfRound(); + + public String getType() { + return type; + } + + public void setType(String value) { + type = value; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + value = value; + } + + public Integer getHole() { + return hole; + } + public void setHole(Integer value) { + hole = value; + } + + public GolfRound getRound() { + return round; + } + + public void setRound(GolfRound value) { + round = value; + } +} + Index: jdo/c1409/app/Country.java =================================================================== --- jdo/c1409/app/Country.java (Revision 0) +++ jdo/c1409/app/Country.java (Revision 0) @@ -0,0 +1,50 @@ +package jdo.c1409.app; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class Country extends MyAppObject { + + protected String name; + protected String iso3Code; + /** + * Retreives the value of name - Name of the country. + * + * @return the name property value. Name of the country. + */ + public String getName() { + return name; + } + + /** + * Replaces the current value of name - Name of the country. + * + * @param value new Name of the country. + */ + public void setName(String value) { + name = value; + } + + /** + * Retreives the value of iso3Code - ISO 3 Country Code for this country. + * + * @return the iso3Code property value. ISO 3 Country Code for this country. + */ + public String getIso3Code() { + return iso3Code; + } + + /** + * Replaces the current value of iso3Code - ISO 3 Country Code for this country. + * + * @param value new ISO 3 Country Code for this country. + */ + public void setIso3Code(String value) { + iso3Code = value; + } + +} Index: jdo/c1409/app/Person.java =================================================================== --- jdo/c1409/app/Person.java (Revision 0) +++ jdo/c1409/app/Person.java (Revision 0) @@ -0,0 +1,102 @@ +package jdo.c1409.app; + +public class Person extends MyAppObject { + + protected String firstName; + protected String lastName; + protected String email; + protected String altEmail; + protected java.util.Date birthDate; + protected String userName; + protected String displayName; + protected String password; + protected String gender; + protected String countryCode; + protected String postalCode; + protected String defaultLocaleId; + + + public String getFirstName() { + return firstName; + } + public void setFirstName(String value) { + firstName = value; + } + + public String getLastName() { + return lastName; + } + public void setLastName(String value) { + lastName = value; + } + + public String getEmail() { + return email; + } + public void setEmail(String value) { + email = value; + } + + public String getAltEmail() { + return altEmail; + } + public void setAltEmail(String value) { + altEmail = value; + } + + public java.util.Date getBirthDate() { + return birthDate; + } + public void setBirthDate(java.util.Date value) { + birthDate = value; + } + + public String getUserName() { + return userName; + } + public void setUserName(String value) { + userName = value; + } + + public String getDisplayName() { + return displayName; + } + public void setDisplayName(String value) { + displayName = value; + } + + public String getPassword() { + return password; + } + public void setPassword(String value) { + password = value; + } + + public String getGender() { + return gender; + } + public void setGender(String value) { + gender = value; + } + + public String getCountryCode() { + return countryCode; + } + public void setCountryCode(String value) { + countryCode = value; + } + + public String getPostalCode() { + return postalCode; + } + public void setPostalCode(String value) { + postalCode = value; + } + + public String getDefaultLocaleId() { + return defaultLocaleId; + } + public void setDefaultLocaleId(String value) { + defaultLocaleId = value; + } +} Index: jdo/c1409/app/StateProv.java =================================================================== --- jdo/c1409/app/StateProv.java (Revision 0) +++ jdo/c1409/app/StateProv.java (Revision 0) @@ -0,0 +1,41 @@ +package jdo.c1409.app; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Represents a single country's state or province in the system. + */ +public class StateProv extends MyAppObject { + + protected String code; + protected String name; + protected Country country = new Country(); + + public String getCode() { + return code; + } + public void setCode(String value) { + code = value; + } + + public String getName() { + return name; + } + public void setName(String value) { + name = value; + } + + public Country getCountry() { + return country; + } + public void setCountry(Country value) { + country = value; + } + +} + Index: jdo/c1409/app/City.java =================================================================== --- jdo/c1409/app/City.java (Revision 0) +++ jdo/c1409/app/City.java (Revision 0) @@ -0,0 +1,54 @@ +package jdo.c1409.app; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Represents a single city in the system. + */ +public class City extends MyAppObject { + + protected String name; + protected StateProv state = new StateProv(); + /** + * Retreives the value of name - Name of the city. + * + * @return the name property value. Name of the city. + */ + public String getName() { + return name; + } + + /** + * Replaces the current value of name - Name of the city. + * + * @param value new Name of the city. + */ + public void setName(String value) { + name = value; + } + + /** + * Retreives the value of state - + * + * @return the state property value. + */ + public StateProv getState() { + return state; + } + + /** + * Replaces the current value of state - + * + * @param value new + */ + public void setState(StateProv value) { + state = value; + } + +} + Index: jdo/c1409/app/GolfCourse.java =================================================================== --- jdo/c1409/app/GolfCourse.java (Revision 0) +++ jdo/c1409/app/GolfCourse.java (Revision 0) @@ -0,0 +1,47 @@ +package jdo.c1409.app; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class GolfCourse extends MyAppObject { + + protected String name; + protected Integer holes; + //Marked as transient because the castor persistent collection is not serializeable + protected transient Collection tees = new ArrayList(); + + protected City city = new City(); + public String getName() { + return name; + } + public void setName(String value) { + name = value; + } + + public Integer getHoles() { + return holes; + } + public void setHoles(Integer value) { + holes = value; + } + + public Collection getTees() { + return tees; + } + public void setTees(Collection value) { + tees = value; + } + + public City getCity() { + return city; + } + public void setCity(City value) { + city = value; + } + +} + Index: jdo/c1409/app/GolfCourseTees.java =================================================================== --- jdo/c1409/app/GolfCourseTees.java (Revision 0) +++ jdo/c1409/app/GolfCourseTees.java (Revision 0) @@ -0,0 +1,92 @@ +package jdo.c1409.app; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Represents a single set of golf course tees. These may be entered into the system by a registered + user. + */ +public class GolfCourseTees extends MyAppObject { + + protected GolfCourse course = new GolfCourse(); + protected String name; + protected String color; + protected Integer mensSlope; + protected Double mensRating; + protected Integer womensSlope; + protected Double womensRating; + protected Integer yardage; + //Marked as transient because the castor persistent collection is not serializeable + protected transient Collection holes = new ArrayList(); + + public GolfCourse getCourse() { + return course; + } + public void setCourse(GolfCourse value) { + course = value; + } + + public String getName() { + return name; + } + public void setName(String value) { + name = value; + } + + public String getColor() { + return color; + } + + public void setColor(String value) { + color = value; + } + + public Integer getMensSlope() { + return mensSlope; + } + + public void setMensSlope(Integer value) { + mensSlope = value; + } + + public Double getMensRating() { + return mensRating; + } + public void setMensRating(Double value) { + mensRating = value; + } + + public Integer getWomensSlope() { + return womensSlope; + } + public void setWomensSlope(Integer value) { + womensSlope = value; + } + + public Double getWomensRating() { + return womensRating; + } + public void setWomensRating(Double value) { + womensRating = value; + } + + public Integer getYardage() { + return yardage; + } + public void setYardage(Integer value) { + yardage = value; + } + + public Collection getHoles() { + return holes; + } + public void setHoles(Collection value) { + holes = value; + } +} + Index: jdo/c1409/app/MyAppObject.java =================================================================== --- jdo/c1409/app/MyAppObject.java (Revision 0) +++ jdo/c1409/app/MyAppObject.java (Revision 0) @@ -0,0 +1,120 @@ +package jdo.c1409.app; + +import org.exolab.castor.mapping.AccessMode; +import java.sql.Timestamp; +import org.apache.log4j.Logger; +import org.exolab.castor.jdo.*; + +public class MyAppObject implements Persistent, TimeStampable { + protected Long id; + protected Long createdById; + protected Long lastModifiedById; + protected Timestamp createDate; + protected Timestamp lastModifiedDate; + protected long timeStamp; + protected Logger log = Logger.getLogger(getClass()); + + /** + * Called to set the database to which this object belongs when this object becomes persistent. + * + * @param database The database to which this object belongs + */ + public void jdoPersistent(Database database) { + log.debug("jdoPersistent - Database " + database); + } + + /** + * Called to indicate the object is now transient. The object may no longer use the database object assigned to it, + * and will become hollow with various fields set to null + */ + public void jdoTransient() { + log.debug("jdoTransient"); + } + + /** + * Called to indicate that the object has been loaded from persistent storage. This method is + * called immediately after synchronizing an object with the database + * + * @param accessMode + * @return null + * @throws Exception + */ + public Class jdoLoad(AccessMode accessMode) throws Exception { + log.debug("jdoTransient - AccessMode " + accessMode); + return null; + } + + public void jdoStore(boolean modified) throws Exception { + log.debug("jdoStore - modified " + modified); + } + + public void jdoBeforeCreate(Database database) throws Exception { + log.debug("jdoBeforeCreate - database " + database); + } + + public void jdoAfterCreate() throws Exception { + log.debug("jdoAfterCreate"); + } + + public void jdoBeforeRemove() throws Exception { + log.debug("jdoBeforeRemove"); + } + + public void jdoAfterRemove() throws Exception { + log.debug("jdoAfterRemove"); + } + + public void jdoUpdate() throws Exception { + log.debug("jdoUpdate"); + } + + public void jdoSetTimeStamp(long timestamp) { + log.debug("jdoSetTimeStamp - timestamp " + timestamp); + this.timeStamp = timestamp; + } + + public long jdoGetTimeStamp() { + log.debug("jdoGetTimeStamp"); + return timeStamp; + } + + public Long getId() { + return id; + } + + public void setId(Long value) { + id = value; + } + + public void setCreatedById(Long createdById) { + this.createdById = createdById; + } + + public Long getCreatedById() { + return createdById; + } + + public Long getLastModifiedById() { + return lastModifiedById; + } + + public void setLastModifiedById(Long lastModifiedById) { + this.lastModifiedById = lastModifiedById; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastModifiedDate() { + return lastModifiedDate; + } + + public void setLastModifiedDate(Timestamp lastModifiedDate) { + this.lastModifiedDate = lastModifiedDate; + } +} \ No newline at end of file Index: jdo/c1409/mysql.sql =================================================================== --- jdo/c1409/mysql.sql (Revision 0) +++ jdo/c1409/mysql.sql (Revision 0) @@ -0,0 +1,192 @@ +CREATE TABLE L_COUNTRY ( + ID BIGINT NOT NULL, + NAME VARCHAR(100) NOT NULL, + ISO3_COUNTRY_CODE VARCHAR(3) , + RECORD_CREATED_BY_ID BIGINT , + RECORD_LAST_MOD_BY_ID BIGINT , + RECORD_CREATE_DATE DATETIME , + RECORD_LAST_MOD_DATE DATETIME +) TYPE = InnoDB; + +CREATE TABLE L_STATE_PROV ( + ID BIGINT NOT NULL, + CODE VARCHAR(3) , + NAME VARCHAR(100) NOT NULL, + COUNTRY_ID BIGINT NOT NULL, + RECORD_CREATED_BY_ID BIGINT , + RECORD_LAST_MOD_BY_ID BIGINT , + RECORD_CREATE_DATE DATETIME , + RECORD_LAST_MOD_DATE DATETIME +) TYPE = InnoDB; + +CREATE TABLE L_CITY ( + ID BIGINT NOT NULL, + NAME VARCHAR(100) NOT NULL, + STATE_PROV_ID BIGINT NOT NULL, + RECORD_CREATED_BY_ID BIGINT , + RECORD_LAST_MOD_BY_ID BIGINT , + RECORD_CREATE_DATE DATETIME , + RECORD_LAST_MOD_DATE DATETIME +) TYPE = InnoDB; + +CREATE TABLE T_GOLF_COURSE ( + ID BIGINT NOT NULL, + COURSE_NAME VARCHAR(100) NOT NULL, + HOLES INTEGER NOT NULL, + CITY_ID BIGINT , + RECORD_CREATED_BY_ID BIGINT , + RECORD_LAST_MOD_BY_ID BIGINT , + RECORD_CREATE_DATE DATETIME , + RECORD_LAST_MOD_DATE DATETIME +) TYPE = InnoDB; + + +CREATE TABLE T_GOLF_COURSE_TEES ( + ID BIGINT NOT NULL, + COURSE_ID BIGINT NOT NULL, + TEES_NAME VARCHAR(100) NOT NULL, + TEES_COLOR VARCHAR(25) , + MENS_SLOPE INTEGER , + MENS_RATING DOUBLE , + WOMENS_SLOPE INTEGER , + WOMENS_RATING DOUBLE , + YARDAGE INTEGER , + RECORD_CREATED_BY_ID BIGINT , + RECORD_LAST_MOD_BY_ID BIGINT , + RECORD_CREATE_DATE DATETIME , + RECORD_LAST_MOD_DATE DATETIME +) TYPE = InnoDB; + + +CREATE TABLE T_GOLF_COURSE_HOLES ( + ID BIGINT NOT NULL, + COURSE_TEES_ID BIGINT NOT NULL, + NUMBER INTEGER NOT NULL, + HOLE_NAME VARCHAR(100) , + PAR INTEGER , + YARDAGE INTEGER , + RECORD_CREATED_BY_ID BIGINT , + RECORD_LAST_MOD_BY_ID BIGINT , + RECORD_CREATE_DATE DATETIME , + RECORD_LAST_MOD_DATE DATETIME +) TYPE = InnoDB; + +CREATE TABLE A_PERSONS ( + PERSON_ID BIGINT NOT NULL, + FIRST_NAME VARCHAR(50) , + LAST_NAME VARCHAR(100) , + EMAIL VARCHAR(100) NOT NULL, + EMAIL_ALT VARCHAR(100) , + BIRTH_DATE DATE , + USERNAME VARCHAR(100) NOT NULL, + DISPLAY_NAME VARCHAR(100) , + PASSWORD VARCHAR(60) NOT NULL, + GENDER VARCHAR(1) , + COUNTRY_CD VARCHAR(2) , + POSTAL_CD VARCHAR(20) , + LOCALE VARCHAR(100) , + RECORD_CREATED_BY_ID BIGINT , + RECORD_LAST_MOD_BY_ID BIGINT , + RECORD_CREATE_DATE DATETIME , + RECORD_LAST_MOD_DATE DATETIME +) TYPE = InnoDB; + +CREATE TABLE T_GOLF_ROUND ( + ID BIGINT NOT NULL, + PERSON_ID BIGINT NOT NULL, + COURSE_ID BIGINT NOT NULL, + TEES_PLAYED_ID BIGINT NOT NULL, + DATE DATE , + SCORE INTEGER , + RECORD_CREATED_BY_ID BIGINT , + RECORD_LAST_MOD_BY_ID BIGINT , + RECORD_CREATE_DATE DATETIME , + RECORD_LAST_MOD_DATE DATETIME +) TYPE = InnoDB; + +CREATE TABLE T_GOLF_ROUND_DETAIL ( + ID BIGINT NOT NULL, + DETAIL_TYPE VARCHAR(100) NOT NULL, + DETAIL_VALUE VARCHAR(100) , + HOLE INTEGER , + GOLF_ROUND_ID BIGINT , + RECORD_CREATED_BY_ID BIGINT , + RECORD_LAST_MOD_BY_ID BIGINT , + RECORD_CREATE_DATE DATETIME , + RECORD_LAST_MOD_DATE DATETIME +) TYPE = InnoDB; + + +insert into L_COUNTRY (ID, NAME, ISO3_COUNTRY_CODE) values ('1', 'USA', 'USA'); +insert into L_STATE_PROV (ID, CODE, NAME, COUNTRY_ID) values ('1', 'WA', 'Washington', '1'); +insert into L_CITY (ID, NAME, STATE_PROV_ID) values ('1', 'Seattle', '1'); + +insert into T_GOLF_COURSE (ID, COURSE_NAME, HOLES, CITY_ID) values ('1', 'West Seattle', '18', '1'); +insert into T_GOLF_COURSE_TEES (ID, COURSE_ID, TEES_NAME, TEES_COLOR) values ('1', '1', 'White', 'white'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('1', '1', '1', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('2', '1', '2', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('3', '1', '3', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('4', '1', '4', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('5', '1', '5', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('6', '1', '6', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('7', '1', '7', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('8', '1', '8', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('9', '1', '9', '4'); + +insert into T_GOLF_COURSE_TEES (ID, COURSE_ID, TEES_NAME, TEES_COLOR) values ('2', '1', 'Blue', 'blue'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('10', '2', '1', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('11', '2', '2', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('12', '2', '3', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('13', '2', '4', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('14', '2', '5', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('15', '2', '6', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('16', '2', '7', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('17', '2', '8', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('18', '2', '9', '4'); + +insert into T_GOLF_COURSE_TEES (ID, COURSE_ID, TEES_NAME, TEES_COLOR) values ('3', '1', 'Red', 'red'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('19', '3', '1', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('20', '3', '2', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('21', '3', '3', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('22', '3', '4', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('23', '3', '5', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('24', '3', '6', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('25', '3', '7', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('26', '3', '8', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('27', '3', '9', '4'); + +insert into T_GOLF_COURSE (ID, COURSE_NAME, HOLES, CITY_ID) values ('2', 'Jackson Park', '18', '1'); +insert into T_GOLF_COURSE_TEES (ID, COURSE_ID, TEES_NAME, TEES_COLOR) values ('4', '2', 'White', 'white'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('28', '4', '1', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('29', '4', '2', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('30', '4', '3', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('31', '4', '4', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('32', '4', '5', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('33', '4', '6', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('34', '4', '7', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('35', '4', '8', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('36', '4', '9', '4'); + +insert into T_GOLF_COURSE_TEES (ID, COURSE_ID, TEES_NAME, TEES_COLOR) values ('5', '2', 'Blue', 'blue'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('37', '5', '1', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('38', '5', '2', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('39', '5', '3', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('40', '5', '4', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('41', '5', '5', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('42', '5', '6', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('43', '5', '7', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('44', '5', '8', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('45', '5', '9', '4'); + +insert into T_GOLF_COURSE_TEES (ID, COURSE_ID, TEES_NAME, TEES_COLOR) values ('6', '2', 'Red', 'red'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('46', '6', '1', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('47', '6', '2', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('48', '6', '3', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('49', '6', '4', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('50', '6', '5', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('51', '6', '6', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('52', '6', '7', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('53', '6', '8', '4'); +insert into T_GOLF_COURSE_HOLES (ID, COURSE_TEES_ID, NUMBER, PAR) values ('54', '6', '9', '4'); + +insert into A_PERSONS (PERSON_ID, FIRST_NAME, LAST_NAME, EMAIL, USERNAME, PASSWORD) values ('1', 'Castor', 'JDO', 'jdo@castor.org', 'castor', 'castor'); \ No newline at end of file Index: jdo/c1409/mapping.xml =================================================================== --- jdo/c1409/mapping.xml (Revision 0) +++ jdo/c1409/mapping.xml (Revision 0) @@ -0,0 +1,424 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file Index: jdo/c1409/README.txt =================================================================== --- jdo/c1409/README.txt (Revision 0) +++ jdo/c1409/README.txt (Revision 0) @@ -0,0 +1,5 @@ +bug number: 1820 +description: Bug report template for castor jdo. +castor: version 0.9.6 or CVS of 2005-03-31 13:44 +database: MySQL version 4.1 +driver: mysql-connector-java-3.0.16-ga-bin.jar Index: jdo/c1409/build.xml =================================================================== --- jdo/c1409/build.xml (Revision 0) +++ jdo/c1409/build.xml (Revision 0) @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file Index: jdo/c1409/jdo-conf.xml =================================================================== --- jdo/c1409/jdo-conf.xml (Revision 0) +++ jdo/c1409/jdo-conf.xml (Revision 0) @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file