- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
自从从 EL 2.1 升级到 EclipseLink 2.5 后,我们在之前运行的代码上得到了 PersistenceException。场景非常简单:我们有两个相同的表,唯一的区别是一个是另一个的“历史”版本。基本上,当我们确定某行不会再更改时,我们将该行移至历史表。这意味着虽然 id 是在第一个表上生成的,但它在历史表上是“继承”的。以下是实体:
@Entity
@Table(name = "DOCUMENT")
public class Document implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private long id;
// Some other fields
}
@Entity
@Table(name = "DOCUMENT_HISTORY")
public class DocumentHistory implements Serializable {
@Id
private long id;
// Some other fields
}
为了将一行移动到历史表中,我们使用原生查询(因为某些列未映射为实体类中的字段):
String query = "INSERT INTO DOCUMENT_HISTORY SELECT * FROM DOCUMENT t WHERE t.id=?1";
Query updateQuery = entityManager.createNativeQuery(query);
updateQuery.setParameter(1, document.getId());
updateQuery.executeUpdate();
执行此查询时,有时会抛出此异常:
javax.persistence.PersistenceException: Exception [EclipseLink-7251] (Eclipse Persistence Services - 2.5.1.v20130918-f2b9fc5):
org.eclipse.persistence.exceptions.ValidationException
Exception Description: The attribute [id] of class [org.myc.entities.jpa.company.DocumentHistory] is mapped to a primary key column in the database. Updates are not allowed.
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.flush(EntityManagerImpl.java:868)
at org.eclipse.persistence.internal.jpa.QueryImpl.performPreQueryFlush(QueryImpl.java:963)
at org.eclipse.persistence.internal.jpa.QueryImpl.executeUpdate(QueryImpl.java:296)
at org.myc.utility.jpa.user.DocumentManager.toDocumentHistory(DocumentManager.java:141)
at java.lang.Thread.run(Thread.java:662)
Caused by: Exception [EclipseLink-7251] (Eclipse Persistence Services - 2.5.1.v20130918-f2b9fc5): org.eclipse.persistence.exceptions.ValidationException
Exception Description: The attribute [id] of class [org.myc.entities.jpa.company.DocumentHistory] is mapped to a primary key column in the database. Updates are not allowed.
at org.eclipse.persistence.exceptions.ValidationException.primaryKeyUpdateDisallowed(ValidationException.java:2548)
at org.eclipse.persistence.mappings.foundation.AbstractDirectMapping.writeFromObjectIntoRowWithChangeRecord(AbstractDirectMapping.java:1257)
at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildRowForUpdateWithChangeSet(ObjectBuilder.java:1768)
at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.updateObjectForWriteWithChangeSet(DatabaseQueryMechanism.java:1030)
at org.eclipse.persistence.queries.UpdateObjectQuery.executeCommitWithChangeSet(UpdateObjectQuery.java:84)
at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.executeWriteWithChangeSet(DatabaseQueryMechanism.java:301)
at org.eclipse.persistence.queries.WriteObjectQuery.executeDatabaseQuery(WriteObjectQuery.java:58)
at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:899)
at org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:798)
at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWorkObjectLevelModifyQuery(ObjectLevelModifyQuery.java:108)
at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWork(ObjectLevelModifyQuery.java:85)
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2896)
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1793)
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1775)
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1726)
at org.eclipse.persistence.internal.sessions.CommitManager.commitChangedObjectsForClassWithChangeSet(CommitManager.java:267)
at org.eclipse.persistence.internal.sessions.CommitManager.commitAllObjectsForClassWithChangeSet(CommitManager.java:192)
at org.eclipse.persistence.internal.sessions.CommitManager.commitAllObjectsWithChangeSet(CommitManager.java:138)
at org.eclipse.persistence.internal.sessions.AbstractSession.writeAllObjectsWithChangeSet(AbstractSession.java:4196)
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabase(UnitOfWorkImpl.java:1441)
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithPreBuiltChangeSet(UnitOfWorkImpl.java:1587)
at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.writeChanges(RepeatableWriteUnitOfWork.java:452)
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.flush(EntityManagerImpl.java:863)
... 5 more
有人遇到同样的问题吗?为什么您认为这不会发生在所有行上,而只会发生在其中一些行上(没有明显的特定特征)?提前致谢,吕克
P.S.:EL 对原生查询执行映射/查询验证是否正确?
最佳答案
如 JPA 2.0 规范所述,executeUpdate()
执行更新或删除语句,因此不支持插入。
您可以使用 EntityManager(在事务中)通过持久化和刷新将实体插入到基础数据库中。您的特定情况下的虚拟示例可能如下所示:
// transaction starts
Document doc = em.find(Document.class, id);
DocumentHistory docHistory = new DocumentHistory(doc);
em.persist(docHistory);
// transaction ends
注意:您可以考虑使用 EclipseLink's auditing 而不是专有解决方案(这很好)特点:
EclipseLink also support full history support, which allows a complete history of all changes made to the database to be tracked in a mirror history table.
关于mysql - EclipseLink: native 查询 INSERT INTO 上的 "Updates are not allowed",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27484162/
命令 npm update 有什么区别和包裹npm-check-updates ?使用后者是否完全安全? 执行后好像是npm update并非所有软件包都已更新,因此似乎不完整。许多其他 popula
我有使用 ExpressJS 和 ORM Sequelize 的 API。我正在尝试使用 Sequelize 中的 update() 方法进行更新。默认情况下,it 方法将返回更新的行数。但我希望结果
关于如何更新 rubygems 有点困惑。过程不断变化(或者至少我从互联网上得到了相互矛盾的信息)。 $ gem outdated rubygems-update (1.8.10 < 1.8.11
我正在使用 webpack-dev-server处于开发模式( watch )。每次服务器重新加载时,一些 json 和 js 文件都会挤满我的构建目录,如下所示:'hash'.hot-update.
Mamp Pro 的当前版本是 5.04 (15996)。可用更新窗口显示“Mamp 5.0.0 > 5.1。更新失败,并显示一条消息:错误:无法验证更新。请确保您使用的是安全网络,然后重试。” 更新
我想在浏览量增加时更新时间戳“lastpageview_at”。我想我已经接近了,但我总是遇到语法错误,有人知道为什么或有其他解决方案吗? 我的触发器: CREATE TRIGGER Update_l
我正在执行 SELECT ... FOR UPDATE 以锁定一条记录,然后进行一些计算,然后进行实际的 UPDATE。我正在处理 InnoDB 数据库。 但是计算可能会以我不想执行 UPDATE 的
我需要在表更新时进行一些更新和插入以强制执行正确的数据。将 UPDATE 语句放入触发器中会导致某种“循环”吗? 谢谢! 最佳答案 更新触发器中的目标表将使触发器再次触发。 您可以使用 TRIGGER
这是我的布局 当我点击链接更新时,该链接应该打开和关闭renderComment bool
我有一个包含两件事的 Angular 范围: 一个包含 10k 行的巨型表格,需要一秒钟才能渲染 一些小的额外信息位于固定的覆盖标题栏中 根据您向下滚动页面/表格的距离,我必须更新标题中的小信息位之一
标题几乎已经说明了一切。 IF NEW.variance <> 0 THEN (kill update) END IF 这可能吗? 最佳答案 查看手册 (http://dev.mysql.com/do
我有几个表,我想强制执行版本控制,并且有一个生效日期和生效日期。每当应用程序或用户向该表写入更新时,我希望它重定向到两个全新的命令:更新目标记录,以便 EFFECTIVE_TO 日期填充当前日期和时间
我正在使用 Shopware,一件奇怪的事情让我抓狂 :( 所以我将首先解释问题是什么。 除了普通商品外,还有多种款式的商品,例如不同尺码的衬衫。这是 XS、S、M、L 和/或不同颜色的同一商品……但
寻求帮助制作 mysql 触发器。我当前的代码无法按预期工作。我想做的是,如果表A中的字段A被修改,则将字段A复制到表A中的字段B。 当前代码如下所示: BEGIN IF new.set_id=301
以下查询(来自此处Postgres SQL SELECT and UPDATE behaving differently) update fromemailaddress set call =
我想使用 D3 使用以下数据创建一个列表: var dataSet = [ { label: 'a', value: 10}, { label: 'b', value: 20},
哪个更好,先进行选择,然后进行更新。或者更确切地说,像这样合而为一: UPDATE items set status = 'NEW' where itemid in (1,2,3,
对于 eloquent model events,updating 和 updated 之间有什么区别? ? 我的猜测是 updating 在模型更新之前触发,而 updated 在模型更新之后触发。
我有一个对象数组(我们称之为arr)。在我的组件输入之一的 (change) 方法中,我修改了这些对象的属性之一,但在 View (*ngFor) 中没有任何变化。我读到 Angular2 变化检测不
我正在尝试使用 d3.js 构建水平日历时间线。主要目标是突出显示用户的假期和假期。 http://jsbin.com/ceperavu/2/edit?css,js,output 我首先从“开始”日期
我是一名优秀的程序员,十分优秀!