Java MySQL自动递增设置为22378;分配的新记录id=1
MySQL(InnoDB)自动增量似乎配置正确,但调用Java MySQL自动递增设置为22378;分配的新记录id=1,java,mysql,jpa,eclipselink,Java,Mysql,Jpa,Eclipselink,MySQL(InnoDB)自动增量似乎配置正确,但调用 em.persist(entry) 导致错误的原因: 异常[EclipseLink 4002](Eclipse持久性服务2.5.0.v20130507 3faac2b):org.Eclipse.Persistence.exceptions.DatabaseException 内部异常:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: 键“
em.persist(entry)
导致错误的原因:
异常[EclipseLink 4002](Eclipse持久性服务2.5.0.v20130507 3faac2b):org.Eclipse.Persistence.exceptions.DatabaseException
内部异常:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:
键“PRIMARY”的重复条目“1”
错误代码:1062
要持久化的实体(条目)使用主键条目id,通过该条目将其连接到库存表
@Entity
@Table(name="entries")
public class Entry implements Serializable {
/**
*
*/
private static final long serialVersionUID = 8144553107778486945L;
/*
* PRIMARY KEY & ID FOR THE CASE
*/
@Id
@Column(name="ENTRY_ID")
@GeneratedValue(strategy = GenerationType.AUTO) // was TABLE
private Long entry_id;
@Version
private Integer version;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "entry",
cascade={CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name="entry_id")
private List<InventoryEntry> inventory =
new ArrayList<InventoryEntry>();
收益率:
max(entry_id)
22377
运行:
show table status from chambers like ‘entries’
在MySQL命令行中,客户端显示下一个自动递增编号:
22378
问题:为什么要将id=1分配给新记录?
据我所知,自动增量在数据库启动时重置为max(id)+1,查询结果证实了这一点。我应该补充一下,这个表以前使用过:strategy=GenerationType.table,重复条目“1”错误首先是使用这个策略出现的(这就是我采用自动递增策略的原因)。我已经删除了序列表。我还删除了数据库,并从Java类重新生成了模式,从备份中重新填充了数据。都没有用
描述条目显示条目id行的配置,如下所示:
字段:条目ID,
类型:bigint(20),
空:没有,
关键:PRI,
默认值:NULL,
额外:自动增量
该行被索引为主行。因此,一切似乎都井然有序
我应该补充一点,这个web应用程序使用运行在Glassfish 4.0社区服务器(最近从Glassfish 3.1.2.2嵌入式服务器升级)中的MySQL InnoDB数据库。EclipseKepler是Windows7 64位平台上的IDE
我已经用尽了我微薄的能力的极限。任何帮助都将不胜感激。使用@GeneratedValue(strategy=GenerationType.IDENTITY)
而不是@GeneratedValue(strategy=GenerationType.AUTO)
因为:
身份策略还在提交期间为每个新实体对象生成一个自动值。不同之处在于,每个类型层次结构管理一个单独的标识生成器,因此生成的值仅在每个类型层次结构中是唯一的。您看到了这个问题,因为MySQL没有生成行的ID,而EclipseLink是唯一的。您可以尝试使用
GenerationType.IDENTITY
强制JPA使用标识列(强制从数据库重新读取以更新Java对象),也可以恢复以前的状态;我不知道EclipseLink如何实现GenerationType.AUTO
显示插入字符串?感谢您和@chrylis的快速响应!这个解决方案非常有效。谢谢你的解释。我仍在学习如何使用注释。@RobertPeake您对注释没有做任何错误,只是注释的意思(告诉JPA提供者如何创建值)与您希望发生的事情(告诉它使用数据库的自动赋值)不匹配。在EclipseLink中,自动默认为表生成。
22378