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

“PersistenceException:HibernateeException:找到了多个具有给定标识符的行”-运行select查询时

堵宏毅
2023-03-14
  • Eclipse版本:2021-06 (4.20.0)构建id:20210612-2011
  • Jdk 15.0.2
  • 雄猫8.5.75
  • Maven 3.8.4
  • 冬眠5.4.22。最终

执行此查询会引发异常:

            userObject = (User) session.createQuery("FROM User U WHERE U.username = :userName")
                .setParameter("userName", userName).uniqueResult();
@Entity
@Table(name = "users")
public class User implements Serializable {
    
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "structure_id")
    private Structure structure;
@Entity
@Table(name = "structure")
public class Structure implements Serializable {

    @OneToOne(mappedBy = "structure")
    private User user;

一个User只能有一个结构,一个结构可以有很多个Users

CREATE TABLE `structure` (
  `structure_id` int NOT NULL,
  `nom_structure` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`structure_id`),
  UNIQUE KEY `UK_irbn1likcfwrr1wckpjifcsv` (`nom_structure`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3

CREATE TABLE `users` (
  `user_id` int NOT NULL,
  `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  `etat` int DEFAULT NULL,
  `phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  `first_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  `last_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  `dateExpiration` date DEFAULT NULL,
  `currentAccessDate` datetime(6) DEFAULT NULL,
  `lastAccessDate` datetime(6) DEFAULT NULL,
  `structure_id` int DEFAULT NULL,
  PRIMARY KEY (`user_id`),
  KEY `FK7qgxvgafv4ohh16kh0fgfm4b0` (`structure_id`),
  CONSTRAINT `FK7qgxvgafv4ohh16kh0fgfm4b0` FOREIGN KEY (`structure_id`) REFERENCES `structure` (`structure_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3
javax.persistence.PersistenceException: org.hibernate.HibernateException: More than one row with the given identifier was found: 964, for class: com.myProject.helpdesk.models.Structure
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154)
    at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1542)
    at org.hibernate.query.internal.AbstractProducedQuery.uniqueResult(AbstractProducedQuery.java:1575)
    at com.myProject.helpdesk.dao.UserDao.validate(UserDao.java:50)
    at com.myProject.helpdesk.controllers.Login.authenticate(Login.java:74)
    at com.myProject.helpdesk.controllers.Login.doPost(Login.java:58)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:652)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at com.myProject.helpdesk.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:33)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:544)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:616)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:831)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1634)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.base/java.lang.Thread.run(Thread.java:832)

我认为Structure类的注释映射是错误的,应该是:

@OneToMany(mappedBy = "structure")
private List<User> user;

而不是这个:

@OneToOne(mappedBy = "structure")
private User user;

我只需要在运行这个简单的select查询时返回一个用户对象

        userObject = (User) session.createQuery("FROM User U WHERE U.username = :userName")
            .setParameter("userName", userName).uniqueResult();

任何帮助赞赏。

共有1个答案

周育
2023-03-14

鉴于此

一个用户只能有一个结构,一个结构可以有多个用户

您确实应该考虑更改映射到@ OneToMany。

顺便说一下,尽量避免像这样的铸件:

userObject = (User) session.createQuery("FROM User U WHERE U.username = :userName")
            .setParameter("userName", userName).uniqueResult();

相反,通过将预期的实体类作为第二个参数传递给Session::createQuery方法,将查询转换为TypedQuery,如下所示:

userObject = session.createQuery("FROM User U WHERE U.username = :userName", User.class)
            .setParameter("userName", userName).uniqueResult(); 
 类似资料:
  • 我在我的spring boot应用程序中出现了这个错误。当我想调用这个存储库时,我遇到了这个错误 这是我的存储库: 这就是我称之为此方法的地方: 如何检查方法返回的结果?我调试了我的代码,但在断点它只是返回这个错误。 谢谢你的帮助。

  • 我在使用spring数据从1对1关系btn表检索数据时遇到了一个问题。我已经回顾了平台上的几个解决方案,但奇怪的是,在问题首次出现之前,我已经实现了所有建议的解决方案。请帮助我找到我所缺少的东西,或是使对他人有用的解决方案对我无效的任何东西。 以下是这两个实体之间的关系 错误消息: 2021-12-23 15:02:42.116错误11144---[nio-8089-exec-5]o.a.c.c.

  • 我有一个实体:与实体:之间的关系如下: QueryParameter实体: HtmlElement实体: 组件实体: 类型实体: 基本上,这里的关系意味着一个html元素有一个与其相关的组件。 现在,当我想要找到如下所示的所有组件时: 它给出了以下错误: 如果我运行生成的查询,它将返回3行,但这没有任何意义,因为Component有不同的html组件(input、select等),并且HtmlEl

  • 在eclipse中调试时 退回申请。isEmpty()?空:应用程序。得到(0); 这些表达式被计算为 applications.is空()- 应用。获取(0)- 应用。大小()- 但在执行这一行之后,它的抛出错误 组织。冬眠HibernateeException:找到了多个具有给定标识符的行:263536, 即使它的大小显示为1,那么它为什么以及如何在执行后获得多行。

  • 我正在开发EJB-JPA-JSF项目。但是我有一个问题。我得到这个查询的错误: 如何修复此错误

  • 当我尝试使用findById()方法从数据库中获取单个记录时,或者当我尝试使用spring数据REST更新一篇文章时,我遇到了一个异常:找到了具有给定标识符的不止一行。 delete和findAll方法正常工作。 我已经检查了数据库,没有多个相同ID的记录。另外,id是数据库中的唯一键。我见过很多人有同样的错误,但这些人的问题是他们在哪里使用联接。我没有任何加入。 该实体: 存储库: 例外情况: