在应用程序中运行多个线程时,我遇到了Spring和Hibernate的一个奇怪问题。我使用的是spring 3.2.0.RELEASE和hibernate 4.1.12.Final。问题是对于某些对象,当它们从数据库检索时,检索成功,但是所有映射的集合都没有被设置。以下是我的repo示例:
@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;
}
对于某些对象,在尝试访问CollectionMember列表时,此方法总是会抛出以下错误:
Caused by: java.lang.NullPointerException
at org.hibernate.collection.internal.PersistentBag.toString(PersistentBag.java:501)
问题在于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 = "FOO_ID", referencedColumnName = "FOO_ID")})
private List<CollectionMember> collectionMembers = new ArrayList<CollectionMember>();
CollectionMember类:
@Entity
@Table(name = "COLLECTION_MEMBER")
@XmlRootElement(name = "collectionMember")
public class CollectionMember {
@EmbeddedId
private CollectionMemberPK primaryKey;
@ManyToOne
@JoinColumn(name = "COLL_CODE")
private CollectionCode collectionCode;
toString()
中,这是否意味着它由log.debug(member.getId());
抛出?如果不是,那么在处理不同异常期间抛出此异常是否可能?另外,关于您的事务管理配置的信息也可能很有趣 - 您是否使用@EnableTransactionalManagement
? - Pavel Horal