问题标签 [spring-orm]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
679 浏览

hibernate - 使用 Spring Roo 项目并获取 org.hibernate.LazyInitializationException: could not initialize proxy - no Session

编辑5:

用于探索这个问题的解决方案的代码在 bitbucket 上:https ://bitbucket.org/jcalleja/lazy-init-exception


我意识到 SO 上还有许多其他 LazyInitializationException 帖子,但我无法从他们那里获得我需要的信息。

涉及的项目:

  • memdrill 数据
  • 数据使用

memdrill-data 是一个 Spring Roo 托管项目。这里没有 Web 组件。我有简单的:

并添加了一些实体。例如:

没关系,但为了记录,我使用的是 Roo 1.1.4。可能在此讨论中不需要 applicationContext.xml,但无论如何都需要它(由 Roo 生成后未触及):

数据使用取决于 memdrill-data,我现在只是通过它测试驱动 memdrill-data。这就是数据使用中发生的所有事情:

findAllItems() 是 Roo 在 Item_Roo_Entity.aj 中生成的默认值:

这就是我得到的:

因此,当我尝试访问延迟加载的数据以填充 LobString POJO 时,没有正在进行的会话并且它崩溃了。

我能得到的最接近的(在我的代码中,即不是我所依赖的库)放入 LobString 访问代码(例如,item.getContent().getId())就像推入 findAllItems() 或创建像这样的新方法只是为了说明这一点:

这仍然给了我同样的例外,这意味着在 .getResultList() 返回列表之后没有会话正在进行。

正如其他 SO 帖子所建议的那样,我已经尝试将 @Transactional 放在该方法上,但我仍然得到 LazyInitializationException。但即使这确实有效......为什么我需要启动一个事务来从数据库中读取数据?事务不是为了在写入时保持数据完整性吗?

在我看来,解决这个问题的一种方法是以某种方式从“SELECT o FROM Item o”中指定一个不同的查询……一个也获取 LobString 数据的查询……但这似乎不太正确,即使它会在这种特殊情况下飞行。

当我访问尚未加载的数据时,我期待 Hibernate 启动一个新会话......但显然,它不像我预期的那样工作。

熟悉 Hibernate 的人可以解释在这种情况下发生了什么,并可能建议可以使用哪些选项来处理这个问题?

谢谢

编辑1:

顺便说一句,如果我将以下 log4j.propeties 添加到类路径:

我得到:

因此,正如“found 1 as column [content1_]”行所示,我至少拥有包含 LobString 数据的表中行的外键......但如果没有 LazyInitializationException,我无法访问该 ID。也许我可以如果我能拿到 LobString,请按 id 获取...但是 i.getContent() 和 i.getContent().getId() 给出异常。外键应与 LobString 表的主键 id 匹配 ieigetContent( ).getId().. 但似乎无法从 i... 访问外键,正如日志所示,它实际上是从数据库中获取的。

无论如何,即使我确实得到了外键......不得不留下 LobString.find(id) 或类似的东西不是一个好的解决方案。Hibernate 应该填充您的对象图...

编辑2:

在此编辑中要提出 2 点。执行通过以下方式org.springframework.orm.jpa.SharedEntityManagerCreator.DeferredQueryInvocationHandler.invoke(Object, Method, Object[])

首先,如果使用“getResultList”,EntityManager 将被关闭。我假设 EntityManager 是一个 JPA 构造,无需详细说明,它映射到 Hibernate 的 Session。

第二......如果我在调试时深入研究,我可以看到应该延迟加载的数据“这是项目的内容”......所以我实际上已经将该数据加载到内存中...... 1)因为它是懒惰的不应该 2) 即使它在那里我也无法访问它,因为我得到了 LazyInitializationException。

在调试时,我可以看到数据加载在以下两个地方:

1)我的主要方法(见上文:主要方法中的Item i = items.get(0)) com.memdrill.prototypes.datause.Main.main(String[])

i -> 内容 -> 处理程序 -> 目标 -> 数据:“这是项目的内容”

2)在关闭会话的方法中 org.springframework.orm.jpa.SharedEntityManagerCreator.DeferredQueryInvocationHandler.invoke(Object, Method, Object[])::

retVal -> elementData[0] -> content -> handler -> target -> data: "this is the content of the item"

懒惰加载的数据太多了……我做错了什么?

