Package org.apache.openjpa.persistence.inheritance.jointable.onetomany

Source Code of org.apache.openjpa.persistence.inheritance.jointable.onetomany.TestMapsIdWithAutoGeneratedKey

/*
* 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());
       
    }
}
TOP

Related Classes of org.apache.openjpa.persistence.inheritance.jointable.onetomany.TestMapsIdWithAutoGeneratedKey

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.