gpt4 book ai didi

java - Spring/Hibernate 中的链式 DAO 方法用于延迟初始化

转载 作者:行者123 更新时间:2023-11-30 08:54:13 25 4
gpt4 key购买 nike

我有一些相互关联的模型类(UserGroupMessage 等)。由于许多原因(我没有提供细节,但这不是一个灵活的决定)关系是惰性,我希望它们保持惰性。

有时我想加载一些类集合。体育user.getGroups()user.getMessages() 但是,由于延迟加载,我需要调用 Hibernate.initialize() DAO 类的方法,这对我来说没问题。

问题是,是否有一种策略可以避免声明许多 DAO 方法来加载集合的多个组合、重用这些方法?

这是我想避免的事情的示例:

用户 Controller :

public class UserController {

@Autowired
private UserService userService;

@RequestMapping(value = "/user/view/{id}", method = RequestMethod.GET)
public String view(@PathVariable Long id, Model model) {
// Choose one between the following, depending on the case
User user = userService.getUser(id);
User user = userService.getUserWithGroups(id);
User user = userService.getUserWithGroupsAndMessages(id);
//...
}
}

还有 UserDAOImpl:

@Repository
public class UserDAOImpl implements UserDAO {
@Override
public User getUser(long id) {
return (User) this.getCurrentSession().get(User.class, id);
}

@Override
public User getUserWithGroups(long id) {
User user = (User) this.getCurrentSession().get(User.class, id);
Hibernate.initialize(user.getGroups());
return user;
}

@Override
public User getUserWithGroupsAndMessages(long id) {
User user = (User) this.getCurrentSession().get(User.class, id);
Hibernate.initialize(user.getGroups());
Hibernate.initialize(user.getMessages());
return user;
}
}

重点是我想避免为每种情况下必须加载的每种集合组合创建多个 DAO 方法。我想在 Controller 中实现类似于 User user = userService.getUser(id).initGroups().initMessages(); 的调用语法,只链接我需要的特定方法案件。

但在这个特定示例中,initXXX() 方法将在模型类 User 中,它可能不包含任何 @Autowired 服务,因此这不是一个可能的解决方案。

有什么想法吗?

--编辑--

一些不可行的想法:

选项 1.User 模型类中声明 initGroups():

用户

@Entity
@Table(name="user")
public class User implements Serializable {

//...

public User initGroups() {
Hibernate.initialize(getGroups());
return this;
}
}

以这种方式从 Controller 调用:User user = userService.getUser(id).initGroups();

选项 2.UserServiceUserDAO 中声明 initGroups():

UserServiceImpl

@Service
@Transactional
public class UserServiceImpl implements UserService {

//...

@Override
public User initGrupos(User user) {
return userDAO.initGroups(user);
}
}

UserDAOImpl

@Repository
public class UserDAOImpl implements UserDAO {

//...

@Override
public User initGroups(User user) {
Hibernate.initialize(user.getGroups());
return user;
}
}

以这种方式从 Controller 调用:

User user = userService.getUser(id);
user = userService.initGroups(user);

结果(两者相同):

org.hibernate.HibernateException: collection is not associated with any session
org.hibernate.collection.internal.AbstractPersistentCollection.forceInitialization(AbstractPersistentCollection.java:484)
org.hibernate.Hibernate.initialize(Hibernate.java:78)
...

最佳答案

init 方法不需要服务,它们只需要调用 Hibernate.initialize,同时保持先前加载对象的 Hibernate session (这是最重要的部分)。

关于java - Spring/Hibernate 中的链式 DAO 方法用于延迟初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29517764/

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