blob: 1d45794334525d53f4949979787bf9d585a87b67 [file] [log] [blame]
/*
* Copyright (c) 2005, 2021 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2005, 2015 SAP. 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:
// SAP - initial API and implementation
package org.eclipse.persistence.testing.tests.wdf.jpa1.mapping;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashSet;
import java.util.Set;
import jakarta.persistence.EntityManager;
import jakarta.persistence.OptimisticLockException;
import org.eclipse.persistence.testing.framework.wdf.JPAEnvironment;
import org.eclipse.persistence.testing.framework.wdf.ToBeInvestigated;
import org.eclipse.persistence.testing.models.wdf.jpa1.employee.Department;
import org.eclipse.persistence.testing.models.wdf.jpa1.employee.Employee;
import org.eclipse.persistence.testing.models.wdf.jpa1.employee.Project;
import org.eclipse.persistence.testing.models.wdf.jpa1.employee.Review;
import org.eclipse.persistence.testing.tests.wdf.jpa1.JPA1Base;
import org.junit.Test;
public class TestSecondaryTable extends JPA1Base {
@Test
public void testFieldsInSecondTable() throws SQLException {
String projectName = "trallala";
int plannedDays = 7;
int usedDays = 8;
JPAEnvironment env = getEnvironment();
EntityManager em = env.getEntityManager();
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
Project project = new Project(projectName);
project.setPlannedDays(plannedDays);
project.setUsedDays(usedDays);
env.beginTransaction(em);
em.persist(project);
env.commitTransaction(em); // insert
env.beginTransaction(em);
project = em.merge(project);
verify(project.getName().equals(projectName), "wrong name");
verify(project.getPlannedDays() == plannedDays, "wrong number of plannedDays");
verify(project.getUsedDays() == usedDays, "wrong number of usedDays");
plannedDays = 17;
usedDays = 18;
project.setPlannedDays(plannedDays);
project.setUsedDays(usedDays);
env.commitTransaction(em); // update
env.beginTransaction(em);
project = em.merge(project);
verify(project.getName().equals(projectName), "wrong name");
verify(project.getPlannedDays() == plannedDays, "wrong number of plannedDays");
verify(project.getUsedDays() == usedDays, "wrong number of usedDays");
em.remove(project);
env.commitTransaction(em); // delete
Integer projectId = project.getId();
con = env.getDataSource().getConnection();
pstmt = con.prepareStatement("select count(*) from TMP_PROJECT_DETAILS where PROJECT_ID = ?");
pstmt.setInt(1, projectId);
rs = pstmt.executeQuery();
rs.next();
verify(rs.getInt(1) == 0, "secondary table not empty");
} finally {
rs.close();
pstmt.close();
con.close();
closeEntityManager(em);
}
}
@Test
public void testSecondaryTableInRelation() {
String projectName1 = "P1";
String projectName2 = "P2";
int plannedDays1 = 17;
int usedDays1 = 18;
int plannedDays2 = 27;
int usedDays2 = 28;
JPAEnvironment env = getEnvironment();
EntityManager em = env.getEntityManager();
try {
Project project1 = new Project(projectName1);
project1.setPlannedDays(plannedDays1);
project1.setUsedDays(usedDays1);
Project project2 = new Project(projectName2);
project2.setPlannedDays(plannedDays2);
project2.setUsedDays(usedDays2);
Set<Project> projects = new HashSet<Project>();
projects.add(project1);
projects.add(project2);
Department dep = new Department(7, "dep7");
Employee horst = new Employee(13, "Horst", "Bullerjahn", dep);
horst.setProjects(projects);
env.beginTransaction(em);
em.persist(dep);
em.persist(project1);
em.persist(project2);
em.persist(horst);
env.commitTransaction(em);
env.beginTransaction(em);
horst = em.merge(horst);
projects = horst.getProjects();
verify(projects.size() == 2, "wrong number of projects");
for (Project p : projects) {
verify(p.getName().equals(projectName1) || p.getName().equals(projectName2), "wrong projectName");
if (p.getName().equals(projectName1)) {
verify(p.getPlannedDays() == plannedDays1, "wrong number of plannedDays");
verify(p.getUsedDays() == usedDays1, "wrong number of usedDays");
}
if (p.getName().equals(projectName2)) {
verify(p.getPlannedDays() == plannedDays2, "wrong number of plannedDays");
verify(p.getUsedDays() == usedDays2, "wrong number of usedDays");
}
}
env.rollbackTransaction(em);
} finally {
closeEntityManager(em);
}
}
@Test
@ToBeInvestigated
public void testOptimisticLockWithSecondaryTable() {
JPAEnvironment env = getEnvironment();
EntityManager em1 = env.getEntityManagerFactory().createEntityManager();
EntityManager em2 = env.getEntityManagerFactory().createEntityManager();
int id = 27;
int version = 0;
Review rev1 = new Review(id, Date.valueOf("2006-04-26"), "blah");
try {
env.beginTransaction(em1);
em1.persist(rev1);
rev1.setSuccessRate((short) 0);
env.commitTransactionAndClear(em1);
env.beginTransaction(em1);
rev1 = em1.find(Review.class, id);
verify(rev1 != null, "Review is null");
version = rev1.getVersion();
env.beginTransaction(em2);
Review rev2 = em2.find(Review.class, id);
rev2.setSuccessRate((short) 10); // 1 update
env.commitTransactionAndClear(em2);
rev1.setSuccessRate((short) 20); // 2 update
env.commitTransactionAndClear(em1);
flop("OptimisticLockException not thrown");
} catch (OptimisticLockException ole) {
// $JL-EXC$ expected behavior
} finally {
closeEntityManager(em1);
closeEntityManager(em2);
}
verify(version == rev1.getVersion(), "wrong version");
}
}