繁体   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