You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by jr...@apache.org on 2011/03/30 21:32:42 UTC
svn commit: r1087054 - in /openjpa/trunk:
openjpa-kernel/src/main/java/org/apache/openjpa/kernel/
openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/
openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/m...
Author: jrbauer
Date: Wed Mar 30 19:32:41 2011
New Revision: 1087054
URL: http://svn.apache.org/viewvc?rev=1087054&view=rev
Log:
OPENJPA-1966 Updated attach strategies to query attach cache before going to the broker for entity references. Prevents merging in a detached entity that is being used for field attachment.
Added:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/TestMergeDetachStateField.java (with props)
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/Car.java (with props)
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/Label.java (with props)
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/Label2.java (with props)
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/Make.java (with props)
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/Model.java (with props)
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/ShipPackage.java (with props)
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/ShipPackage2.java (with props)
Modified:
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AttachStrategy.java
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachedStateManager.java
Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AttachStrategy.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AttachStrategy.java?rev=1087054&r1=1087053&r2=1087054&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AttachStrategy.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AttachStrategy.java Wed Mar 30 19:32:41 2011
@@ -186,13 +186,21 @@ abstract class AttachStrategy
Object frmpc = fetchObjectField(i);
if (frmpc == null && !nullLoaded)
return false;
+
OpenJPAStateManager tosm = manager.getBroker().getStateManager
(sm.fetchObjectField(i));
PersistenceCapable topc = (tosm == null) ? null
: tosm.getPersistenceCapable();
if (frmpc != null || topc != null) {
- if (fmd.getCascadeAttach() == ValueMetaData.CASCADE_NONE)
- frmpc = getReference(manager, frmpc, sm, fmd);
+ if (fmd.getCascadeAttach() == ValueMetaData.CASCADE_NONE) {
+ // Use the attached copy of the object, if available
+ PersistenceCapable cpy = manager.getAttachedCopy(frmpc);
+ if (cpy != null) {
+ frmpc = cpy;
+ } else {
+ frmpc = getReference(manager, frmpc, sm, fmd);
+ }
+ }
else {
PersistenceCapable intopc = topc;
if (!fmd.isEmbeddedPC() && frmpc != null && topc != null
Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachedStateManager.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachedStateManager.java?rev=1087054&r1=1087053&r2=1087054&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachedStateManager.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachedStateManager.java Wed Mar 30 19:32:41 2011
@@ -244,8 +244,15 @@ public class DetachedStateManager
case JavaTypes.PC:
case JavaTypes.PC_UNTYPED:
if (fields[i].getCascadeAttach() == ValueMetaData
- .CASCADE_NONE)
- objval = getReference(manager, objval, sm, fields[i]);
+ .CASCADE_NONE) {
+ // Use the attached copy of the object, if available
+ PersistenceCapable cpy = manager.getAttachedCopy(objval);
+ if (cpy != null) {
+ objval = cpy;
+ } else {
+ objval = getReference(manager, objval, sm, fields[i]);
+ }
+ }
else {
PersistenceCapable toPC = null;
if (objval != null && fields[i].isEmbeddedPC())
Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/TestMergeDetachStateField.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/TestMergeDetachStateField.java?rev=1087054&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/TestMergeDetachStateField.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/TestMergeDetachStateField.java Wed Mar 30 19:32:41 2011
@@ -0,0 +1,230 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openjpa.persistence.merge;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+
+import org.apache.openjpa.persistence.merge.model.Car;
+import org.apache.openjpa.persistence.merge.model.Label;
+import org.apache.openjpa.persistence.merge.model.Label2;
+import org.apache.openjpa.persistence.merge.model.Make;
+import org.apache.openjpa.persistence.merge.model.Model;
+import org.apache.openjpa.persistence.merge.model.ShipPackage;
+import org.apache.openjpa.persistence.merge.model.ShipPackage2;
+import org.apache.openjpa.persistence.test.SingleEMFTestCase;
+
+public class TestMergeDetachStateField extends SingleEMFTestCase {
+ public void setUp() {
+ setUp(Label.class, ShipPackage.class,
+ Label2.class, ShipPackage2.class,
+ Car.class, Model.class, Make.class,
+ CLEAR_TABLES);
+ }
+
+ /**
+ * Verify a merge graph is correct when an entity uses a detached state field. When
+ * a detached state field is used, the entity does not get populated with a DetachedStateManager
+ * upon detachment.
+ *
+ * ShipPackage: Has DetachedStateManager after detach.
+ * Label: Detached state field - no DSM after detach.
+ * Initial graph: Label <--> ShipPackage
+ * Merge: Label
+ * Verify after merge: Label' <--> ShipPackage'
+ */
+ public void testCascadeMergeDetachState() {
+ EntityManager em = emf.createEntityManager();
+
+ try {
+ // Create simple bi-di graph
+ ShipPackage p = new ShipPackage();
+ Label l = new Label(p);
+ p.setLabel(l);
+
+ // Persist
+ em.getTransaction().begin();
+ em.persist(l);
+ em.getTransaction().commit();
+
+ // Detach
+ em.clear();
+ assertFalse(em.contains(l));
+ assertFalse(em.contains(p));
+ assertFalse(em.contains(l.getPackage()));
+ assertFalse(em.contains(p.getLabel()));
+
+ em.getTransaction().begin();
+ Label mergedLabel = em.merge(l);
+
+ assertFalse(mergedLabel == l);
+ assertFalse(p == mergedLabel.getPackage());
+ // Assert that the bi-directional relationship points to the
+ // newly merged entity
+ assertTrue(mergedLabel == mergedLabel.getPackage().getLabel());
+ assertFalse(l == mergedLabel.getPackage().getLabel());
+ em.remove(mergedLabel);
+ em.getTransaction().commit();
+ } finally {
+ if (em != null) {
+ if (em.getTransaction().isActive())
+ em.getTransaction().rollback();
+ em.close();
+ }
+ }
+ }
+
+ /**
+ * Verify a merge graph is correct when an entity uses a detached state field. When
+ * a detached state field is used, the entity does not get populated with a DetachedStateManager
+ * upon detachment. Same as testCascadeMergeDetachState, except merge is on ShipPackage2,
+ * which contains the cascade instead of Label2.
+ *
+ * ShipPackage: Has DetachedStateManager after detach.
+ * Label: Detached state field - no DSM after detach.
+ * Initial graph: ShipPackage2 <--> Label2
+ * Merge: ShipPackage2
+ * Verify after merge: ShipPackage2' <--> Label2'
+ */
+ public void testCascadeMergeDetachState2() {
+ EntityManager em = emf.createEntityManager();
+
+ try {
+ // Create simple bi-di graph
+ ShipPackage2 p = new ShipPackage2();
+ Label2 l = new Label2(p);
+ p.setLabel2(l);
+
+ // Persist
+ em.getTransaction().begin();
+ em.persist(p);
+ em.getTransaction().commit();
+
+ // Detach
+ em.clear();
+ assertFalse(em.contains(l));
+ assertFalse(em.contains(p));
+ assertFalse(em.contains(l.getPackage2()));
+ assertFalse(em.contains(p.getLabel2()));
+
+ em.getTransaction().begin();
+ ShipPackage2 mergedPackage = em.merge(p);
+
+ assertFalse(mergedPackage == p);
+ assertFalse(l == mergedPackage.getLabel2());
+ // Assert that the bi-directional relationship points to the
+ // newly merged entity
+ assertTrue(mergedPackage == mergedPackage.getLabel2().getPackage2());
+ assertFalse(p == mergedPackage.getLabel2().getPackage2());
+ em.remove(mergedPackage);
+ em.getTransaction().commit();
+ } finally {
+ if (em != null) {
+ if (em.getTransaction().isActive())
+ em.getTransaction().rollback();
+ em.close();
+ }
+ }
+ }
+
+ /**
+ * Verify a merge graph is correct when multiple entities of a complex
+ * graph use a detached state field. When a detached state field is used,
+ * the entity does not get populated with a DetachedStateManager upon
+ * detachment, but merge should still succeed.
+ */
+ public void testCascadeMergeDetachStateComplex() {
+ EntityManager em = emf.createEntityManager();
+
+ try {
+ Car c1 = new Car();
+ Car c2 = new Car();
+ Make mk1 = new Make();
+ ArrayList<Model> models = new ArrayList<Model>();
+ Model md1 = new Model();
+ models.add(md1);
+ Model md2 = new Model();
+ models.add(md2);
+
+ //populate bidirectional relationships
+ c1.setModel(md1);
+ c2.setModel(md2);
+ md1.setCar(c1);
+ md1.setMake(mk1);
+ md2.setCar(c2);
+ md1.setMake(mk1);
+ mk1.setModels(models);
+
+ // Persist car1 - will cascade
+ em.getTransaction().begin();
+ em.persist(c1);
+ em.getTransaction().commit();
+
+ Object[] entities = new Object[] { c1, c2, mk1, md1, md2 };
+ // detach all
+ em.clear();
+ // verify all entities are detached and references to them
+ // are also detached.
+ verifyDetached(em, entities);
+
+ em.getTransaction().begin();
+ // Merge model back in and verify all entities are newly merged entities
+ Model mergedModel = em.merge(md1);
+ assertFalse(mergedModel == md1);
+ assertFalse(mergedModel.getMake() == mk1);
+ List<Model> mds = mergedModel.getMake().getModels();
+ assertTrue(mds.contains(mergedModel));
+ assertFalse(c1 == mergedModel.getCar());
+ assertTrue(mergedModel.getCar().getModel() == mergedModel);
+ em.remove(mergedModel);
+ em.getTransaction().commit();
+ } finally {
+ if (em != null) {
+ if (em.getTransaction().isActive())
+ em.getTransaction().rollback();
+ em.close();
+ }
+ }
+ }
+
+ private void verifyDetached(EntityManager em, Object[] entities) {
+ for (Object entity : entities) {
+ assertFalse(em.contains(entity));
+ if (entity instanceof Car) {
+ Car c = (Car)entity;
+ assertFalse(em.contains(c.getModel()));
+ }
+ else if (entity instanceof Make) {
+ Make m = (Make)entity;
+ List<Model> mds = m.getModels();
+ for (Model md : mds) {
+ assertFalse(em.contains(md));
+ }
+ }
+ else if (entity instanceof Model) {
+ Model m = (Model)entity;
+ assertFalse(em.contains(m.getCar()));
+ assertFalse(em.contains(m.getMake()));
+ }
+ }
+ }
+
+}
Propchange: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/TestMergeDetachStateField.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/Car.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/Car.java?rev=1087054&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/Car.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/Car.java Wed Mar 30 19:32:41 2011
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openjpa.persistence.merge.model;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+import javax.persistence.Version;
+
+@Entity
+@Table(name="MRG_CAR")
+public class Car {
+
+ @Id
+ @GeneratedValue
+ @Column(name="CAR_ID")
+ private long id;
+
+ @OneToOne(cascade=CascadeType.ALL, mappedBy="car")
+ private Model model;
+
+ @SuppressWarnings("unused")
+ @Version
+ private int version;
+
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setModel(Model model) {
+ this.model = model;
+ }
+
+ public Model getModel() {
+ return model;
+ }
+}
Propchange: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/Car.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/Label.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/Label.java?rev=1087054&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/Label.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/Label.java Wed Mar 30 19:32:41 2011
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openjpa.persistence.merge.model;
+
+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.OneToOne;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+import javax.persistence.Version;
+
+import org.apache.openjpa.persistence.DetachedState;
+import org.apache.openjpa.persistence.jdbc.ForeignKey;
+
+@Entity
+@Table(name = "MRG_LABEL")
+@TableGenerator(name = "LabelGen", allocationSize = 10, pkColumnValue = "MRG_LABEL")
+public class Label {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "LabelGen")
+ @Column(name = "LABEL_ID")
+ private long id;
+
+ @OneToOne(cascade = CascadeType.ALL)
+ @ForeignKey()
+ @JoinColumn(name = "PKG_ID")
+ private ShipPackage pkg;
+
+ @SuppressWarnings("unused")
+ @Version
+ private int version;
+
+ @SuppressWarnings("unused")
+ @DetachedState
+ private Object state;
+
+ public Label(ShipPackage p) {
+ setPackage(p);
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setPackage(ShipPackage p) {
+ pkg = p;
+ }
+
+ public ShipPackage getPackage() {
+ return pkg;
+ }
+}
Propchange: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/Label.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/Label2.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/Label2.java?rev=1087054&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/Label2.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/Label2.java Wed Mar 30 19:32:41 2011
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openjpa.persistence.merge.model;
+
+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.OneToOne;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+import javax.persistence.Version;
+
+import org.apache.openjpa.persistence.DetachedState;
+import org.apache.openjpa.persistence.jdbc.ForeignKey;
+
+@Entity
+@Table(name = "MRG_LABEL2")
+@TableGenerator(name = "Label2Gen", allocationSize = 10, pkColumnValue = "MRG_LABEL2")
+public class Label2 {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "Label2Gen")
+ @Column(name = "LABEL_ID")
+ private long id;
+
+ @OneToOne
+ @ForeignKey
+ @JoinColumn(name = "PKG_ID")
+ private ShipPackage2 pkg;
+
+ @SuppressWarnings("unused")
+ @Version
+ private int version;
+
+ @SuppressWarnings("unused")
+ @DetachedState
+ private Object state;
+
+ public Label2(ShipPackage2 p) {
+ setPackage2(p);
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setPackage2(ShipPackage2 p) {
+ pkg = p;
+ }
+
+ public ShipPackage2 getPackage2() {
+ return pkg;
+ }
+}
Propchange: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/Label2.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/Make.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/Make.java?rev=1087054&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/Make.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/Make.java Wed Mar 30 19:32:41 2011
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openjpa.persistence.merge.model;
+
+import java.util.List;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.persistence.Version;
+
+import org.apache.openjpa.persistence.DetachedState;
+
+@Entity
+@Table(name="MRG_MAKE")
+public class Make {
+
+ @Id
+ @GeneratedValue
+ @Column(name="MAKE_ID")
+ private long id;
+
+ @OneToMany(cascade=CascadeType.ALL)
+ private List<Model> models;
+
+ @SuppressWarnings("unused")
+ @Version
+ private int version;
+
+ @SuppressWarnings("unused")
+ @DetachedState
+ private Object state;
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setModels(List<Model> models) {
+ this.models = models;
+ }
+
+ public List<Model> getModels() {
+ return models;
+ }
+}
Propchange: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/Make.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/Model.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/Model.java?rev=1087054&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/Model.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/Model.java Wed Mar 30 19:32:41 2011
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openjpa.persistence.merge.model;
+
+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.ManyToOne;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+import javax.persistence.Version;
+
+import org.apache.openjpa.persistence.jdbc.ForeignKey;
+
+@Entity
+@Table(name="MRG_MODEL")
+public class Model {
+
+ @Id
+ @GeneratedValue
+ @Column(name="MODEL_ID")
+ private long id;
+
+ @ManyToOne(cascade=CascadeType.ALL)
+ @ForeignKey
+ @JoinColumn(name="MAKE_ID")
+ private Make make;
+
+ @OneToOne(cascade=CascadeType.ALL)
+ @ForeignKey
+ @JoinColumn(name="CAR_ID")
+ private Car car;
+
+ @SuppressWarnings("unused")
+ @Version
+ private int version;
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setMake(Make make) {
+ this.make = make;
+ }
+
+ public Make getMake() {
+ return make;
+ }
+
+ public void setCar(Car car) {
+ this.car = car;
+ }
+
+ public Car getCar() {
+ return car;
+ }
+}
Propchange: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/Model.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/ShipPackage.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/ShipPackage.java?rev=1087054&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/ShipPackage.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/ShipPackage.java Wed Mar 30 19:32:41 2011
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openjpa.persistence.merge.model;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+import javax.persistence.Version;
+
+@Entity
+@Table(name = "MRG_PACKAGE")
+@TableGenerator(name = "PkgGen", allocationSize = 10, pkColumnValue = "MRG_PACKAGE")
+public class ShipPackage {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "PkgGen")
+ @Column(name = "PKG_ID")
+ private long id;
+
+ @OneToOne(mappedBy = "pkg", fetch = FetchType.EAGER)
+ private Label label;
+
+ @SuppressWarnings("unused")
+ @Version
+ private int version;
+
+ public void setId(long pid) {
+ id = pid;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setLabel(Label l) {
+ label = l;
+ }
+
+ public Label getLabel() {
+ return label;
+ }
+
+}
Propchange: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/ShipPackage.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/ShipPackage2.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/ShipPackage2.java?rev=1087054&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/ShipPackage2.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/ShipPackage2.java Wed Mar 30 19:32:41 2011
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openjpa.persistence.merge.model;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+import javax.persistence.Version;
+
+@Entity
+@Table(name = "MRG_PACKAGE2")
+@TableGenerator(name = "Pkg2Gen", allocationSize = 10, pkColumnValue = "MRG_PACKAGE2")
+public class ShipPackage2 {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "Pkg2Gen")
+ @Column(name = "PKG_ID")
+ private long id;
+
+ @OneToOne(mappedBy = "pkg", fetch = FetchType.EAGER, cascade=CascadeType.ALL)
+ private Label2 label;
+
+ @SuppressWarnings("unused")
+ @Version
+ private int version;
+
+ public void setId(long pid) {
+ id = pid;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setLabel2(Label2 l) {
+ label = l;
+ }
+
+ public Label2 getLabel2() {
+ return label;
+ }
+
+}
Propchange: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/ShipPackage2.java
------------------------------------------------------------------------------
svn:eol-style = native