我似乎也有延迟加载 LobString 的规范。但如果是这样的话,而且我确实有内存中的内容......为什么我不能访问它?

编辑3:

如果我在调试模式下保持足够长的时间,它看起来只有在调试时才会发生 Edit2 中的行为(在内存中延迟加载数据).....

所以基本上,如果我在调试中运行并且只是通过我的断点一直点击“播放”“播放”“播放”,我会得到 LazyInitializationException ......但是如果我在调试模式下停留足够长的时间,没有 LazyInitializationException,我会得到数据并打印到标准输出。

有任何想法吗?

编辑4:

感谢SO question,我现在可以使用以下方法急切地获取所有 LobString:

输出:

几乎就是我想要的。我只想要 LobString 的 id。这个想法是这将是一个 REST 调用,我只想返回可用于单独请求的 LobString 的 Item “基本”数据和 id。

知道什么样的 JPQL 查询可以实现这一点吗?(任何有助于理解幕后情况的一般评论将不胜感激) - 谢谢

0 投票
0 回答
532 浏览

spring - 多租户应用程序的 Spring 和 Hibernate 急切初始化问题

我们使用 Spring 3.2.0 和 Hibernate 4.1.12 开发 Web 应用程序。

该应用程序支持“基于数据源”的多租户,这意味着每个应用程序租户都使用一个专用的数据源。

数据源 JNDI 名称在运行时根据请求应用程序的用户名(用户名说明必须使用哪个租户)解析。解析是实现了Hibernate的org.hibernate.service.jdbc.connections.spi.ConnectionProvider接口。

Spring 配置(摘录)是:

在应用程序部署期间,Spring 初始化应用程序和 org.springframework.orm.hibernate4.LocalSessionFactoryBean 实例。这最终会执行数据库访问。此数据库访问失败,因为我们的 CustomConnectionProvider 返回一个空连接。我们返回一个空连接,因为在部署时,我们无法识别当前租户。在应用程序部署期间访问数据库毫无意义。我们得到的堆栈跟踪是:

我查看了 Hibernate 源代码,发现了一个可以在部署期间禁用数据库访问的属性:

但它似乎在这里不起作用。

更新 1:这个 Hibernate 属性确实在应用程序部署期间禁用了数据库访问。但是根据 Hibernate 4.1.12 中的 org.hibernate.engine.jdbc.internal.JdbcServicesImpl,这个属性是一个未记录的临时魔法值。

是否有推荐的方法在部署期间禁用数据库访问以正确支持多租户?

感谢您的时间

0 投票
2 回答
924 浏览

hibernate - 在 OSGi 中使用 Hibernate 而不定义包/类来扫描属性

我有以下情况:

我正在使用 karaf 在基于 OSGi 的环境中工作。我正在制作使用项目 A 来持久化其实体的小型组件/捆绑包。项目 A 将始终首先加载,因为其他项目都依赖于它。

项目 A 将在启动时启动会话工厂,但没有任何包/类来扫描实体。

现在任何包尝试使用项目 A 持久化对象都会以异常结束,这很明显

org.hibernate.MappingException:未知实体:

有什么方法可以在不扫描任何包/类的情况下保留实体...?

0 投票
0 回答
270 浏览

java - 重用 hibernateTemplate 对象会导致资源/内存泄漏?

我正在使用 Spring ORM 支持在我的应用程序中实现一些 RESTFul Web 服务。应用程序在几个小时后停止响应。我怀疑资源泄漏。

我有类似这样的代码:

我正在重用会话对象来执行查询以及 query2。重用会话对象会导致资源泄漏吗?

0 投票
5 回答
85084 浏览

spring - Spring DAO vs Spring ORM vs Spring JDBC

我正在浏览 Spring 支持的数据访问技术,我注意到它提到了多个选项,我不确定它们之间的区别:

据我了解,Spring JDBC 提供了模板,用于减少通过普通方式访问数据库的样板代码——您编写自己的 SQL 查询。

Spring-ORM 提供了通过 ORM 技术访问数据库的简化模板,例如 Hibernate、My(i)Batis 等。

Spring-DAO 根据 Spring 的网站:

Spring 中的数据访问对象 (DAO) 支持旨在以一致的方式轻松使用 JDBC、Hibernate 或 JDO 等数据访问技术

