Sto avendo un problema strano con Spring e Hibernate quando si eseguono più thread in un'applicazione. Sto usando la molla 3.2.0.RELEASE e ibernazione 4.1.12.Finale. Il problema è che per alcuni oggetti, quando vengono recuperati dal db, il recupero ha esito positivo, ma tutte le raccolte mappate non vengono impostate. Ecco un esempio del mio repo:NullPointerException durante l'accesso alla raccolta lenta caricata nel metodo DAO
@Repository("fooRepository")
public class FooRepository {
private static final Logger log = Logger.getLogger(FooRepository.class);
@Autowired
private SessionFactory sessionFactory;
@Override
@Transactional
public Foo retrieve(final Long id) {
Foo instance = (Foo) sessionFactory.getCurrentSession().get(Foo.class, id);
for (CollectionMember member : instance.getCollectionMembers()) {
log.debug(member.getId());
}
return instance;
}
Per alcuni oggetti, questo metodo genera sempre il seguente errore quando si tenta di accedere alla lista CollectionMember:
Caused by: java.lang.NullPointerException
at org.hibernate.collection.internal.PersistentBag.toString(PersistentBag.java:501)
Il problema è che il session.get() call crea oggetti PersistentBag per tutte le raccolte pigre ma non imposta mai il contenuto. Ciò si verifica solo quando il multithreading è abilitato. Qualcuno può spiegare perché questo sta accadendo?
EDIT: Ecco il bit rilevante della classe foo:
@Entity
@Table(name = "FOO")
@XmlRootElement(name = "foo")
public class Foo {
@EmbeddedId
private FooPK id;
@OneToMany
@NotFound(action = NotFoundAction.IGNORE)
@JoinColumns({
@JoinColumn(name = "COLLECTION_ID", referencedColumnName = "COLLECTION_ID"),
@JoinColumn(name = "FOO_ID", referencedColumnName = "FOO_ID")})
private List<CollectionMember> collectionMembers = new ArrayList<CollectionMember>();
E la classe CollectionMember:
@Entity
@Table(name = "COLLECTION_MEMBER")
@XmlRootElement(name = "collectionMember")
public class CollectionMember {
@EmbeddedId
private CollectionMemberPK primaryKey;
@ManyToOne
@JoinColumn(name = "COLL_CODE")
private CollectionCode collectionCode;
Fornire traccia completa dello stack (anche se è un po 'prolisso) potrebbe aiutare a risolvere meglio il problema. – Subhas
ogni possibilità di pubblicare le classi Foo e CollectionMember, o almeno i bit che mostrano annotazioni di mappatura (o il file hbm.xml se si utilizza la configurazione xml) –
Non riesco a pubblicare lo stacktrace completo a meno che non passi e cambi manualmente un sacco di nomi di pacchetti in modo da non poter dire da dove viene. Se pensi davvero che lo stack completo fornirà più informazioni, lo farò, ma non sono convinto che ti serva più di quanto tu abbia già ottenuto in questo senso, ma aggiungerò i mapping. – Rockenstein