簡體   English   中英

“ PersistenceException: HibernateException: 發現多於一行具有給定標識符” - 運行 select 查詢時

[英]" PersistenceException : HibernateException : More than one row with the given identifier was found " - When running select query

我的環境:

  • Eclipse 版本:2021-06 (4.20.0) 內部版本號:20210612-2011
  • JDK 15.0.2
  • Tomcat 8.5.75
  • Maven 3.8.4
  • Hibernate 5.4.22.Final

問題:

執行此查詢會引發異常:

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

我的實體的簡化版本:

1.用戶

@Entity
@Table(name = "users")
public class User implements Serializable {
    
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "structure_id")
    private Structure structure;

2.結構

@Entity
@Table(name = "structure")
public class Structure implements Serializable {

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

一個User只能有一個structure ,一個structure可以有多個User

MySQL 表結構:

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)

我的嘗試

我在想結構 class 的注釋映射是錯誤的,應該是:

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

而不是這個:

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

我只需要在運行這個簡單的 select 查詢時返回一個User object

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

任何幫助表示贊賞。

鑒於

一個用戶只能有一個結構,一個結構可以有多個用戶

你真的應該考慮將映射更改為@OneToMany 和@ManyToOne。 您的異常來自同一結構的多個用戶值。

順便說一句,盡量避免這樣的鑄件:

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

相反,通過將您的預期實體 class 作為第二個參數傳遞給Session::createQuery方法,將您的查詢轉換為 TypedQuery,如下所示:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM