blob: c5041969ba729bd76fc0bc52eebf0ecb0ee2fabd [file] [log] [blame]
/*
* Copyright (c) 2011, 2020 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 v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// dclarke - Dynamic Persistence
// http://wiki.eclipse.org/EclipseLink/Development/Dynamic
// (https://bugs.eclipse.org/bugs/show_bug.cgi?id=200045)
// mnorman - tweaks to work from Ant command-line,
// get database properties from System, etc.
//
package org.eclipse.persistence.testing.tests.jpa.dynamic.employee;
//javase imports
import java.util.Date;
//java eXtension imports
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Query;
//JUnit4 imports
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeTrue;
//EclipseLink imports
import org.eclipse.persistence.descriptors.changetracking.ChangeTracker;
import org.eclipse.persistence.dynamic.DynamicEntity;
import org.eclipse.persistence.internal.descriptors.changetracking.AttributeChangeListener;
import org.eclipse.persistence.jpa.JpaHelper;
import org.eclipse.persistence.jpa.dynamic.JPADynamicHelper;
import org.eclipse.persistence.logging.SessionLog;
import org.eclipse.persistence.sessions.server.Server;
//domain-specific (testing) imports
import org.eclipse.persistence.testing.tests.jpa.dynamic.QuerySQLTracker;
import org.eclipse.persistence.testing.tests.jpa.dynamic.DynamicTestHelper;
import static org.eclipse.persistence.testing.tests.jpa.dynamic.DynamicTestHelper.DYNAMIC_PERSISTENCE_NAME;
public class EmployeeUpdateTestSuite {
//test fixtures
static EntityManagerFactory emf = null;
static JPADynamicHelper helper = null;
static Server serverSession = null;
static DynamicEmployeeSystem deSystem = null;
static QuerySQLTracker qTracker = null;
@BeforeClass
public static void setUp() throws Exception {
emf = DynamicTestHelper.createEMF(DYNAMIC_PERSISTENCE_NAME);
helper = new JPADynamicHelper(emf);
deSystem = DynamicEmployeeSystem.buildProject(helper);
serverSession = JpaHelper.getServerSession(emf);
deSystem.populate(helper, emf.createEntityManager());
serverSession.getIdentityMapAccessor().initializeAllIdentityMaps();
qTracker = QuerySQLTracker.install(serverSession);
// QuerySQLTracker only works if logging is set to FINE
serverSession.setLogLevel(SessionLog.FINE);
}
@AfterClass
public static void tearDown() {
serverSession.executeNonSelectingSQL("DELETE FROM D_PROJ_EMP");
serverSession.executeNonSelectingSQL("DELETE FROM D_PHONE");
serverSession.executeNonSelectingSQL("DELETE FROM D_SALARY");
serverSession.executeNonSelectingSQL("DELETE FROM D_PROJECT");
serverSession.executeNonSelectingSQL("DELETE FROM D_EMPLOYEE");
serverSession.executeNonSelectingSQL("DELETE FROM D_ADDRESS");
try{
serverSession.executeNonSelectingSQL("DROP TABLE D_SALARY");
serverSession.executeNonSelectingSQL("DROP TABLE D_PROJ_EMP");
serverSession.executeNonSelectingSQL("DROP TABLE D_PROJECT");
serverSession.executeNonSelectingSQL("DROP TABLE D_PHONE");
serverSession.executeNonSelectingSQL("DROP TABLE D_EMPLOYEE");
serverSession.executeNonSelectingSQL("DROP TABLE D_ADDRESS");
} catch (Exception e){
e.printStackTrace();
}
helper = null;
qTracker = null;
emf.close();
emf = null;
}
@Test
public void testMultipleTransactionsModifyInstance() {
EntityManager em = emf.createEntityManager();
qTracker.reset();
DynamicEntity minEmp = minimumEmployee(em);
em.getTransaction().begin();
minEmp.set("firstName", "Delete");
minEmp.set("lastName", "Delete");
minEmp.set("salary", 9);
em.persist(minEmp);
em.getTransaction().commit();
assertEquals(1, qTracker.getTotalCalls("ReadAll"));
assertEquals(2, qTracker.getTotalSQLUPDATECalls());
assertTrue(minEmp instanceof ChangeTracker);
assertNotNull(((ChangeTracker)minEmp)._persistence_getPropertyChangeListener());
assertTrue(((ChangeTracker)minEmp)._persistence_getPropertyChangeListener() instanceof
AttributeChangeListener);
qTracker.reset();
DynamicEntity period = minEmp.get("period");
period.set("startDate", new Date(System.currentTimeMillis()));
period.set("endDate", new Date(System.currentTimeMillis() + 100000));
em.getTransaction().begin();
em.persist(minEmp); // no-op, already registered
em.getTransaction().commit();
assertEquals(1, qTracker.getTotalSQLUPDATECalls());
}
public DynamicEntity minimumEmployee(EntityManager em) {
Query q = em.createQuery(
"SELECT e FROM Employee e WHERE e.id in (SELECT MIN(ee.id) FROM Employee ee)");
return (DynamicEntity)q.getSingleResult();
}
}