当我所做的只是一个列表时,为什么 Hibernate 会删除我的集合条目?

2024-03-26

我似乎有一个相当奇怪的问题。我在 JSP 中显示用户及其角色。由于某种原因,角色仅在第一次加载页面时显示。我刷新页面,角色全部从数据库中删除了!

我的设置是标准 Spring MVC、JPA + Hibernate(通过 Spring Data)应用程序。 (Spring 3.2.x、Hibernate 4.1.8)

我有两个实体 -User and Role如下所示(假设setter和getter)

@Entity
public class User {
    @Id
    @GeneratedValue
    private int id;

    private String name;

    @ManyToMany
    @JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
    private Set<Role> roles = new HashSet<>();
}

@Entity
public class Role {
    @Id
    private String id;

    private String name;
}

我有一个 Spring 数据存储库,它没有定义任何额外的方法。

public interface UserRepository extends CrudRepository<User, Integer> { 
}

我有一个服务和一个控制器,其相关方法如下。

// service
@Transactional(readOnly = true)
public Iterable<User> findAll() {
    return userRepository.findAll();
}

// controller
@RequestMapping
public String showUsers(ModelMap model) {
    model.put("users", userService.findAll());

    return "admin/users";
}

在我的 JSP 中,我尝试显示所有用户和任何关联的角色。

<c:forEach var="user" items="${users}">
    <tr>
        <td>${user.name}</td>
        <td>
           <c:forEach var="role" items="${user.roles}">
                ${role.name}
            </c:forEach>
        </td>
    </tr>
</c:forEach>

正如我之前所说,我的记录user_role该页面呈现后,表将被删除。

启用后DEBUG for org.hibernate并启用查询日志记录,这是我在日志中发现的内容:

