gpt4 book ai didi

java - 即使使用 @Transactional,Hibernate 也无法延迟初始化实体服务中的角色集合和 session

转载 作者:行者123 更新时间:2023-12-01 06:10:33 25 4
gpt4 key购买 nike

我有一个连接到两个数据源并有一个基础 dao 的 hibernate 项目。我也使用基本 dao 来派生数据源的通用 dao。

我有一个获取连接关系的服务,当实体具有一对多关系时,我会遇到以下错误。我陷入困境,无法获取一对多关系对象。

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

我读到可以选择使用“在 View 中打开 session ”,但我不知道如何操作。

错误

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

我有以下图层和文件

Controller 层

    @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;
}
}
.....

通用 fuse 服务

@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 @Column 注释。

@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

最佳答案

为什么要在类中创建所有方法@Transactional。您可以在需要时使用@Transactional。为了获得最佳实践,请在方法上使用 @Transactional

因此,对于您的情况,有两种解决方案:

1.急切地去接 child :

您需要将 fetchType Eagerly 与您的注释一起传递,即

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

<强>2。通过使用@Transactional:

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

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的更多详细信息Refer this link.

关于java - 即使使用 @Transactional,Hibernate 也无法延迟初始化实体服务中的角色集合和 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36049028/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com