Author: ppoddar
Date: Fri Apr 19 00:58:28 2013
New Revision: 1469652
URL: http://svn.apache.org/r1469652
Log:
OPENJPA-2373: test case for MapsId with auto-generated identity
Added:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/Part.java
(with props)
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/PartPK.java
(with props)
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/Shirt.java
(with props)
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/Textile.java
(with props)
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/TextilePK.java
(with props)
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/Trousers.java
(with props)
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/jointable/onetomany/TestMapsIdWithAutoGeneratedKey.java
(with props)
Added:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/Part.java
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/Part.java?rev=1469652&view=auto
==============================================================================
---
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/Part.java
(added)
+++
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/Part.java
Fri Apr 19 00:58:28 2013
@@ -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.common.apps;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.ManyToOne;
+import javax.persistence.MapsId;
+import javax.persistence.Table;
+
+import org.apache.openjpa.persistence.jdbc.ForeignKey;
+import org.apache.openjpa.persistence.jdbc.ForeignKeyAction;
+
+@Entity
+@Table(name="MPTZZS")
+public class Part implements Serializable {
+
+ @Column(name="NA_PT", length=20)
+ private String partName;
+
+ @EmbeddedId
+ private PartPK id = new PartPK();
+
+ @ManyToOne
+ @MapsId("textileId")
+ Shirt shirt;
+
+ public PartPK getId() {
+ return id;
+ }
+
+ public String getPartName() {
+ return partName;
+ }
+
+ public void setPartName(String aPartName) {
+ partName = aPartName;
+ }
+
+ public Shirt getShirt() {
+ return shirt;
+ }
+
+ public void setShirt(Shirt shirt) {
+ this.shirt = shirt;
+ }
+}
Propchange:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/Part.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/PartPK.java
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/PartPK.java?rev=1469652&view=auto
==============================================================================
---
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/PartPK.java
(added)
+++
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/PartPK.java
Fri Apr 19 00:58:28 2013
@@ -0,0 +1,85 @@
+/*
+ * 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.common.apps;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+
+@Embeddable
+public class PartPK implements Serializable {
+ /*Textile Id*/
+
+ @Column(name="ID_TXE", length=4)
+ private Integer textileId;
+
+ /*Part Number*/
+ @Column(name="NU_PT", length=4)
+ private Integer partNumber;
+
+ public PartPK() {
+ }
+
+ public Integer getTextileId() {
+ return textileId;
+ }
+
+ public void setTextileId(Integer aTextileId) {
+ textileId = aTextileId;
+ }
+
+ public Integer getPartNumber() {
+ return partNumber;
+ }
+
+ public void setPartNumber(Integer aPartNumber) {
+ partNumber = aPartNumber;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ PartPK other = (PartPK) obj;
+ if (partNumber == null) {
+ if (other.partNumber != null) {
+ return false;
+ }
+ } else if (!partNumber.equals(other.partNumber)) {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result
+ + ((partNumber == null) ? 0 : partNumber.hashCode());
+ return result;
+ }
+}
Propchange:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/PartPK.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/Shirt.java
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/Shirt.java?rev=1469652&view=auto
==============================================================================
---
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/Shirt.java
(added)
+++
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/Shirt.java
Fri Apr 19 00:58:28 2013
@@ -0,0 +1,63 @@
+/*
+ * 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.common.apps;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+/**
+ *
+ * @author Pinaki Poddar
+ *
+ */
+@Entity
+@Table(name="MPTZZV")
+public class Shirt extends Textile implements Serializable {
+
+ @Column(name="ID_SZE", length=1)
+ private String szeId;
+
+ public String getSzeId() {
+ return szeId;
+ }
+
+ public void setSzeId(String aSzeId) {
+ szeId = aSzeId;
+ }
+
+ @OneToMany(cascade=CascadeType.ALL, mappedBy="shirt",
fetch=FetchType.EAGER, orphanRemoval=true)
+ Collection<Part> parts = new ArrayList<Part>();
+
+
+ public Collection<Part> getParts() {
+ return parts;
+ }
+
+ public void setParts(Collection<Part> parts) {
+ this.parts = parts;
+ }
+
+}
Propchange:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/Shirt.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/Textile.java
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/Textile.java?rev=1469652&view=auto
==============================================================================
---
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/Textile.java
(added)
+++
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/Textile.java
Fri Apr 19 00:58:28 2013
@@ -0,0 +1,60 @@
+/*
+ * 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.common.apps;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.Table;
+
+import java.io.Serializable;
+
+@Entity
+@Inheritance(strategy=InheritanceType.JOINED)
+@Table(name="MPTZZT")
+public class Textile implements Serializable {
+
+ @Id
+ @GeneratedValue(strategy=GenerationType.IDENTITY)
+ @Column(name="ID_TXE", length=4)
+ private Integer textileId;
+
+ @Column(name="NA_TXE", length=20)
+ private String txeName;
+
+ public Integer getTextileId() {
+ return textileId;
+ }
+
+ public void setTextileId(Integer aTextileId) {
+ textileId = aTextileId;
+ }
+
+ public String getTxeName() {
+ return txeName;
+ }
+
+ public void setTxeName(String aTxeName) {
+ txeName = aTxeName;
+ }
+}
Propchange:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/Textile.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/TextilePK.java
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/TextilePK.java?rev=1469652&view=auto
==============================================================================
---
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/TextilePK.java
(added)
+++
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/TextilePK.java
Fri Apr 19 00:58:28 2013
@@ -0,0 +1,74 @@
+/*
+ * 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.common.apps;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+
+@Embeddable
+public class TextilePK implements Serializable {
+
+ @GeneratedValue(strategy=GenerationType.IDENTITY)
+ @Column(name="ID_TXE", length=4)
+ private Integer textileId;
+
+ public TextilePK() {
+ }
+
+ public Integer getTextileId() {
+ return textileId;
+ }
+
+ public void setTextileId(Integer aTextileId) {
+ textileId = aTextileId;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ TextilePK other = (TextilePK) obj;
+ if (textileId == null) {
+ if (other.textileId != null) {
+ return false;
+ }
+ } else if (!textileId.equals(other.textileId)) {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((textileId == null) ? 0 :
textileId.hashCode());
+ return result;
+ }
+}
Propchange:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/TextilePK.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/Trousers.java
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/Trousers.java?rev=1469652&view=auto
==============================================================================
---
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/Trousers.java
(added)
+++
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/Trousers.java
Fri Apr 19 00:58:28 2013
@@ -0,0 +1,42 @@
+/*
+ * 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.common.apps;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+
+import java.io.Serializable;
+
+@Entity
+@Table(name="MPTZZU")
+public class Trousers extends Textile implements Serializable {
+
+ @Column(name="NU_LNH", length=4)
+ private Integer lnhNumber;
+
+ public Integer getLnhNumber() {
+ return lnhNumber;
+ }
+
+ public void setLnhNumber(Integer aLnhNumber) {
+ lnhNumber = aLnhNumber;
+ }
+
+}
Propchange:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/Trousers.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/jointable/onetomany/TestMapsIdWithAutoGeneratedKey.java
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/jointable/onetomany/TestMapsIdWithAutoGeneratedKey.java?rev=1469652&view=auto
==============================================================================
---
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/jointable/onetomany/TestMapsIdWithAutoGeneratedKey.java
(added)
+++
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/jointable/onetomany/TestMapsIdWithAutoGeneratedKey.java
Fri Apr 19 00:58:28 2013
@@ -0,0 +1,105 @@
+/*
+ * 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.inheritance.jointable.onetomany;
+
+
+import javax.naming.NamingException;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityTransaction;
+
+import org.apache.openjpa.persistence.common.apps.Part;
+import org.apache.openjpa.persistence.common.apps.PartPK;
+import org.apache.openjpa.persistence.common.apps.Shirt;
+import org.apache.openjpa.persistence.common.apps.Textile;
+import org.apache.openjpa.persistence.common.apps.TextilePK;
+import org.apache.openjpa.persistence.common.apps.Trousers;
+import org.apache.openjpa.persistence.test.SingleEMFTestCase;
+
+/**
+ * Tests persisting a domain model where {@code MapsId} is used for a
+ * entity that uses auto-generated identity.
+ * <br>
+ * The test is created with a reported error with following domain model:
+ * <ol>
+ * <LI> The domain model used a Joined Inheritance of Textile->(Shirt,
Trousers)
+ * <LI> Textile used auto-assigned primary key
+ * <LI> A Shirt has Parts.
+ * <LI> Part used @Maps id annotation to refer the Shirt it belongs to.
+ * </ol>
+ * and following configuration
+ * <ol>
+ * <li> the schema was defined with SQL DDL script and included foreign
+ * key constraints.
+ * <li> {@code openjpa.jdbc.MappingDefaults} was not configured
+ * </ol>
+ * <p>
+ * Under the above conditions, the {@code INSERT} SQL for Shirt was
+ * generated twice during flush: once to obtain the primary key from
+ * the database and (erroneously) second time while flushing a Part
+ * via its @MapsId relation.
+ *
+ * @see Shirt
+ * @see TextTile
+ * @see and other classes of the domain model
+ *
+ * @author Pinaki Poddar
+ *
+ */
+public class TestMapsIdWithAutoGeneratedKey extends SingleEMFTestCase {
+ public void setUp() {
+ super.setUp(DROP_TABLES,
+ Textile.class, TextilePK.class,
+ Shirt.class, Trousers.class,
+ Part.class, PartPK.class);
+ }
+
+
+ public void testPersistShirtWithPart() throws NamingException {
+ EntityManager em = emf.createEntityManager();
+ EntityTransaction tx = em.getTransaction();
+ int nPart = 3;
+ tx.begin();
+
+ Shirt shirt = new Shirt();
+ String name = "Shirt: " + System.currentTimeMillis();
+ shirt.setTxeName(name);
+ String size = "L";
+ shirt.setSzeId(size);
+
+ int pid = (int) System.currentTimeMillis();
+ for (int i = 0; i < nPart; i++) {
+ Part part = new Part();
+ part.setPartName("Part");
+ part.getId().setPartNumber(pid++);
+ part.setShirt(shirt);
+ shirt.getParts().add(part);
+ }
+ em.persist(shirt);
+ tx.commit();
+ em.close();
+
+ int sid = shirt.getTextileId();
+ em = emf.createEntityManager();
+ shirt = em.find(Shirt.class, sid);
+ assertNotNull(shirt);
+ assertNotNull(shirt.getParts());
+ assertEquals(nPart, shirt.getParts().size());
+
+ }
+}
Propchange:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/jointable/onetomany/TestMapsIdWithAutoGeneratedKey.java
------------------------------------------------------------------------------
svn:eol-style = native