Java Mailing List Archive

http://www.gg3721.com/

Home » users.openjpa »

JPQL-UPDATE + refresh() sets collections to NULL

Sebastian Gauder

2008-08-25


Author LoginPost Reply
I have the following piece of Code:

static ConcurrentLinkedQueue<Band> bands;
...
public int perform(EntityManager em) {
  Band b = em.merge(bands.poll());
     try {
       String statement = "UPDATE Band AS b " +
            "SET b.name='The "+b.getName()+"'"+
            " WHERE b.id="+b.getId();
       Query query = em.createQuery(statement);
       query.executeUpdate();
     
       statement = "UPDATE Album AS a " +
       "SET a.name='The "+b.getName()+"'"+
       " WHERE a.id="+b.getAlbums().get(0).getId();
       query = em.createQuery(statement);
       query.executeUpdate();
     
       if (b.getTour()!=null) {
          statement = "UPDATE Concert AS c " +
          "SET c.city='London' "+
          "WHERE c.id="+b.getTour().getConcerts().get(0).getId();
          query = em.createQuery(statement);
          query.executeUpdate();
       }
     
       em.refresh(b);
       bands.add(b);
     
       return 0;
    }
    catch (Exception e) {
       e.printStackTrace();
       return -1;
    }
  }



The Entity Band looks like this:

@Entity
@Table(name="JBT_Band")
public class Band {

  private Long id;

  @Id
  @GeneratedValue
  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }
 
  private String name;
 
  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

 
  private List<Artist> members;

  @OneToMany(cascade=ALL, mappedBy = "band")
  public List<Artist> getMembers() {
    return members;
  }

  public void setMembers(List<Artist> members) {
    this.members = members;
  }
 
  private Tour tour;

  @OneToOne(cascade=ALL, optional = true, mappedBy = "band")
  public Tour getTour() {
    return tour;
  }

  public void setTour(Tour tour) {
    this.tour = tour;
  }
 
  private List<Album> albums;

  @OneToMany(cascade=ALL, mappedBy = "band")
  public List<Album> getAlbums() {
    return albums;
  }

  public void setAlbums(List<Album> albums) {
    this.albums = albums;
  }
 
  private int scenario;

  public int getScenario() {
    return scenario;
  }

  public void setScenario(int scenario) {
    this.scenario = scenario;
  }
 
}

The method perform() is processed by up to 10 Threads at the same time.
Each thread retrieves an entity 'Band' from a static and threadsafe
queue and updates the according table and some related tables by
JPQL-Queries.
The problem is, that after refresh() the lists 'albums' and 'members'
are set to NULL which causes NullPointerExceptions in other places. Is
this a bug in OpenJPA? (Code works in Hibernate and TopLink)

Regards,
Seb
©2008 gg3721.com - Jax Systems, LLC, U.S.A.