- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在两个实体 Pack and Board 之间存在一对多关系。当尝试使用存储库进行保存/更新时,我收到重复条目错误。由于某种原因,hibernate 正在尝试更新 Boards 的“id”字段,这些 Boards 是此关系中的子级(查询可以在下面的错误日志中看到)。
这是我正在使用的代码:
Pack.class
package com.vdts.lumberassets.domain;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import org.hibernate.annotations.IndexColumn;
import org.hibernate.annotations.Type;
import org.joda.time.DateTime;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Entity
@Table(name="packs")
public class Pack extends AbstractEntity{
private SimpleStringProperty slug = new SimpleStringProperty();
private Load load;
private List<Board> boards = new ArrayList<>();
private Customer customer;
private Vendor vendor;
private DateTime dateTallied;
private DateTime dateCreated;
private DateTime dateModified;
@PrePersist
protected void onCreate() {
dateCreated = new DateTime();
dateModified = new DateTime();
}
@PreUpdate
protected void onUpdate() {
dateModified = new DateTime();
}
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, orphanRemoval=true)
@JoinColumn(name="pack_id")
@IndexColumn(name="id")
public List<Board> getBoards() {
return boards;
}
@Transient
public ObservableList<Board> getBoardsObservable(){
return FXCollections.observableArrayList(boards);
}
public void setBoards(List<Board> boards) {
this.boards = boards;
}
public void addBoard(Board board){
this.boards.add(board);
}
@ManyToOne(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
@JoinColumn(name="load_id")
public Load getLoad() {
return load;
}
public void setLoad(Load load) {
this.load = load;
}
@Column(name="slug")
public String getSlug() {
return slug.get();
}
public SimpleStringProperty slugProperty() {
return slug;
}
public void setSlug(String slug) {
this.slug.set(slug);
}
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name="customer_id")
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name="vendor_id")
public Vendor getVendor() {
return vendor;
}
public void setVendor(Vendor vendor) {
this.vendor = vendor;
}
@Column(name="date_created", updatable = false)
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
public DateTime getDateCreated() {
return dateCreated;
}
public void setDateCreated(DateTime dateCreated) {
this.dateCreated = dateCreated;
}
@Column(name="date_modified")
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
public DateTime getDateModified() {
return dateModified;
}
public void setDateModified(DateTime dateModified) {
this.dateModified = dateModified;
}
@Column(name="date_tallied")
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
public DateTime getDateTallied() {
return dateTallied;
}
public void setDateTallied(DateTime dateTallied) {
this.dateTallied = dateTallied;
}
}
Board.class
package com.vdts.lumberassets.domain;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleIntegerProperty;
import org.hibernate.annotations.Type;
import org.joda.time.DateTime;
import javax.persistence.*;
@Entity
@Table(name="boards")
public class Board extends AbstractEntity {
private SimpleIntegerProperty surfaceMeasure = new SimpleIntegerProperty();
private Thickness thickness;
private Specie specie;
private Grade grade;
private Grader grader;
private Pack pack;
private SimpleDoubleProperty length = new SimpleDoubleProperty();
private SimpleIntegerProperty width = new SimpleIntegerProperty();
private DateTime dateCreated;
private DateTime dateModified;
private SimpleDoubleProperty price = new SimpleDoubleProperty();
@PrePersist
protected void onCreate() {
dateCreated = new DateTime();
dateModified = new DateTime();
}
@PreUpdate
protected void onUpdate() {
dateModified = new DateTime();
}
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name="pack_id")
public Pack getPack() {
return pack;
}
public void setPack(Pack pack) {
this.pack = pack;
}
@Column(name="surface_measure")
public int getSurfaceMeasure() {
return surfaceMeasure.get();
}
public SimpleIntegerProperty surfaceMeasureProperty() {
return surfaceMeasure;
}
public void setSurfaceMeasure(int surfaceMeasure) {
this.surfaceMeasure.set(surfaceMeasure);
}
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name="thickness_id")
public Thickness getThickness() {
return thickness;
}
public void setThickness(Thickness thickness) {
this.thickness = thickness;
}
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name="specie_id")
public Specie getSpecie() {
return specie;
}
public void setSpecie(Specie specie) {
this.specie = specie;
}
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name="grade_id")
public Grade getGrade() {
return grade;
}
public void setGrade(Grade grade) {
this.grade = grade;
}
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name="grader_id")
public Grader getGrader() {
return grader;
}
public void setGrader(Grader grader) {
this.grader = grader;
}
@Column(name="length")
public double getLength() {
return length.get();
}
public SimpleDoubleProperty lengthProperty() {
return length;
}
public void setLength(double length) {
this.length.set(length);
}
@Column(name="width")
public int getWidth() {
return width.get();
}
public SimpleIntegerProperty widthProperty() {
return width;
}
public void setWidth(int width) {
this.width.set(width);
}
@Column(name="date_created", updatable = false)
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
public DateTime getDateCreated() {
return dateCreated;
}
public void setDateCreated(DateTime dateCreated) {
this.dateCreated = dateCreated;
}
@Column(name="date_modified")
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
public DateTime getDateModified() {
return dateModified;
}
public void setDateModified(DateTime dateModified) {
this.dateModified = dateModified;
}
@Column(name="price")
public double getPrice() {
return price.get();
}
public SimpleDoubleProperty priceProperty() {
return price;
}
public void setPrice(double price) {
this.price.set(price);
}
}
当尝试执行一些插入然后更新时,如下所示:
Pack pack = new Pack();
pack.addBoard(new Board());
pack.addBoard(new Board());
pack.addBoard(new Board());
ObservableList<Board> boards = pack.getBoardsObservable();
for (Board board : boards) {
board.setLength(13.33);
}
jpaPackRepository.save(pack);
for (Board board : boards) {
board.setLength(26.66);
}
jpaPackRepository.save(pack);
仅当 Boards 表为空时,第一次调用 jpaPackRepository.save() 才会起作用。第二次调用 jpaPackRepository.save() 将失败。
如果boards表不为空,则两者都不起作用。
这是我的存储库中的简单保存代码:
Session session = em.unwrap(Session.class);
session.saveOrUpdate(pack);
return pack;
最后,这是我收到的错误控制台消息:
Exception in thread "main" org.springframework.dao.DataIntegrityViolationException: Duplicate entry '0' for key 'PRIMARY'; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: Duplicate entry '0' for key 'PRIMARY'
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:188)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:154)
at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:519)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:757)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:726)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:478)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:272)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
at com.sun.proxy.$Proxy55.save(Unknown Source)
at com.vdts.lumberassets.impl.testclasses.TestBoards.run(TestBoards.java:191)
at com.vdts.lumberassets.impl.RunLumberAssets.main(RunLumberAssets.java:15)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: org.hibernate.exception.ConstraintViolationException: Duplicate entry '0' for key 'PRIMARY'
at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:74)
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129)
at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
at com.sun.proxy.$Proxy72.executeUpdate(Unknown Source)
at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:56)
at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1260)
at org.hibernate.action.internal.CollectionRecreateAction.execute(CollectionRecreateAction.java:58)
at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:362)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:354)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:279)
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:326)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52)
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1213)
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:402)
at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175)
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:75)
at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:515)
... 15 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '0' for key 'PRIMARY'
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.Util.getInstance(Util.java:386)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1041)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4237)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4169)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2617)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2778)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2825)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2156)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2459)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2376)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2360)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122)
... 31 more
最后,调试日志中这行奇怪的行:
21:28:55.699 [main] DEBUG o.h.p.c.AbstractCollectionPersister - Inserting collection: [com.vdts.lumberassets.domain.Pack.boards#27]
21:28:55.707 [main] DEBUG org.hibernate.SQL - update boards set pack_id=?, id=? where id=?
我完全不确定为什么 Hibernate 会尝试更新 id 字段,因为它是主键(由 Board 扩展的 AbstractEntity 类设置)。
非常感谢任何想法!我完全被难住了。
最佳答案
当您尝试添加现有主键 ID 0 的新行时,会出现此错误。因此,您可以通过添加 @GenerateValue(strategy=GenerationType.AUTO)
来避免重复相同的主键到实体类的主键。使用此功能,无论您提供什么作为主键,Hibernate 都会生成一个新的主键。
这是自动生成主键的示例。
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
关于java - hibernate @OneToMany错误: Duplicate entry '0' for key 'PRIMARY' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23097425/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!