Было найдено несколько строк с данным идентификатором, когда я пытаюсь объединить объект
Я сталкиваюсь со следующей ошибкой в Hibernate: было найдено несколько строк с данным идентификатором, когда я пытаюсь объединить объект.
Детали :
- Я использую Spring 2.5, Hibernate 3.2 и мое приложение, развернутое на Websphere ver 7.x
- Я применил БД-сеанс по методологии HTTP-запроса (а не к реализации Spring), но я использовал ThreadLocal для сохранения сеанса, который будет использоваться снова в текущем HTTP-запросе, и как только ответ будет готов к отправке клиенту, у меня есть HTTPFilter для закрытия любого открытого сеанса в этой теме.
- Я получил ошибку, когда у меня есть массовая операция в БД в рамках одного HTTP-запроса (Удаление, обновление, слияние, вставка, …..)
- Я использовал источник данных JNDI, управляемый самой Websphere
- Я думал, что следую: В начале моей просьбы я попросил фабрику сеансов предоставить мне экземпляр сеанса, и я использовал этот сеанс в своем запросе, пока не закрыл его в конце обработки запроса. и метод слияния спящего режима пытаются загрузить объект перед его объединением, как только выполняется запрос на загрузку: исключение указывается, что (было найдено несколько строк с данным идентификатором), для меня это означает, что объект загружался в текущий сеанс раньше, поэтому первая глупая идея заключалась в том, чтобы очистить и закрыть текущий сеанс перед слиянием и запустить новый для этого слияния, я сделал это, но я столкнулся с такой же ошибкой, это означает, что я неправильно думал о том, начало.
- Второй подход, который я пытаюсь выполнить, состоит в том, чтобы разделить эту объемную операцию на несколько операций, выполняемых непосредственно в отдельном запросе ajax (предположим, что у меня есть сетка с функциями обновления и удаления для каждой строки, я разрешаю пользователю обновлять и удалять все, что он хочет и я кэширую эти изменения до тех пор, пока пользователь не нажмет кнопку «применить», чтобы применить все эти изменения, новая идея: после того, как пользователь попытался удалить строку, новый HTTP-запрос (с сеансом DB) будет отвечать за удаление этой строки в базы данных, в этом случае больше не нужно использовать кнопку «Применить», потому что изменения, отраженные непосредственно в БД)
Структура базы данных (MS SQLServer 2008):
- Как указать схему для SQL Server в конфигурации JDBC Spring
- Почему Annotation @Value всегда возвращает значение null при использовании Spring PropertySourcesPlaceholderConfigurer?
- Spring Boot не работает, когда я добавляю sql-скрипт
- Спящий режим с проблемой блокировки sqlserver
- Отключить транзакции для вызова Hibernate с сохраненными процедурами
CREATE TABLE [dbo].[Correspondence_Site]( [Id] [int] IDENTITY(1,1) NOT NULL, [Name] [varchar](500) NULL, [Parent_Id] [int] NULL, [Is_Active] [bit] NOT NULL, [Dept_Id] [int] NULL, CONSTRAINT [PK_Correspondence_Sites] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY] ALTER TABLE [dbo].[Correspondence_Site] WITH NOCHECK ADD CONSTRAINT [FK_Correspondence_Sites_Correspondence_Sites] FOREIGN KEY([Parent_Id]) REFERENCES [dbo].[Correspondence_Site] ([Id]) ALTER TABLE [dbo].[Correspondence_Site] CHECK CONSTRAINT [FK_Correspondence_Sites_Correspondence_Sites] ALTER TABLE [dbo].[Correspondence_Site] ADD CONSTRAINT [DF_Correspondence_Site_Is_Active] DEFAULT ((1)) FOR [Is_Active] CREATE TABLE [dbo].[Dep_Correspondence_Site]( [Department_Id] [int] NOT NULL, [Correspondence_Site_Id] [int] NOT NULL, [Serial] [varchar](50) NOT NULL, [Site_Order] [int] NULL, [Security_Level] [int] NULL) ON [PRIMARY] ALTER TABLE [dbo].[Dep_Correspondence_Site] WITH NOCHECK ADD CONSTRAINT [FK__Dep_Correspondence_Sites_Correspondence_Sites] FOREIGN KEY([Correspondence_Site_Id]) REFERENCES [dbo].[Correspondence_Site] ([Id]) ALTER TABLE [dbo].[Dep_Correspondence_Site] CHECK CONSTRAINT [FK__Dep_Correspondence_Sites_Correspondence_Sites] ALTER TABLE [dbo].[Dep_Correspondence_Site] WITH NOCHECK ADD CONSTRAINT [FK_Dep__Correspondence_Sites_Departments] FOREIGN KEY([Department_Id]) REFERENCES [dbo].[Department] ([Id]) CREATE TABLE [dbo].[Department]( [Id] [int] IDENTITY(1,1) NOT NULL, [Description] [varchar](80) NOT NULL, [Parent] [int] NULL, [Type] [int] NOT NULL, [Prefix] [varchar](100) NULL, [Ldap_Prefix] [varchar](200) NULL, [Serial_Prefix] [varchar](20) NULL, [Manager_Id] [int] NULL, [Assistant_Id] [int] NULL, [Telephone_Numbers] [varchar](100) NULL, [Fax_Numbers] [varchar](100) NULL, [SMS_Max_Time] [int] NULL, [Email_Max_Time] [int] NULL, [Has_Correspondence] [bit] NULL, [Email] [varchar](50) NULL, [Logo_Image_Name] [varchar](50) NULL, [Code] [int] NULL, [Incoming_Fields] [int] NULL, [Outgoing_Fields] [int] NULL, [Internal_Memo_Fields] [int] NULL, [Folder_Path] [nvarchar](200) NULL, [Department_Last_Data_Update] [datetime] NULL, CONSTRAINT [PK_Departments] PRIMARY KEY CLUSTERED ([Id] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]
Тезисы трех таблиц связаны следующим образом:
- У каждого отдела есть 0..n матчей_сайта
- Каждый сайт соответствия может быть связан с отделом 0..n
- Таблица Dep_Correspondence_Site позволяет сделать вышеуказанное отношение с некоторыми дополнительными полями, такими как (Serial, SecurityLevel, Order, ..)
Когда я сгенерировал Mapping в спящем режиме, были созданы следующие классы:
- Department.java, DepartmentDAO.java и Department.hbm.xml
- КорреспонденцияSite.java, КорреспонденцияSiteDAO.java и КорреспонденцияSite.hbm.xml
- DepCorrespondenceSite.java, DepCorrespondenceSiteDAO.java, DepCorrespondanceSiteId.java, DepCorrespondenceSite.hbm.xml
DepCorrespondanceSiteId является составным идентификатором.
DepCorrespondenceSiteId dcsID = new DepCorrespondenceSiteId(); dcsID.setDepartment(department); dcsID.setCorrespondenceSite(fullCorrespondenceSite.mainCorrespondenceSite); DepCorrespondenceSite dcs = new DepCorrespondenceSite(); dcs.setId(dcsID); dcs.setSerial(fullCorrespondenceSite.mainCorrespondenceSite.getSerial()); dcs.setSiteOrder(new Integer(mainOrder)); dcs.setSecurityLevel(fullCorrespondenceSite.mainCorrespondenceSite.getSecurityLevel()); depCorrespondenceSiteDAO.update(dcs); // Save sub correspondence site in database for(CorrespondenceSite subCorrespondenceSite: fullCorrespondenceSite.subCorrespondenceSites){ dcsID = new DepCorrespondenceSiteId(); dcsID.setDepartment(department); dcsID.setCorrespondenceSite(subCorrespondenceSite); dcs = new DepCorrespondenceSite(); dcs.setId(dcsID); dcs.setSerial(subCorrespondenceSite.getSerial()); dcs.setSecurityLevel(subCorrespondenceSite.getSecurityLevel()); dcs.setSiteOrder(new Integer(subOrder)); depCorrespondenceSiteDAO.update(dcs); subOrder ++; }
В цикле, и когда я попытался обновить dcs, я получил следующую ошибку (эта ошибка не для всех записей, некоторые записи обновлены правильно и t исключение выбрано для четвертой записи)
[2/5/12 11:36:25:489 AST] 00000015 DefaultLoadEv I org.hibernate.event.def.DefaultLoadEventListener onLoad Error performing load command org.hibernate.HibernateException: More than one row with the given identifier was found: com.[email protected]cc7f, for class: com.ebla.moi.correspondence.model.entity.db.DepCorrespondenceSite at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:69) at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:42) at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3044) at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:395) at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:375) at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:139) at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:179) at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:103) at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:878) at org.hibernate.impl.SessionImpl.get(SessionImpl.java:815) at org.hibernate.event.def.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:229) at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:120) at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:53) at org.hibernate.impl.SessionImpl.fireMerge(SessionImpl.java:677) at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:661) at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:665) at org.springframework.orm.hibernate3.HibernateTemplate$23.doInHibernate(HibernateTemplate.java:765) at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:372) at org.springframework.orm.hibernate3.HibernateTemplate.merge(HibernateTemplate.java:762) at com.ebla.moi.correspondence.model.entity.db.DepCorrespondenceSiteDAO.update(DepCorrespondenceSiteDAO.java:56) at com.ebla.moi.correspondence.view.bean.admin.departments.DepartmentVariablesBean.saveCorrespondenceSites(DepartmentVariablesBean.java:1438) at com.ebla.moi.correspondence.view.bean.admin.departments.DepartmentVariablesBean.saveAdministration(DepartmentVariablesBean.java:1007) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37) at java.lang.reflect.Method.invoke(Method.java:611) at org.apache.el.parser.AstValue.invoke(AstValue.java:159) at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276) at com.sun.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:68) at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:99) at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88) at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:770) at javax.faces.component.UICommand.broadcast(UICommand.java:372) at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:458) at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:763) at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) at com.icesoft.faces.webapp.http.core.JsfLifecycleExecutor.apply(JsfLifecycleExecutor.java:18) at com.icesoft.faces.webapp.http.core.ReceiveSendUpdates.renderCycle(ReceiveSendUpdates.java:132) at com.icesoft.faces.webapp.http.core.ReceiveSendUpdates.service(ReceiveSendUpdates.java:74) at com.icesoft.faces.webapp.http.core.RequestVerifier.service(RequestVerifier.java:31) at com.icesoft.faces.webapp.http.common.standard.PathDispatcherServer.service(PathDispatcherServer.java:24) at com.icesoft.faces.webapp.http.servlet.BasicAdaptingServlet.service(BasicAdaptingServlet.java:16) at com.icesoft.faces.webapp.http.servlet.PathDispatcher.service(PathDispatcher.java:23) at com.icesoft.faces.webapp.http.servlet.SessionDispatcher.service(SessionDispatcher.java:53) at com.icesoft.faces.webapp.http.servlet.SessionVerifier.service(SessionVerifier.java:26) at com.icesoft.faces.webapp.http.servlet.PathDispatcher.service(PathDispatcher.java:23) at com.icesoft.faces.webapp.http.servlet.MainServlet.service(MainServlet.java:131) at javax.servlet.http.HttpServlet.service(HttpServlet.java:831) at com.icesoft.faces.webapp.xmlhttp.BlockingServlet.service(BlockingServlet.java:56) at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1657) at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1597) at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:131) at com.ebla.moi.correspondence.util.filters.CharsetFilter.doFilter(CharsetFilter.java:28) at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:188) at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:116) at com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter(WebAppFilterChain.java:77) at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:908) at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:934) at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:502) at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:179) at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:91) at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:864) at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1583) at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:186) at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:445) at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:504) at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:301) at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:83) at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165) at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217) at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161) at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138) at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204) at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775) at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905) at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1604)
Функция обновления в DepCorrespondenceSiteDAO.java:
public void update(DepCorrespondenceSite transientInstance){ log.debug("updating DepCorrespondenceSite instance"); try { if(transientInstance.getId() != null){ getMyHibernateTemplate().merge(transientInstance); }else{ getMyHibernateTemplate().saveOrUpdate(transientInstance); } log.debug("update successful"); } catch (RuntimeException re) { log.error("update failed", re); throw re; } }
DepCorrespondanceSiteId.java
public class DepCorrespondenceSiteId implements java.io.Serializable { private Department department; private CorrespondenceSite correspondenceSite; public DepCorrespondenceSiteId() { } public DepCorrespondenceSiteId(Department department, CorrespondenceSite correspondenceSite) { this.department = department; this.correspondenceSite = correspondenceSite; } public Department getDepartment() { return this.department; } public void setDepartment(Department department) { this.department = department; } public CorrespondenceSite getCorrespondenceSite() { return this.correspondenceSite; } public void setCorrespondenceSite(CorrespondenceSite correspondenceSite) { this.correspondenceSite = correspondenceSite; } }
Пожалуйста, помогите мне. С уважением
- Java JPA / Hibernate с SQL Server - как определить, когда столбцы в db не сопоставлены сущностью?
- Хранимая процедура T-SQL не возвращает ноль с помощью COUNT (*) на пустой результат SELECT
- Spring управляет подключением источника данных к серверу MS Sql с аутентификацией домена
- Spring JdbcTemplate Подготовленные утверждения с SQL Server 2012
- Как сопоставить datetime2 с Joda LocalDateTime
- Отсутствует артефакт com.microsoft.sqlserver: sqljdbc4: jar: 4.0
- JdbcBatchItemWriter - Неверный синтаксис рядом с ключевым словом 'ON'
- Аргументы шаблона JDBC SQL, если значение параметра равно null, затем используйте то, что находится в базе данных