Mam dziwny problem ze Spring i Hibernate podczas uruchamiania wielu wątków w aplikacji. Używam wiosny 3.2.0.RELEASE i hibernacji 4.1.12.Final. Problem polega na tym, że dla niektórych obiektów, gdy są one pobierane z bazy danych, odzyskiwanie się powiedzie, ale wszystkie zmapowane kolekcje nie są ustawiane. Oto przykład z mojego repo:Wyjątek NullPointerException podczas uzyskiwania dostępu do leniwego zbioru w ramach metody 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;
}
Dla niektórych obiektów, ta metoda zawsze wyrzuca następujący błąd, gdy próbuje uzyskać dostęp do listy CollectionMember:
Caused by: java.lang.NullPointerException
at org.hibernate.collection.internal.PersistentBag.toString(PersistentBag.java:501)
Problem polega na tym, że session.get() call tworzy obiekty PersistentBag dla wszystkich leniwych załadowanych kolekcji, ale nigdy nie ustawia zawartości. Dzieje się tak tylko wtedy, gdy włączona jest wielowątkowość. Czy ktoś może wyjaśnić, dlaczego tak się dzieje?
EDIT: Oto odnośny bit class 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>();
I klasa CollectionMember:
@Entity
@Table(name = "COLLECTION_MEMBER")
@XmlRootElement(name = "collectionMember")
public class CollectionMember {
@EmbeddedId
private CollectionMemberPK primaryKey;
@ManyToOne
@JoinColumn(name = "COLL_CODE")
private CollectionCode collectionCode;
Śledzenie całego stosu (nawet jeśli jest trochę bardziej szczegółowe) może pomóc w lepszym rozwiązywaniu problemu. – Subhas
jest szansa, że możesz publikować klasy Foo i CollectionMember lub przynajmniej bity, które pokazują adnotacje mapowania (lub plik hbm.xml, jeśli korzystasz z xml config). –
Nie mogę opublikować pełnego stosu, chyba że przejdę i ręcznie zmienię mnóstwo nazw pakietów, więc nie możesz powiedzieć, skąd się wzięły. Jeśli naprawdę sądzisz, że pełny stacktrace dostarczy więcej informacji, zrobię to, ale nie jestem przekonany, że potrzebujesz więcej, niż już masz w tym sensie. Dodam jednak mapowania. – Rockenstein