hibernate - EJB 事务中的惰性初始化异常
问题描述
我是 java EJB 和 Hibernate 的新手,我对实体的 Hibernate Lazy Initalization 有疑问。基本上我有和 DAO 进行数据库调用,我有 2 层服务。所以我的问题是为什么我能够在 DAO 层上方的服务中访问延迟获取的集合,但无法从调用 DAO 之前的第二个服务的服务访问。
public MyServiceClass {
public MyData myService(int id) {
MyEjbService myEjbService = new MyEjbService();
MyData mydata = myEjbService.getMyData(id);
return mydata; // here i cannot reach the collection object of the entity, lazy init exception
}
}
public MyEjbService
{
public MyData getMyData(int id){
MyDao myDao = new MyDao();
MyData myData = myDao.getData(id);
return myData; // here I can see and reach collection objects inside of the entity
}
}
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public MyDao{
@TransactionAttribute(TransactionAttribute.SUPPORT)
public MyData getData(int id){
...
}
}
解决方案
首先,必须注入 EJB。切勿使用 new() 关键字创建它们。为此使用@Inject 注释。因此,在 MyEjbService 中,对 MyDao 使用 @Inject。
在 MyServiceClass 中,您超出了事务边界。您可以使用 PersistenceContextType.EXTENDED,但最好直接在 EJB 中初始化所有 LAZY 属性(如果属性是惰性的,则加入 FETCH 或使用 FetchType.EAGER 注释该属性)。
推荐阅读
- python - 使用 python 从 CMIP5 数据(netCDF 文件)中提取数据
- javascript - 根据一天中的日期和时间激活选项卡。JS 或 jQuery
- python - 单击 Div 元素:过时的元素引用
- azure - 跨订阅的 Ansible-Azure 映像复制
- c - 如何使用 Simulink Embedded Coder 修复未定义的引用 - dsPIC XC16
- powerbi - Power BI 报告以保存每天从网站获取的数据以及上次刷新日期
- amazon-web-services - AWS StepFunction Lambda 等待令牌 - 何时发生等待?
- flutter - 如何让 updateProfile() 在 Firebase 中工作?
- php - 未定义的属性:stdClass::$category
- c# - C#如何计算两个点之间的直角和等距的点