![](/img/trans.png)
[英]org.hibernate.HibernateException: More than one row with the given identifier was found
[英]" PersistenceException : HibernateException : More than one row with the given identifier was found " - When running select query
執行此查詢會引發異常:
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
只能有一個structure
,一個structure
可以有多個User
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.