/* * 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.spring; import javax.persistence.*; import org.apache.openjpa.persistence.models.library.*; public class LibTestingService { private EntityManager em; public LibTestingService() { } public void setEntityManager(EntityManager em) { this.em = em; } public void depopulateDB() { // delete everything EntityTransaction tx = em.getTransaction(); tx.begin(); em.createQuery("delete from Book").executeUpdate(); em.createQuery("delete from Borrower").executeUpdate(); em.createQuery("delete from Subject").executeUpdate(); tx.commit(); } public void repopulateDB() { depopulateDB(); if (!isDBClean()) throw new IllegalStateException("Failed to clean the database"); EntityTransaction tx = null; try { tx = em.getTransaction(); tx.begin(); // create three borrowers Tom, Dick, and Harry Borrower tom = new Borrower("Tom"); Borrower dick = new Borrower("Dick"); Borrower harry = new Borrower("Harry"); // make them persistent em.persist(tom); em.persist(dick); em.persist(harry); // make Dick a volunteer Volunteer v = new Volunteer(dick); v.setHoursPerWeek(10); // create six books Book fishing = new Book("Gone Fishing"); Book hunting = new Book("Gone Hunting"); Book sailing = new Book("Gone Sailing"); Book fighting = new Book("Gone to War"); Book visiting = new Book("Gone Visiting"); Book working = new Book("Gone to Work"); Book sleeping = new Book("Gone to Bed"); em.persist(fishing); em.persist(hunting); em.persist(sailing); em.persist(fighting); em.persist(visiting); em.persist(working); em.persist(sleeping); // create categories for the books Subject outdoors = new Subject("Outdoors"); Subject military = new Subject("Military"); Subject sport = new Subject("Sportsman"); Subject travel = new Subject("Travel"); Subject industry = new Subject("Industry"); Subject space = new Subject("Space"); // link the books with the categories fishing.addSubject(outdoors); fishing.addSubject(sport); hunting.addSubject(outdoors); hunting.addSubject(sport); sailing.addSubject(outdoors); sailing.addSubject(travel); fighting.addSubject(military); fighting.addSubject(travel); visiting.addSubject(travel); working.addSubject(industry); // this Subject has no books em.persist(space); // borrow some books tom.borrowBook(fishing); dick.borrowBook(hunting); dick.borrowBook(sailing); harry.borrowBook(working); // commit the transaction tx.commit(); } catch (RuntimeException e) { System.err.println("Unable to repopulate the database"); System.err.println("Caught exception: " + e.getMessage()); e.printStackTrace(System.err); throw e; } finally { if (tx != null && tx.isActive()) { tx.rollback(); } } } public boolean isDBClean() { // Do a series of counts // (Avoid any problem in generating a Cartesian join) long count = 0; count += (Long) em.createQuery("select count(b) from Book b") .getSingleResult(); count += (Long) em.createQuery("select count(b) from Borrower b") .getSingleResult(); count += (Long) em.createQuery("select count(v) from Volunteer v") .getSingleResult(); count += (Long) em.createQuery("select count(s) from Subject s") .getSingleResult(); return count <= 0; } /** * Close the Service. The method is idempotent. It may be called multiple * times without ill effect. */ public void close() { if (em != null && em.isOpen()) { em.close(); } } }