当前位置: 首页 > 面试题库 >

DAO,Spring 和Hibernate

吕修伟
2023-03-14
问题内容

如果有什么问题请指正。

现在,当我们将Spring
DAO用于ORM模板时,当我们使用@Transactional属性时,从外部而不是在方法内部调用该方法时,我们将无法控制事务和/或会话。

延迟加载可节省资源-减少对数据库的查询,减少将所有集合保持在应用程序内存中的内存

因此,如果lazy = false,则在链接集中有10,000条记录的情况下,所有相关联的集合都将被提取,这并不是很有效。

现在,我在DAO类中有一个方法,该方法应该返回给我一个User对象。它具有代表数据库链接表的集合。我需要通过id获取一个对象,然后查询其集合。

当我尝试访问此DAO方法返回的链接集合时,会发生Hibernate“无法延迟初始化集合”异常。

请解释一下,这里有什么解决方法?

更新 :好的,让我问你这个。DAO是抽象层,因此应该使用方法“ getUserById(Integer id)”返回一个Object。

如果在某些情况下我需要这些User对象的链接集合,而在其他情况下我需要那些集合,该怎么办?

只有两种方法:1)延迟加载= false
2)创建不同的方法:getUserByIdWithTheseCollections(),getUserByIdWithOtherCollections()以及在这些方法内部使用您的方法?

我的意思是只有2种方法,没有更好的方法吗?

更新2
:请解释一下,什么可以让我明确使用SESSIONFACTORY?实际情况如何?我们创建DAO对象的实例,然后将其注入会话工厂,这是否意味着对DAO的两个后续方法调用将在同一事务中运行?在我看来,无论如何,DAO脱离了使用它的类!

逻辑和事务封装在DAO中,对吗?


问题答案:

您可以在事务中获取链接的集合以加载它,而仍在事务中:

User user = sessionFactory.getCurrentSession().get(User.class, userId);
user.getLinkedCollection().size();
return user;

正如BalusC指出的那样,您可以使用Hibernate.initialize()代替size()。干净很多。

然后,当您返回这样的实体时,惰性字段已经初始化。

回复您的PS-在服务级别(而不是DAO)级别使用事务是否可行?好像是这样,因为在单独的事务中进行每个DAO调用似乎是一种浪费(并且可能是错误的)。



 类似资料:
  • 阅读有关在DAO层中使用Java泛型的信息,我怀疑将其应用于spring数据存储库。我的意思是,使用 spring 数据存储库,你有这样的东西: 但是如果我有其他10个实体,我必须创建10个类似于上面的接口来执行CRUD操作等等,我认为这不是很可扩展的。Java Generics和DAO是关于创建一个接口和一个实现,并将其用于实体,但使用Spring数据存储库,我必须为每个实体创建一个界面,因此。

  • 我正在研究Spring支持的数据访问技术,我注意到它提到了多个选项,但我不确定它们之间的区别: Spring-DAO(http://docs.spring.io/spring/docs/2.0.8/reference/dao.html) Spring-orm(http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/htm

  • 问题内容: 我正在设计一个基于JPA / Hibernate,Spring和Wicket的新应用。不过,DAO和Service层之间的区别对我来说还不清楚。根据维基百科,DAO是 一个为某种类型的数据库或持久性机制提供抽象接口的对象,提供一些特定的操作而不公开数据库的详细信息。 我想知道DAO是否可以包含与数据访问无关的方法,但是使用查询执行起来会更容易吗?例如,“获取在一组特定机场上运营的所有航

  • 在我的示例中,我有一个Hibernate实体和一个DAO。 当我以这种方式使用DAO时 数据库中只保存了一行(Action2)。当我删除注释时,两行(Action1和Action2)都被保存(这是我需要的行为)。我的问题是服务层上的事务注释如何影响事务(方法executeTransaction())的执行。为什么没有服务层上的事务性注释,这两行都保存在数据库中,而只有最后一行与此注释一起保存?

  • 问题内容: 继上一个问题DAO和Service层(JPA / Hibernate + Spring)之后 ,我决定在使用JPA / Hibernate,Spring和Wicket的应用程序中(至少在开始时)仅对我的数据层使用一个DAO。提出了使用通用CRUD方法的方法,但是我不太确定如何使用JPA来实现。您能否举个例子或分享有关此的链接? 问题答案: 这是一个示例界面: 和一个实现:

  • 问题内容: 我知道Hibernate实现了ORM(对象关系映射),JDBC实现了哪种类型的映射?它实现了DAO吗?我不完全了解DAO如何与JDBC相关…? 问题答案: DAO不是映射。DAO代表数据访问对象。看起来像这样: 对于DAO,JDBC只是实现细节。 hibernate可能是另一个。 JPA 可能 是另一个(如果您要将现有的旧版应用程序迁移到JPA;对于新应用程序,这有点奇怪,因为JPA本