java - 当我尝试从 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。那是问题:)
解决方案
您可以通过以下方式获取完整的对象树:
import org.springframework.transaction.annotation.Transactional;
@Transactional
public List<Answer> getAnswers(Long id) {
return repository.findByMessagesidOrderBySenddateDesc(id);
}
推荐阅读
- ruby - += ruby 中的运算符重载
- api - 从 API Flutter FetchData 并使用 sqflite 保存本地
- json - 如何生成具有重复对象的文档
- php - 根据另一个数组显示一个数组的成员
- python - 如何从文件中删除特定文本?
- android - React Native 找不到本地方法
- c - 我在哪里可以下载 dwmapi.lib?
- python - 无法使用 django 将嵌入式文档插入模型
- android - 使用本地计算机内存中的 Glide 和 Retrofit 显示图像
- node.js - TypeORM 存储库 createQueryBuilder 捕获错误但继续执行