相关疑难解决方法(0)

org.hibernate.LazyInitializationException - 无法初始化代理 - 没有会话

我得到以下异常:

Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - no Session
    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:167)
    at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:215)
    at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)
    at sei.persistence.wf.entities.Element_$$_jvstc68_47.getNote(Element_$$_jvstc68_47.java)
    at JSON_to_XML.createBpmnRepresantation(JSON_to_XML.java:139)
    at JSON_to_XML.main(JSON_to_XML.java:84)
Run Code Online (Sandbox Code Playgroud)

当我尝试从main调用以下行时:

Model subProcessModel = getModelByModelGroup(1112);
System.out.println(subProcessModel.getElement().getNote());
Run Code Online (Sandbox Code Playgroud)

getModelByModelGroup(int modelgroupid)首先实现了这个方法,如下所示:

public static Model getModelByModelGroup(int modelGroupId, boolean openTransaction) {

    Session session = SessionFactoryHelper.getSessionFactory().getCurrentSession();     
    Transaction tx = null;

    if (openTransaction) {
        tx = session.getTransaction();
    }

    String responseMessage = "";

    try {
        if (openTransaction) {
            tx.begin();
        }
        Query query = session.createQuery("from Model where modelGroup.id = :modelGroupId");
        query.setParameter("modelGroupId", modelGroupId); …
Run Code Online (Sandbox Code Playgroud)

java orm session hibernate lazy-loading

159
推荐指数
10
解决办法
40万
查看次数

Hibernate和iBATIS

对于我们的新产品重新设计,我们正在从Java中选择最佳框架.考虑到模型的数据库不可知方法,我们正在研究Struts + Spring与iBATIS或Hibernate之间的选择.请提供最好的建议,因为两者都提供持久性.

java persistence frameworks hibernate ibatis

73
推荐指数
6
解决办法
8万
查看次数

Hibernate.initialize()的工作原理

我知道在会话之外使用延迟加载对象/集合,我们这样Hibernate.initialize(Object obj)做,初始化作为参数传递给initialize()方法的对象,并且可以在会话范围之外使用.

但是我无法理解它是如何工作的.我的意思是,如果我们这样做,那么我们最终会有急切的提取,所以为什么我们在配置中做了懒惰,最终在运行时进行了急切的提取.

换句话说,我想知道使用Hibernate.initialize()eagerly加载该对象之间的区别.

我弄错了还是错过了什么?

java hibernate

21
推荐指数
3
解决办法
5万
查看次数

Hibernate/c3p0连接泄漏

我们正在加载spring/hibernate/c3p0应用程序.当我将c3p0 maxPoolSize减少到远远低于并发用户数时,我们的应用程序就会挂起.日志中没有错误消息,但它也没有继续前进.

我希望应用程序放慢速度,但不要完全停止.

这是我们的c3p0配置:

<bean id="coreDataSource" 
          class="com.mchange.v2.c3p0.ComboPooledDataSource"
          destroy-method="close"
          p:driverClass="${core.jdbc.driver}"
          p:jdbcUrl="${core.jdbc.url}"
          p:user="${core.jdbc.user}"
          p:acquireIncrement="5"        
          p:acquireRetryAttempts="10"
          p:acquireRetryDelay="5000"
          p:initialPoolSize="52"
          p:maxIdleTime="3600"
          p:maxIdleTimeExcessConnections="300"
          p:minPoolSize="52"
          p:maxPoolSize="125"
          p:numHelperThreads="6"
          p:unreturnedConnectionTimeout="0">
          <property name="password">
              <bean class="com.docfinity.util.encryption.SpringStringDecrypter"
                  p:decryptFlag="${core.jdbc.decryptPasswordFlag}"
                  p:encryptedString="${core.jdbc.password}" />
          </property>
    </bean>
Run Code Online (Sandbox Code Playgroud)

如果我扔了160个用户,这将锁定.

我尝试将unreturnedConnectionTimeout设置为正值(120秒),并查看我们的应用程序中显示的堆栈跟踪.堆栈跟踪来自我们的应用程序中的各种不同方法.这并不是说我们可以指出一种方法,并说它正在泄漏连接.

任何帮助调试此问题的人都将非常感激.

hibernate c3p0

10
推荐指数
1
解决办法
1万
查看次数

初始化延迟集合

我正在开发一个Struts2 + Spring + Hibernate webapp,我需要在检索一个对象或该对象的集合后初始化一个惰性集合.

用例

我有一个团队模型,其中一个关系急切地被称为员工(我认为很明显这是一个集合).反过来,员工模型有一个懒惰的关系注册表,我只需要一些特定的操作,所以我根本不需要急切地加载它.

现在.我打电话给我teamService(用Spring注入我的Struts2控制器),以便检索teamItem已经加载了他的收集员工的特定信息.现在是时候为每个员工加载其注册表关系了.

使用employeeService(也用Spring注入我的Struts2控制器)我调用initializeCollections()他的DAO方法,该方法应加载延迟集合调用

Hibernate.initialize(employee.getRegistry());
Run Code Online (Sandbox Code Playgroud)

当我执行此操作时,org.hibernate.LazyInitializationException: could not initialize proxy - no Session会抛出异常.

堆栈跟踪:

at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:167) ~[hibernate-core-3.6.10.Final.jar:3.6.10.Final]
at org.hibernate.Hibernate.initialize(Hibernate.java:414) ~[hibernate-core-3.6.10.Final.jar:3.6.10.Final]
at web.bkgd.simba.dao.registry.RegistryEmployeeDAO.initializeCollections(RegistryEmployeeDAO.java:438) ~[RegistryEmployeeDAO.class:?]
at web.bkgd.simba.service.abstractions.BaseService.initializeCollections(BaseService.java:142) ~[BaseService.class:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.7.0_79]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[?:1.7.0_79]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.7.0_79]
at java.lang.reflect.Method.invoke(Method.java:606) ~[?:1.7.0_79]
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) ~[spring-aop-4.1.0.RELEASE.jar:4.1.0.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) ~[spring-aop-4.1.0.RELEASE.jar:4.1.0.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) ~[spring-aop-4.1.0.RELEASE.jar:4.1.0.RELEASE]
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98) ~[spring-tx-4.1.0.RELEASE.jar:4.1.0.RELEASE]
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:266) ~[spring-tx-4.1.0.RELEASE.jar:4.1.0.RELEASE] …
Run Code Online (Sandbox Code Playgroud)

