Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MySQL自动递增设置为22378;分配的新记录id=1_Java_Mysql_Jpa_Eclipselink - Fatal编程技术网

Java MySQL自动递增设置为22378;分配的新记录id=1

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: 键“

MySQL(InnoDB)自动增量似乎配置正确,但调用

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