[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [eclipselink-users] EntityManager life-cycle..
|
they are implemented in the following class
public abstract class BaseJPAController {
protected static EntityManagerFactory emf = Persistence.createEntityManagerFactory("uk.ac.man.jb.emerlin_dbaccess_nbm_1.0-SNAPSHOTPU");;
public BaseJPAController() {
}
public synchronized EntityManager getEntityManager() {
final EntityManager createEntityManager = emf.createEntityManager();
return createEntityManager;
}
}
Paul.
On 2011-03 -29, at 12:58, Tom Ware wrote:
> Can you please send the implementation of getEntityManager() and the code that creates the EntityManagerFactory.
>
> Paul Harrison wrote:
>> On 2011-03 -29, at 08:43, Paul Harrison wrote:
>>> as Racks are the basic containers for all other objects and there need to be two pre-existing for the application to be able to function - stationRack and baselineRack are static members of Rack. The code that does the equivalent of what causes the error below runs fine in a unit test - so it seems that it is running within Netbeans RCP that the problem occurs - perhaps it is to do with an interaction between the classloading requirements of Eclipselink and Netbeans RCP....
>> Actually I was looking and the unit test does other things first - if I isolate the unit test to do exactly what is happening in Netbeans RCP then exactly the same happens (the NPE) in a pure unit test - the following is the first (non-static) piece of code
>> RackJpaController jpa = new RackJpaController();
>> List<Rack> rackList = jpa.findRackEntities();
>> so there seems to be an interaction between the static initialization in Rack
>> static {
>> try {
>> RackJpaController instance = new RackJpaController();
>> if((stationRack = instance.findRack(Integer.valueOf(255))) == null){
>> stationRack = new Rack(Integer.valueOf(255));
>> stationRack.setName("Station");
>> instance.create(stationRack);
>> }
>> if((baselineRack = instance.findRack(Integer.valueOf(101))) == null){
>> baselineRack = new Rack(Integer.valueOf(101));
>> baselineRack.setName("Baseline");
>> instance.create(baselineRack);
>> }
>> } catch (PreexistingEntityException e) {
>> throw new RuntimeException("A Rack has already been created", e);
>> } catch (Exception e) {
>> throw new RuntimeException("Error creating rack", e);
>> }
>> }
>> and the use of Rack as the List generic type specifier - the code for the jpa.findRackEntities() is
>> public List<Rack> findRackEntities() {
>> return findRackEntities(true, -1, -1);
>> }
>> public List<Rack> findRackEntities(int maxResults, int firstResult) {
>> return findRackEntities(false, maxResults, firstResult);
>> }
>> private List<Rack> findRackEntities(boolean all, int maxResults, int firstResult) {
>> EntityManager em = getEntityManager();
>> try {
>> CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
>> cq.select(cq.from(Rack.class));
>> Query q = em.createQuery(cq);
>> if (!all) {
>> q.setMaxResults(maxResults);
>> q.setFirstResult(firstResult);
>> }
>> return q.getResultList();
>> } finally {
>> em.close();
>> }
>> }
>> I can work round this problem by creating an instance of Rack before the "List<Rack> rackList = jpa.findRackEntities();" to get the static initializers done separately.
>> I can send you a complete maven project with just the relevant classes if you want to investigate the issue further...
>> Regards,
>> Paul.
>> _______________________________________________
>> eclipselink-users mailing list
>> eclipselink-users@xxxxxxxxxxx
>> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
> _______________________________________________
> eclipselink-users mailing list
> eclipselink-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
Dr. Paul Harrison
JBCA, Manchester University
http://www.manchester.ac.uk/jodrellbank