java hibernate lazy-loading

9
推荐指数
1
解决办法
3664
查看次数

Spring MVC + Hibernate:无法初始化代理 - 没有Session

注意:请参阅我自己对此问题的回答,以获取我如何解决此问题的示例.

我在Spring MVC 4 + Hibernate 4项目中遇到以下异常:

org.hibernate.LazyInitializationException:懒得初始化一个角色集合:com.mysite.Company.acknowledgements,无法初始化代理 - 没有Session

在阅读了很多关于这个问题的其他问题后,我理解为什么会发生这种异常,但我不确定如何以一种好的方式解决它.我正在做以下事情:

  1. 我的Spring MVC控制器调用服务中的方法
  2. service方法调用DAO类中的方法
  3. DAO类中的方法通过Hibernate获取实体对象并将其返回给调用服务
  4. 该服务将获取的对象返回给控制器
  5. 控制器将对象传递给视图(JSP)
  6. 该视图尝试迭代一个懒惰加载的多对多关联(因此是一个代理对象)
  7. 抛出异常是因为此时会话已关闭,并且代理无法加载关联数据

我之前使用过PHP和doctrine2,这种做事方式没有问题.我试图找出解决这个问题的最佳方法,因为到目前为止我找到的解决方案看起来并不那么好:

  • 急切加载关联,可能会加载大量不必要的数据
  • 调用Hibernate.initialize(myObject.getAssociation());- 这意味着我必须遍历关联来初始化它们(我猜),而且事实上我必须这样做,有点使得延迟加载不那么整洁
  • 使用Spring过滤器在视图中打开会话,但我怀疑这是一件好事吗?

我试着@Transactional在我的服务中使用,但没有运气.这是有道理的,因为我试图访问我的服务方法返回尚未加载的数据.理想情况下,我希望能够从我的视图中访问任何关联.我想在我的服务中初始化关联的缺点是我必须明确定义我需要的数据 - 但这取决于使用服务的上下文(控制器).我不确定我是否可以在我的控制器中执行此操作而不会丢失DBAL层提供的抽象.我希望这是有道理的.无论哪种方式,如果我不必总是明确定义我想要哪些数据可用于我的视图,那就太好了,但只是让视图做它的事情.如果那是不可能的,那么我只是在寻找最优雅的解决方案.

以下是我的代码.

视图

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<h1><c:out value="${company.name}" /> (ID: <c:out value="${company.id}" />)</h1>

<c:forEach var="acknowledgement" items="${company.acknowledgements}">
    <p><c:out value="${acknowledgement.name}" /></p>
</c:forEach>
Run Code Online (Sandbox Code Playgroud)

调节器

@Controller
public class ProfileController {
    @Autowired
    private CompanyService companyService;

    @RequestMapping("/profile/view/{id}")
    public String view(Model model, @PathVariable int id) {
        Company …
Run Code Online (Sandbox Code Playgroud)

spring hibernate spring-mvc

5
推荐指数
2
解决办法
2万
查看次数

Hibernate 应用程序中的连接泄漏

我在 Java 企业应用程序中工作。该应用程序具有后端的休眠框架。由于最近应用程序的变化,一些代码消耗了来自 weblogic 服务器的所有 JDBC 连接池。

应用程序连接是在代码中处理的属性,对于每个线程,我们使用 threadlocal 类创建每个会话。所以创建连接没有问题。该应用程序已使用超过 5 年。

我们怀疑最近的代码更改导致了这个主要问题。最后我们决定使用分析器工具来调查这个问题。

在此之前,我将回顾最近的代码更改,那么我在回顾时需要记住的 hibernate 关键点是什么?

这是非常危急/严重的情况。所以建议我一些提示来解决这个问题..

谢谢

java hibernate

1
推荐指数
1
解决办法
1万
查看次数