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

如何在控制台应用程序中使用spring-data-jpa和hibernate时延迟加载收集

施景同
2023-03-14

我有一个小的控制台应用程序,我正在使用spring-data-jpa和Hibernate。我真的搞不懂在一个独立的控制台应用程序中使用spring-data-jpa及其存储库时如何延迟初始化集合。下面是我的一些代码:

@Entity
public class User {
...
    @OneToMany(cascade=CascadeType.ALL)
    @JoinColumn(name="USER_ORDER_ID")
    private Set<Order> orders = new HashSet<Order>();
...
}

存储库:

public interface UserRepository extends PagingAndSortingRepository<User, Long> {

    public ArrayList<User> findByFirstNameIgnoreCase(String firstName);
}

服务影响:

@Service
@Repository
@Transactional
public class UserServiceImpl implements UserService {
    @Autowired
    private UserRepository userRepository;

public ArrayList<User> findByFirstNameIgnoreCase(String firstName) {
    ArrayList<User> users = new ArrayList<User>();
    users = userRepository.findByFirstNameIgnoreCase(firstName);
    return users;
}
...
user = userRepository.findByFirstNameIgnoreCase("john").get(0);
orders = user.getOrders();
for (Order order : orders) {
  LOGGER.info("getting orders: " + order.getId());
}    

共有1个答案

邹玮
2023-03-14

一种解决方案可以是使user.orders成为通过

@OneToMany(cascade=CascadeType.ALL, fetch = FetchType.EAGER)
private Set<Order> orders = new HashSet<Order>();

默认情况下,实体关联是懒散加载的。这意味着orders集实际上只是一个代理对象,在调用其上的方法之前,它不会被初始化。这很好,因为关联的order对象不会被加载,除非需要它们。但是,如果试图访问正在运行的事务之外的未初始化集合,则可能会导致问题。

如果您知道在大多数情况下您将需要用户的命令,那么使关联急切地获取是有意义的。否则,您必须确保在事务内部初始化/加载集合。您提到的OpenSessionInviewFilter确保事务在请求处理期间保持打开状态,这就是为什么在yout WebApp中没有这个问题的原因。

TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
    @Override
    protected void doInTransactionWithoutResult(TransactionStatus status) {
    ...
    }
});
 类似资料:
  • 问题内容: 我有一个小型控制台应用程序,并且将spring-data-jpa与hibernate一起使用。我真的不知道在独立控制台应用程序中使用spring-data- jpa及其存储库时如何懒惰初始化集合。这是我的一些代码: 资料库: 服务展示: 我的主要方法: foreach循环获取异常: EVERE:无法延迟初始化角色集合:com.aki.util.User.orders,未关闭任何会话或会

  • 问题内容: 我倾向于将Hibernate与Spring框架结合使用,它具有声明式事务划分功能(例如@Transactional)。 众所周知,hibernate试图尽可能做到 非侵入性 和 透明性 ,但是事实证明,在使用关系时这 更具挑战性 。 我看到了许多具有不同透明度的设计方案。 使关系不延迟加载(例如, 这违反了整个延迟加载的想法。 使用初始化初始化集合 这意味着与DAO的耦合较高 尽管我们

  • 问题内容: 我有一个Person类: 与多对多的关系是懒惰的。 在我的控制器中 而PersonRepository只是此代码. 但是,在此控制器中,我实际上需要惰性数据。如何触发加载? 尝试访问它将会失败 无法延迟初始化角色集合:no.dusken.momus.model.Person.roles,无法初始化代理-没有会话 或其他例外情况,具体取决于我的尝试。 我的xml-description,

  • 问题内容: 我正在使用Spring + Hibernate。我所有的HibernateDAO都直接使用sessionFactory。 我有应用程序层->服务层-> DAO层,所有集合都被缓慢加载。 因此,问题在于,有时在应用程序层(包含GUI / swing)中,我会使用服务层方法(包含@Transactional批注)加载实体,并且我想使用此对象的惰性属性,但忽略了会话已经关闭。 解决此问题的最

  • 问题内容: 我以这样一种方式进行了JPA设置:如果我不使用延迟加载,则几乎将加载整个数据库。我也直接在模型上使用序列化,因此有时我需要初始化代理。 我只想在集合上使用延迟加载。急切地获取一些奇异实体的事实就很好了。但是,无论我如何尝试设置集合,我都永远不会得到代理集合,而我总是会得到完全加载的集合。 这是一些示例代码: 所以这里的问题是,当我检查调试器时,答复的persistantBag-list

  • 问题内容: 我正在使用Hibernate的延迟加载,并且即使在web.xml中定义了一个使用OpenSessionInViewFilter的过滤器后,也正在获取sessionFactory缺少的异常 我的servlet-context.xml具有以下会话和事务管理器定义: 我仍然收到以下异常: 我尝试定义一个sessionFactoryBeanName属性,但结果没有改变。我究竟做错了什么? 问题