首页 > 解决方案 > 当我尝试从 ManyToOne 关系中获取对象时出现 LazyLoadingException

问题描述

这是我的实体:


@Entity
public class Answer implements Serializable {
    
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="user")
    private CoreUsers user;
    
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="person")
    private Person person;
     
}

服务:

@Transactional
public class AnswerService {

    @Autowired
    private AnswerRepository repository;

    public List<Answer> getAnswers(Long id) {
        return repository.findByMessagesidOrderBySenddateDesc(id);
    }
}

回购:

@Repository
public interface AnswerRepository extends JpaRepository<Answer, Long> {
    
    List<Answer>  findByMessagesIdOrderBySenddateDesc(Long id);
}

applicationContext.xml

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="jpaPropertyMap">
            <map>
                <entry key="hibernate.cache.provider_class"  value="org.hibernate.cache.EhCacheProvider"/>
                <entry key="hibernate.enable_lazy_load_no_trans" value="true" />
                <entry key="hibernate.current_session_context_class" value="thread" />
                <entry key="org.hibernate.cacheable" value="false" />
            </map>
        </property>
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="databasePlatform" value="org.hibernate.dialect.PostgreSQLDialect" />
                <property name="showSql" value="false" />
                <property name="showSql" value="true" />
                <property name="generateDdl" value="false" />
            </bean>
        </property>
        <property name="persistenceUnitName" value="cccPersistenceUnit" />
    </bean>

    <bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
        <property name="jpaDialect">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>
        </property>
    </bean>

我通过我的服务类在 JSF bean 中加载了一个答案(列表)集合。当我尝试从集合中获取 Person 对象时——一切正常,但是当我尝试从集合中获取 User 对象时——hibernate 抛出 LazyInitializationException。我究竟做错了什么?

我是对的,休眠尝试从休眠会话中获取用户对象吗?

请随时询问任何其他信息。

感谢您的帮助!

在创建线程之前,我搜索了很多次

UPD。 我将实体设置为急切加载,并注意到我的应用程序尝试从用户表加载不存在的 ID。那是问题:)

标签: javaspringhibernatejpaspring-data-jpa

解决方案


您可以通过以下方式获取完整的对象树:

import org.springframework.transaction.annotation.Transactional;

@Transactional
public List<Answer> getAnswers(Long id) {
    return repository.findByMessagesidOrderBySenddateDesc(id);
}

推荐阅读