Tôi gặp sự cố lạ với Spring và Hibernate khi chạy nhiều luồng trong một ứng dụng. Tôi đang sử dụng mùa xuân 3.2.0.RELEASE và hibernate 4.1.12.Final. Vấn đề là đối với một số đối tượng, khi chúng được lấy ra từ db, quá trình truy xuất thành công, nhưng tất cả các bộ sưu tập được ánh xạ sẽ không được thiết lập. Dưới đây là một ví dụ về repo của tôi:NullPointerException khi truy cập bộ sưu tập tải lười trong phương thức 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;
}
Đối với một số đối tượng, phương pháp này luôn luôn ném lỗi sau khi cố gắng truy cập vào danh sách CollectionMember:
Caused by: java.lang.NullPointerException
at org.hibernate.collection.internal.PersistentBag.toString(PersistentBag.java:501)
Vấn đề là các session.get() cuộc gọi tạo ra các đối tượng PersistentBag cho tất cả các bộ sưu tập được tải chậm nhưng không bao giờ đặt nội dung. Điều này chỉ xảy ra khi đa luồng được bật. Ai có thể giải thích tại sao điều này xảy ra?
EDIT: Dưới đây là các bit tương ứng của lớp 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>();
Và lớp CollectionMember:
@Entity
@Table(name = "COLLECTION_MEMBER")
@XmlRootElement(name = "collectionMember")
public class CollectionMember {
@EmbeddedId
private CollectionMemberPK primaryKey;
@ManyToOne
@JoinColumn(name = "COLL_CODE")
private CollectionCode collectionCode;
Cung cấp dấu vết ngăn xếp đầy đủ (ngay cả khi nó tiết lộ một chút) có thể giúp khắc phục sự cố tốt hơn. – Subhas
bất kỳ cơ hội nào bạn có thể đăng các lớp Foo và CollectionMember, hoặc ít nhất các bit hiển thị chú thích ánh xạ (hoặc hbm.xml nếu bạn đang sử dụng cấu hình xml) –
Tôi không thể đăng stacktrace đầy đủ trừ khi tôi đi qua và thay đổi theo cách thủ công một loạt các tên gói để bạn không thể biết nó đến từ đâu. Nếu bạn thực sự nghĩ rằng stacktrace đầy đủ sẽ cung cấp thêm thông tin tôi sẽ làm điều đó, nhưng tôi không thuyết phục bạn cần bất kỳ nhiều hơn bạn đã có trong ý nghĩa đó, tôi sẽ thêm ánh xạ mặc dù. – Rockenstein