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

时间:2013-09-27 16:24:39

标签: java mysql jpa eclipselink

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

em.persist(entry)

导致错误:

异常[EclipseLink 4002](Eclipse Persistence Services 2.5.0.v20130507 3faac2b):org.eclipse.persistence.exceptions.DatabaseException

内部异常:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: 键'PRIMARY'重复输入'1' 错误代码:1062

要保留的实体(Entry)使用主键entry_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>();

运行查询:

select max(entry_id) FROM entries

的产率:

max(entry_id)
22377

运行:

show table status from chambers like ‘entries’
MySQL命令行客户端中的

显示下一个自动增量编号为:

22378

问题:为什么id = 1被分配给新记录?

据我了解,自动增量在数据库启动时重置为max(id)+ 1,查询结果确认确实如此。我应该补充说,此表以前使用过:strategy = GenerationType.TABLE,并且首先使用此策略出现Duplicate Entry'1'错误(这就是我采用自动增量策略的原因)。我删除了Sequence表。我还删除了数据库并从Java类重新生成了模式,从备份中重新填充数据。一切都没有用。

描述ENTRIES将entry_id行的配置显示为:

FIELD:ENTRY_ID, TYPE:bigint(20), NULL:不, KEY:PRI, DEFAULT:NULL, EXTRA:auto_increment

该行被索引为PRIMARY。因此,一切似乎都是有序的。

我应该补充一点,这个Web应用程序使用在Glassfish 4.0社区服务器(最近从Glassfish 3.1.2.2嵌入式服务器升级)中运行的MySQL InnoDB数据库。 Eclipse Kepler是Windows 7 64位平台上的IDE。

我已经用尽了我微薄能力的极限。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

使用@GeneratedValue(strategy = GenerationType.IDENTITY)代替@GeneratedValue(strategy = GenerationType.AUTO)

<强>因为:

IDENTITY策略还会在提交期间为每个新实体对象生成一个自动值。不同之处在于,每个类型层次结构都管理一个单独的标识生成器,因此生成的值仅对每个类型层次结构是唯一的。

答案 1 :(得分:0)

你看到这个问题是因为MySQL没有生成行的ID,EclipseLink就是这样。您可以尝试使用GenerationType.IDENTITY强制JPA使用标识列(强制重新读取数据库以更新Java对象),或者您可以恢复以前的状态;我不知道EclipseLink如何实现GenerationType.AUTO