在应用程序中运行多个线程时,我遇到了Spring和Hibernate的奇怪问题.我正在使用spring 3.2.0.RELEASE和hibernate 4.1.12.Final.问题是,对于某些对象,当从db检索它们时,检索成功,但未设置所有映射的集合.这是我的回购的一个例子:
@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;
}
Run Code Online (Sandbox Code Playgroud)
对于某些对象,此方法在尝试访问CollectionMember列表时始终抛出以下错误:
Caused by: java.lang.NullPointerException
at org.hibernate.collection.internal.PersistentBag.toString(PersistentBag.java:501)
Run Code Online (Sandbox Code Playgroud)
问题是session.get()调用为所有延迟加载的集合创建PersistentBag对象,但从不设置内容.仅在启用多线程时才会发生这种情况.任何人都可以解释为什么会这样吗?
编辑:这是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 = …Run Code Online (Sandbox Code Playgroud)