| /******************************************************************************* |
| * Copyright (c) 2014, 2015 Oracle and/or its affiliates. All rights reserved. |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 |
| * which accompanies this distribution. |
| * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html |
| * and the Eclipse Distribution License is available at |
| * http://www.eclipse.org/org/documents/edl-v10.php. |
| * |
| * Contributors: |
| * 07/16/2015-2.7 Lukas Jungmann, Tomas Kraus |
| * - 429760: Tests whether dynamic entity descriptor is available in session during |
| * query execution after it was created within the same transaction. |
| */ |
| package org.eclipse.persistence.testing.tests.jpa.dynamic.simple; |
| |
| import static org.eclipse.persistence.logging.SessionLog.WARNING; |
| |
| import javax.persistence.EntityManager; |
| import javax.persistence.EntityManagerFactory; |
| import javax.persistence.EntityTransaction; |
| import javax.persistence.RollbackException; |
| |
| import org.eclipse.persistence.dynamic.DynamicClassLoader; |
| import org.eclipse.persistence.dynamic.DynamicEntity; |
| import org.eclipse.persistence.dynamic.DynamicHelper; |
| import org.eclipse.persistence.dynamic.DynamicType; |
| import org.eclipse.persistence.dynamic.DynamicTypeBuilder; |
| import org.eclipse.persistence.jpa.dynamic.JPADynamicHelper; |
| import org.eclipse.persistence.jpa.dynamic.JPADynamicTypeBuilder; |
| import org.eclipse.persistence.logging.SessionLog; |
| import org.eclipse.persistence.sessions.Session; |
| import org.eclipse.persistence.testing.tests.jpa.dynamic.DynamicTestHelper; |
| import org.junit.After; |
| import org.junit.AfterClass; |
| import org.junit.Assert; |
| import org.junit.Before; |
| import org.junit.BeforeClass; |
| import org.junit.Test; |
| |
| public class SimpleQueryTestSuite { |
| |
| /** Entity manager factory. */ |
| private static EntityManagerFactory emf = null; |
| /** Entity manager. */ |
| private EntityManager em = null; |
| /** Test logger. */ |
| private SessionLog log; |
| |
| /** |
| * Initializes this test class. Entity manager factory is created. |
| */ |
| @BeforeClass |
| public static void setUp() { |
| emf = DynamicTestHelper.createEMF(DynamicTestHelper.DYNAMIC_PERSISTENCE_NAME); |
| } |
| |
| /** |
| * Tears down this test class. Entity manager factory is destroyed. |
| */ |
| @AfterClass |
| public static void tearDown() { |
| if (emf != null && emf.isOpen()) { |
| emf.close(); |
| } |
| } |
| |
| /** |
| * Creates database structures for this test. |
| */ |
| public void initTable() { |
| final EntityTransaction et = em.getTransaction(); |
| et.begin(); |
| try { |
| em.createNativeQuery("CREATE TABLE SIMPLE_TYPE_1 (SID INTEGER, VAL_1 VARCHAR(15))").executeUpdate(); |
| et.commit(); |
| } catch (Exception ex) { |
| log.log(WARNING, "Could not create SIMPLE_TYPE_1 table: ." + ex.getMessage()); |
| et.rollback(); |
| // This may fail without causing any serious problems. |
| } |
| et.begin(); |
| try { |
| em.createNativeQuery("DELETE FROM SIMPLE_TYPE_1").executeUpdate(); |
| et.commit(); |
| } catch (Exception ex) { |
| log.log(WARNING, "Could not clean SIMPLE_TYPE_1 table: ." + ex.getMessage()); |
| et.rollback(); |
| // Delete is required so exception here would fail the test. |
| throw ex; |
| } |
| } |
| |
| /** |
| * Deletes database structures for this test. |
| */ |
| public void destroyTable() { |
| final EntityTransaction et = em.getTransaction(); |
| et.begin(); |
| try { |
| em.createNativeQuery("DROP TABLE SIMPLE_TYPE_1").executeUpdate(); |
| et.commit(); |
| } catch (Exception ex) { |
| log.log(WARNING, "Could not drop SIMPLE_TYPE_1 table: ." + ex.getMessage()); |
| et.rollback(); |
| // This may fail without causing any serious problems. |
| } |
| } |
| |
| /** |
| * Initializes environment before test. |
| */ |
| @Before |
| public void setUpTest() { |
| em = emf.createEntityManager(); |
| log = em.unwrap(Session.class).getSessionLog(); |
| initTable(); |
| } |
| |
| /** |
| * Cleans up environment after test. |
| */ |
| @After |
| public void tearDownTest() { |
| destroyTable(); |
| em.close(); |
| em = null; |
| log = null; |
| } |
| |
| /** |
| * Tests whether dynamic entity descriptor is available in session during query execution when it was created |
| * right before it. |
| */ |
| @Test |
| public void testJPQLQuery() { |
| final SessionLog log = em.unwrap(Session.class).getSessionLog(); |
| final EntityTransaction et = em.getTransaction(); |
| try { |
| et.begin(); |
| |
| DynamicHelper helper = new JPADynamicHelper(em); |
| DynamicClassLoader dcl = helper.getDynamicClassLoader(); |
| Class<?> javaType = dcl.createDynamicClass("model.Simple"); |
| DynamicTypeBuilder typeBuilder = new JPADynamicTypeBuilder( |
| javaType, null, "SIMPLE_TYPE_1"); |
| typeBuilder.setPrimaryKeyFields("SID"); |
| typeBuilder.addDirectMapping("id", int.class, "SID"); |
| typeBuilder.addDirectMapping("value1", String.class, "VAL_1"); |
| DynamicType dt = typeBuilder.getType(); |
| helper.addTypes(false, false, dt); |
| |
| DynamicEntity dt1 = dt.newDynamicEntity(); |
| dt1.set("id", 1); |
| dt1.set("value1", "some string"); |
| em.persist(dt1); |
| em.flush(); |
| |
| DynamicEntity jpqlEntity = em.createQuery("SELECT s FROM Simple s", dt.getJavaClass()).getSingleResult(); |
| DynamicEntity foundEntity = em.find(dt.getJavaClass(), 1); |
| Assert.assertEquals(jpqlEntity, foundEntity); |
| |
| et.commit(); |
| } catch (RollbackException e) { |
| et.rollback(); |
| throw new RuntimeException(e); |
| } |
| } |
| |
| } |