22:36:25 DEBUG Collection dereferenced: [com.adarshr.domain.User.roles#1] [Collections.java:76]
22:36:25 DEBUG Flushed: 0 insertions, 0 updates, 0 deletions to 2 objects [AbstractFlushingEventListener.java:117]
22:36:25 DEBUG Flushed: 0 (re)creations, 0 updates, 1 removals to 1 collections [AbstractFlushingEventListener.java:124]
22:36:25 DEBUG Deleting collection: [com.adarshr.domain.User.roles#1] [AbstractCollectionPersister.java:1124]
22:36:25 DEBUG 
    delete 
    from
        user_role 
    where
        user_id=? [SqlStatementLogger.java:104]
22:36:25 DEBUG Done deleting collection [AbstractCollectionPersister.java:1182]

很明显,这里发生了一些可疑的事情。为什么我的集合首先被取消引用?

这是我的 JPA 实体管理器工厂定义。

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="mainDataSource" />
    <property name="packagesToScan" value="com.adarshr.domain" />
    <property name="persistenceProviderClass" value="org.hibernate.ejb.HibernatePersistence" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
    </property>
    <property name="jpaProperties">
        <value>
            hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
            hibernate.format_sql=${hibernate.format.sql}
            hibernate.ejb.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy
            hibernate.show_sql=${hibernate.show.sql}
            hibernate.enable_lazy_load_no_trans=true
        </value>
    </property>
</bean>

我在这里遗漏了一些明显的东西吗?


由于您发布的代码似乎是正确的,我在这里猜测。

我建议的第一件事是删除这个初始化(这似乎是删除角色的唯一地方),这本身通常是一个好主意(请参阅下面的评论)我认为可能会干扰hibernate.enable_lazy_load_no_trans=true众所周知泄漏连接 https://hibernate.onjira.com/browse/HHH-7524在过去:

 private Set<Role> roles = new HashSet<>();

第二次尝试是检查如果您还使用mappedBy 注释ManyToMany 关系的反面是否会发生变化以及发生了什么变化。

第三种尝试是,如果急切地加载集合可以解决问题(进一步加剧enable_lazy_load_no_trans位置),请使用FetchType、Hibernate.initialize()或任何你想要的。

最后一个是摆脱enable_lazy_load_no_trans并使用OpenSessionInView

编辑:啊,最后一个,你可能*有这个错误(hibernate 4.1.8 和 4.1.9 受影响):https://hibernate.onjira.com/browse/HHH-7971 https://hibernate.onjira.com/browse/HHH-7971

因此尝试使用 4.1.7 可能会得到更好的结果(或者可能更糟)。

*其中 may 的意思是:“您的情况非常相似,邀请您将代码作为错误报告中的测试用例发送”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当我所做的只是一个列表时,为什么 Hibernate 会删除我的集合条目? 的相关文章

  • 包含小时、分钟和秒的周期[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要一个代表年 月 周 日 小时 分钟 秒的间隔数据类型 前三年 年 月 日 可以用Period最后
  • RSA 加密-解密:BadPaddingException:数据必须以零开头

    对于一个被问了很多次的问题 我很抱歉向您询问您的技能 我有一个关于 RSA 加密的问题 我已经检查过有关此问题的其他主题 但没有找到任何有用的答案 我希望你能帮助我 我想读取一个文件 加密其内容 然后解密它并将这些解密的字节放入一个新文件中
  • @NotNull.List 的目的

    当我查看标准时限制条件 http docs oracle com javaee 6 api javax validation constraints package summary html在 Bean Validation API JSR
  • 可以向 @ManyToMany Hibernate 额外表添加额外字段吗?

    我有这两类 表 Entity Table name course public class Course Id Column name courseid private String courseId Column name coursen
  • 从继承的受保护 Java 字段创建公共访问器

    我怎样才能完成以下工作 class Foo extends javax swing undo UndoManager increase visibility works for method override def editToBeUnd
  • 文件保存在文件系统中 VS 保存在数据库中

    我正在设计一个 servlet 或 Struts2 中的操作 用于文件 图像 文档等 下载 但我想知道哪种更好的方法可以将文件保留在文件系统和数据库中 只需保留文件的路径或将文件保留在数据库中 如 BLOB 我知道当我查询数据库时 哪里的
  • 如何将 wsdl 内部架构设置为 Jaxb2Marshaller 以验证我所做的每篇文章?

    我正在使用 SOAP Web 服务 在调用它之前我必须验证每个 xml 帖子 所以我正在使用 The CXF codegen 插件生成POJO树结构 第三部分 wsdl xxxx soap service wsdl 一个类实现Web服务网关
  • 如何连接hibernate和DB2

    我正在运行一个使用 struts 和 hibernate 的应用程序 我目前正在使用 Derby 数据库 现在我必须转向 DB2 数据库 请告诉我 我必须做什么配置 休眠配置文件 我必须设置任何类路径吗 多变的 我知道 DB2 有两个 ja
  • 在 JSON 对象中强制执行非空字段

    我们的 REST API 接收一些 JSON 对象输入 其中某些字段要求不为空 这些可以是字符串 整数 甚至可以是其他一些类实例作为参考 我们正在尝试找到一种方法来强制这些字段不为空 而不是在 API 中进行空检查的正确方法 当前的 if
  • 获取证书链

    我正在 Java 中使用 X509 证书 给定一个证书 是否可以在签名层次结构中找到所有其他证书 直到找到根证书 我有一个证书文件 带有 cer扩展名 我想提取父签名证书 我想继续查找该证书的父证书 直到获得最终的自签名根证书 我已经检查了
  • 如何获取队列中的第 n 个项目?

    我的应用程序中有许多队列和优先级队列 我想轻松访问这些队列中的第 n 个项目 但没有看到使用 API 实现此目的的简单方法 我想我可以创建一个Iterator并迭代到第 n 个元素或使用toArray index 但似乎应该有一个更简单的方
  • 在openjdk:7-jre-alpine docker上如何安装python 3.6

    直到大约一周前 我才在 java 图像上成功使用 python 3 6 脚本 如下所示 FROM openjdk 7 jre alpine RUN apk update apk upgrade apk add no cache bash a
  • 为什么jdk中没有ConcurrentLinkedHashMap类?

    这个问题直接接着问从我之前的问题来看 https stackoverflow com q 12299731 1527084 我想我的第二个问题的答案是否定的 所以我想了解为什么 java util concurrent 包中没有 Concu
  • Android - 保持用户登录状态

    我正在尝试使用 PHP 和 MySQLi for Android 进行登录 我不明白的是如何保持用户登录状态 我看到一个简单的教程 其中有人使用 SQLite 来保护信息 但我不知道这是否真的安全 如何保存用户信息以保持用户登录状态 谢谢
  • Spring Boot:在映射级别指定端口

    Spring Boot 我希望实现以下目标 一些 URL 路径映射到一个端口 一些映射到另一个端口 换句话说 我想要这样的东西 public class Controller1 RequestMapping value path1 port
  • 在 Java 服务器中验证 Windows 用户

    我正在开发一个用 Java 编写的服务器和一个在同一网络上的 Windows 计算机上运行的客户端 用 Net 编写的桌面应用程序 我希望进行一些基本身份验证 以便服务器可以确定运行客户端的用户的用户名 而不需要用户在客户端中重新输入其 W
  • 如何将多部分文件从另一个服务发送到一个服务

    我有两个端点 api 它们是 uploadand 重定向 upload是我直接上传文件的地方 重定向是我接收文件并将其传递给上传并获取 JSON 响应的地方 upload 所以下面是我的代码 package com example impo
  • 如何使用 Spring Resource.groovy 正确注入 Grails 服务

    使用 Grails 2 2 1 我定义了以下 Grails 服务 package poc class TestService def helperService class HelperService 我已经用过TestService如下
  • Android应用程序中的模式输入

    我想知道是否有其他替代方案可以替代 Android 上平庸的 EditText 密码输入 是否有 API 或开源代码可以集成到我的应用程序中 类似于锁屏图案解锁 Intent 可能会返回哈希值 数字 字符串或代表用户输入的模式的任何内容 我
  • 如果所有类不在同一个包中,Spring @autowired 不起作用

    我有四个包裹 com spring org Files HomeController java com spring org dao Files SubscriberDao java SubscriberDaoImpl java com s

随机推荐

  • 在 AFNetworking 2.x 中设置自定义标头后,RESTful API 未接收参数

    我遵循了建议的解决方案AFNetworking 2 0 向 GET 请求添加标头 https stackoverflow com questions 19466291 afnetworking 2 0 add headers to get
  • Angular 2+ 中的 Bootstrap 3 Datepicker(带或不带 jquery)

    我是 Angular 2 的新手 我正在尝试将 Bootstrap 3 Datepicker 集成到 AngularJS2 我使用了 解决方案 如何在 Angular 2 中使用 Bootstrap 3 Datepicker https s
  • 更改 Angular 中的检测周期 - 澄清吗?

    关于ChangeDetectorRef 我已经知道了 detectChanges实际上触发变化检测 同时 markForCheck 组件的实际变化检测是not已计划但将来何时发生 作为 当前或下一个 CD 周期 取自这里 https sta
  • 如何M2MQTT自动重连

    我正在尝试使用此协议 并且已经有 2 个客户端 一个用于发布 另一个用于订阅 和一个正在工作的经纪人 我的问题是我想在订阅客户端中实现重新连接功能 因为 wifi 信号不稳定并且不想每次都手动重新启动客户端 我该如何实现这一点 您可以使用
  • .NET 的 Environment.NewLine 的 R 等效项

    是否有 R 等效项环境 NewLine https msdn microsoft com en us library system environment newline v vs 110 aspx在 NET 中 我正在寻找一个角色对象 它
  • 打开特定主题的 .CHM 文件?

    我创建了一个 CHM 文件 然后当我在 c 中打开它时 我得到了第一个主题 我想打开它到一个指定的主题 这是我现在用来打开它的代码 Help ShowHelp this Resources ServerHelp chm 我希望能够将其打开到
  • 是否可以根据百分位值而不是原始输入绘制箱线图?

    据我所见 boxplot 方法需要一系列原始值 数字 作为输入 然后计算百分位数以绘制箱线图 我想要一种方法 通过它我可以传递百分位数并获得相应的boxplot 例如 假设我已经运行了多个基准测试 并且对于每个基准测试 我都测量了延迟 浮点
  • C++ 和 Boost:编码/解码 UTF-8

    我正在尝试做一个非常简单的任务 采用 unicode awarewstring并将其转换为string 编码为 UTF8 字节 然后以相反的方式 取string包含 UTF8 字节并将其转换为 unicode 感知wstring 问题是 我
  • 在 Magento 中复制并粘贴类别

    我想将我的第一个类别复制到 Magento 中的第二个类别 我应该怎么办 谢谢 韦斯利 By code
  • XML DeSerialize - 可以在文件中捕获额外的 XML 吗?

    有没有办法将您在课堂上没有预料到的额外 XML 标记捕获到文件中 例如 using System using System Collections Generic using System IO using System Linq usin
  • 使用 Flask-Restful 返回渲染的模板在浏览器中显示 HTML

    我是 Python 和 Flask 的新手 我的应用程序的根目录中有一个模板文件夹 其中有两个文件
  • 启动时 LiteSQL DB 不为空

    我认为这是一个相当简单的问题 我对 Android 的东西还太年轻 我想准备将使用数据库的应用程序 在我展示的每个示例中 都有一个空数据库 其中首先启动应用程序 然后进行一些插入 我希望应用程序具有相当大的数据库 因此我希望在应用程序启动时
  • 对于具有行间距和多种颜色的单行文本,UILabel 大小不正确

    我很确定这实际上是一个 UIKit 错误 但想获得一些输入来看看我是否在这里遗漏了一些愚蠢的东西 这是我的代码 single line with modified line spacing and 2 colors broken line
  • MVC3 中的 IValidatableObject - 客户端验证

    使用 MVC3 您可以使用两种新机制来添加自定义验证 它们是 1 ValidationAttribute 子类或 2 实现 IValidatableObject ValidationAttribute 允许您通过实现 IClientVali
  • 在哪里可以找到使用 RSpec 测试 Thor 脚本的好示例?

    在哪里可以找到使用 RSpec 测试 Thor 脚本的好示例 到目前为止 我的搜索还没有找到任何好的结果 尝试 Thor 自己的存储库 https github com wycats thor tree master spec https
  • Unity 的 YUV 着色器?

    我在 Unity 中有一些 适当的 平面的 YUV 纹理 我只想看看它们供开发使用 Unity 他们的着色器语言变体 实际上有一个可用的 YUV 着色器吗 从概念上讲 从 YUV 转换为 RGB 很简单 但有点繁琐 YUV 到 RGB 转换
  • ASP.NET MVC 3 中的 OutputCache 行为

    我刚刚在 ASP NET MVC 3 的 RC 版本中测试输出缓存 不知何故 它不尊重 VaryByParam 属性 或者更确切地说 我不确定我理解发生了什么 public ActionResult View UserViewCommand
  • 如何捕获 Web 服务抛出的肥皂异常?

    我成功地在我的网络服务中抛出了一些肥皂异常 我想捕获异常并访问异常调用的字符串和 ClientFaultCode 以下是我在 Web 服务中的一个例外示例 throw new SoapException You lose the game
  • 如何根据偏航角计算方向矢量?

    我有一个问题 我不知道如何使用 Java LWJGL 计算方向向量以在 OpenGL 中渲染 我有以下系统 X 转到屏幕右侧 Z 进入我的屏幕 Y 转到屏幕顶部 高度 因此我正在XZ平面上行走 现在我想要执行 已经执行了WASD运动 并且它
  • 当我所做的只是一个列表时,为什么 Hibernate 会删除我的集合条目?

    我似乎有一个相当奇怪的问题 我在 JSP 中显示用户及其角色 由于某种原因 角色仅在第一次加载页面时显示 我刷新页面 角色全部从数据库中删除了 我的设置是标准 Spring MVC JPA Hibernate 通过 Spring Data