/* * 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.persistence.EntityManager; import javax.persistence.EntityTransaction; import org.apache.openjpa.jdbc.conf.JDBCConfiguration; import org.apache.openjpa.jdbc.sql.DB2Dictionary; import org.apache.openjpa.jdbc.sql.DBDictionary; import org.apache.openjpa.jdbc.sql.DerbyDictionary; 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 { boolean disabled = true; public void setUp() { super.setUp(DROP_TABLES, Textile.class, TextilePK.class, Shirt.class, Trousers.class, Part.class, PartPK.class); DBDictionary dic = ((JDBCConfiguration)emf.getConfiguration()).getDBDictionaryInstance(); if (dic.supportsAutoAssign && (dic instanceof DB2Dictionary || dic instanceof DerbyDictionary)) { disabled = false; } } public void testPersistShirtWithPart() { if (disabled) { return; } 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()); } }