当前位置: 首页 > 知识库问答 >
问题:

Hibernate无法在实体服务中延迟初始化角色no会话的集合,即使使用@Transactional

卢子民
2023-03-14

我有一个hibernate项目,它连接到两个数据源,并有一个基本dao。我还使用基本dao为数据源派生通用dao。

我有一个获取连接关系的服务,当一个实体有一对多关系时,我遇到了以下错误。我被困在无法获取一对多关系对象的问题上。

我使用apache commons beanutils复制属性,希望它能够进行深度复制,但它也不起作用。我的想法快用完了。

我读到,我可以选择在视图中使用开放式会话,但我不确定如何进行。

错误

failed to lazily initialize a collection of role: com.sony.spe.mc.domain.OperationalUnit.user, could not initialize proxy - no Session

我有以下图层和文件

控制器层

    @ApiOperation(value = "read", nickname = "getByID")
    @RequestMapping(value="/read", method = RequestMethod.GET)
    @ApiImplicitParams({
        @ApiImplicitParam(name = "id", value = "User's id", required = true, dataType = "int", paramType = "query")
    })
    @ApiResponses(value = { 
            @ApiResponse(code = 200, message = "Success", response = User.class),
            @ApiResponse(code = 500, message = "Failure")})
    @ResponseBody
    public UserProxy getByID(long id) {
        UserProxy user;
        try {               
            user = userService.fetchUserById(id);
        }
        catch(Exception ex) {
            ex.printStackTrace();
            return null;
        }
        return user;
    }

服务层

用户服务

@Service
@Transactional("fuseTransactionManager")
public class UserServiceImpl extends BaseFuseServiceImpl<User> implements UserService {
    @Autowired
    UserDao userDao;

    @Override 
    protected UserDao getDao() {
        return userDao;
    }

    @Override
    public UserProxy fetchUserById(long id) {
        try {
/***** ERROR HAPPENS HERE. THE USER OBJECT IS NOT ABLE TO GET THE ONE TO MANY OBJECTS even though I have @Transactional *****/
            User user = userDao.fetchEntityById(User.class, id);
            UserProxy userProxy = new UserProxy();
            BeanUtils.copyProperties(userProxy, user);
            return userProxy;
        } catch(Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }
.....

通用保险丝服务

@Service
public class BaseFuseServiceImpl<T extends Serializable> extends BaseServiceImpl<T> implements BaseFuseService<T> {
    @Autowired
    BaseFuseDao<T> baseFuseDao;

    @Override
    protected BaseFuseDao<T> getDao() {
        return baseFuseDao;
    }
}

特定服务实现的非常通用的服务

@Service
@Transactional("baseTransactionManager")
public abstract class BaseServiceImpl<T extends Serializable> implements BaseService<T> {
    protected abstract BaseDao<T> getDao();

    @Override
    public T fetchEntityById(Class<T> entityClass, long id) {
        return getDao().fetchEntityById(entityClass, id);
    }

用户实体。还有一个对应的代理对象,除了没有@Entity@列注释外,它几乎完全相同。

@Entity
@Table(name="USER")
//@AttributeOverride(name = "ID", column = @Column(name = "USER_ID",  nullable = false))
public class User extends BaseEntity {
//public class User implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 5236507646361562577L;

    @Id  
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "USER_ID")
    private long id;  

    @OneToMany(cascade=CascadeType.ALL)  
    @JoinTable(name="USER_OPERATIONALUNIT",  
        joinColumns = {@JoinColumn(name="USER_ID")},  
        inverseJoinColumns = {@JoinColumn(name="OPERATIONALUNIT_ID")}
    )  
    private Set<OperationalUnit> operationalUnit;
.... getters and setters

共有1个答案

司马羽
2023-03-14

为什么要将所有方法都设置为类内的事务性方法。您可以在需要时使用事务性。要获得最佳实践,请在方法上使用事务性。

所以在你的情况下有2个解决方案:

1.急切地抓住孩子:

您需要急切地将fetchType与注释一起传递,即。

@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)

2、使用@事务:

在这里,您需要在当前事务中初始化您的集合,即。

public UserProxy fetchUserById(long id) {
        try {
            User user = userDao.fetchEntityById(User.class, id);
// Here you need to initialize collection using getter method after retrieving object
            user.getOperationalUnit().size();
//Now you will get childs with your parent entity
                UserProxy userProxy = new UserProxy();
                BeanUtils.copyProperties(userProxy, user);
                return userProxy;
            } catch(Exception ex) {
                ex.printStackTrace();
                return null;
            }
        }

有关@Transactional的更多详细信息,请参阅此链接。

 类似资料:
  • 问题内容: 我有以下提到的实体类,当我执行我的应用程序时,我得到了以下异常。其他一些类似的问题也不能解决问题。 我该如何解决这个问题? Emp实体 部门实体 DAOImpl 泽西岛RESTful服务 springapplicationContext.xml 问题答案: 我已通过在web.xml中添加以下内容解决了该问题 在这里和这里礼貌 谢谢

  • 问题内容: 我使用休眠来创建一个REST API。我创建了一种获取表中所有项目的方法。 这是我的Language.java 这是我的Patient.java 重要提示:Bean和映射是通过NetBeans从MySQL数据库反向工程的。调用时,不需要获取任何与之相关的数据。我的表格只有2列,而。表的前键为 在rest api中使用此方法之前,它没有任何异常即可完美运行。但是,当我在rest api中

  • 问题内容: 我使用hibernate创建一个REST API。我创建了一种获取表中所有项目的方法。 这是我的Language.java 这是我的Patient.java 重要提示:Bean和映射是通过NetBeans从MySQL数据库反向工程的。调用时,不需要获取任何与之相关的数据。我的表格只有2列,而。表的前键为 在rest api中使用此方法之前,它没有任何异常即可完美运行。但是,当我在res

  • 我正在制作一个网站,我试图在其中订购配料。我选择配料并输入其数量,然后单击添加。我重复了几次。然后我进入下一页,在其中我选择了一个供应商。然后我按“订单”。 预计将Nabavka插入数据库并打开一个页面,说明订单成功,但我收到一个异常,告诉我不能懒惰地初始化它。 来自NabavkaController。java: Nabavka.java: 纳米尔尼卡。java: 纳巴夫卡科帕。java: 纳巴夫

  • 我不明白为什么会发生这种情况。根据代码路径,当引发此异常时,我应该在同一线程中并且会话应存在。 有人能告诉我我错过了什么吗? 我有设置 在hibernate.cfg.xml档案里 我在Servlet过滤器中创建了以下代码 在index.xhtml文件中,我有以下调用: 做一些事情 index.xhtml正在使用使用ui include加载menu.xhtml文件的模板。然后,菜单文件会插入menu

  • 我正在使用JPA(Hibernate 4 . 3 . 3作为持久性提供者)和Spring (3.2.2),我所有的字段都加载得很好,但是当我试图访问我的集合时,它抛出了错误- 当我调试这个时,我的实体类中定义的每个集合都有错误- 我尝试使用collection.size()和Hibernate.initialize(),但都不起作用。在Internet上搜索时,我发现扩展Persitence将解决