我对 ORM 与 JDBC 有点清楚,因为它们针对的是访问数据库的不同方式。但是 Spring-DAO 简直令人困惑!

任何人都可以澄清这三个之间到底有什么区别?在哪些场景下应该首选哪个?

此外,还有另一个项目Spring-DATAhttp://projects.spring.io/spring-data/)现在,它是 Spring 支持的所有数据访问技术的父项目,还是只是 Spring 的新名称-道?

0 投票
1 回答
1231 浏览

spring-data-jpa - 什么是 Spring JPA EntityManager 替代“OpenSessionInterceptor”?

我正在开发一个使用 Spring 的 HibernateOpenSessionInViewFilter和 AOP 版本的项目 - OpenSessionInterceptor. AOP 拦截器是为 Quartz 作业配置的,以便在作业执行期间提供与 Web 请求期间相同的便利。

现在,我正在将这个项目从原生 Spring / Hibernate ORM 迁移到 Spring JPA,并使用 Hibernate 作为提供者。尽管OpenEntityManagerInViewFilterSpring ORM 提供了一个(它与会话过滤器基本相同),但没有OpenEntityManagerInterceptor或类似的东西。我无法弄清楚这里最好的方法是什么,所以问题是:

我应该编写自己的拦截器和/或摆弄这些SharedEntityManager类,还是有其他方法?

注意:该项目现在使用 Spring 4.0、JPA 2.1 和 Hibernate 4.3 构建。

0 投票
1 回答
8031 浏览

spring - java.lang.IllegalArgumentException:无法将 java.lang.Short 字段设置为 java.lang.Short

我是hibernate的新手,我有以下课程,我使用的是Spring hibernate和mysql。

下面提到的是我们数据库的结构,

每当我尝试将记录插入设备表时,都会出现以下错误,

我真的不知道为什么会出现上述错误。

所有设置器都已正确安装,已将其删除,只是为了避免更多代码。

表之间的关系如下,DeviceType 定义了设备的类型。Device 表定义了实际的设备,因此 DeviceType 是 Device 的属性之一,Many 设备会有相同的 DeviceType(遵循 ManyToOne 的原则,Many Devices 有相同的 DeviceType)。

0 投票
1 回答
2198 浏览

java - spring orm 4.0.6 中的 HibernateTemplate 缺少 saveOrUpdateAll

我正在尝试将我们的应用程序从 spring 2.5.6 迁移到最新版本的 spring 4.0.6。我面临的问题之一是 HibernateTemplate 缺少 saveOrUpdateAll。我可以手动更改它,但我需要更改它关闭 200 个文件。我不知道为什么 Spring 删除它而不是弃用它。有人有解决方法吗?我相信这是痛苦迁移的开始。

0 投票
1 回答
460 浏览

spring - NPE in Hibernate 4

We are in the process of upgrading all our third-party libraries to the latest versions, mostly related to Spring 4 and Hibernate 4. After fixing all the compilation issues, I am running into a deployment issue in Jboss 4.2.3. When I debugged into the Hibernate code I figured out where the exception is. But not sure why this causes a NPE.

Exception is happening when referencedEntity.getKey() returning null for the below object in org.hibernate.cfg.Ejb3JoinColumn.java. This was working with Hibernate 3.3.0 and Spring 3.2.2

Above class is referred from the below domain object.

I have listed the jars present in WEB-INF/lib folder under the war file.

Please let me know if you need more information.

Thanks in advance, Ram

0 投票
1 回答
765 浏览

spring - 使用 JPA2.1 的 persistenceUnitName

我有一个 Spring 项目(使用 JPA2.1)并且 persistenceUnitName 在该项目中被定义为“默认”。

我已经在另一个spring批处理项目(也使用spring-JPA2.1)中定义了这个项目的依赖关系(使用maven)(在另一个项目中使用spring-core.jar来重用一些实体类和其他东西)。

当我在这个项目中定义相同的persistenceUnitName 时,它​​给了我一个persistenceUnitName 的冲突错误。

但是当我在这个项目中更改persistenceUnitName的名称时,它无法创建导入项目的persistenceUnitName(“默认”)。所以无法创建导入项目的 JPA 类(为此我在 pom.xml 中定义了依赖项)

请建议我一些解决方案。实际上,这与hibernate以这种方式工作,但迁移给我们带来了困难。