java - 在 DAO 方法中访问延迟加载的集合时出现 NullPointerException

标签 java multithreading spring hibernate lazy-loading

在应用程序中运行多个线程时,我遇到了 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;

最佳答案

我认为您应该使用第三个连接表,并使用 Criteria 来加载集合。

    @OneToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "table", joinColumns = {@JoinColumn(name = "COLLECTION_ID", nullable = false)}, inverseJoinColumns = { @JoinColumn(name = "FOO_ID", nullable = true) })
    private List<CollectionMember> collectionMembers = new ArrayList<CollectionMember>();


@ManyToOne(mappedBy="collectionMembers")
private CollectionCode collectionCode;

关于java - 在 DAO 方法中访问延迟加载的集合时出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16743594/

相关文章:

java - 是否有一种 Java 数据结构实际上是具有双索引和内置插值的 ArrayList?

java - Jenkins、Maven、Nexus - 将第 3 方 JAR 部署到需要身份验证的 Nexus

java - 在 Spring Boot 中定义 beans 有什么意义?

java - 如何识别maven项目中潜在的java依赖命名空间冲突?

java - 使用 springframework 验证错误验证枚举

java - 循环遍历 div 中的页面链接,然后单击 Selenium (java) 中包含特定值的每个链接

java - 良好实践 : Exception Handling

c# - 在 C# 中编译并执行外部代码

c++ - 在 C++ 中处理 boost 线程竞争条件

java - 当客户端关闭连接时,Spring StreamingResponseBody 请求线程未清理