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_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'错误(这就是为什么我采用自动递增策略的原因)。我已经删除了序列表。我还删除了数据库,并从Java类重新生成了架构,从而从备份中重新填充了数据。一切都无济于事。
描述ENTRIES将entry_id行的配置显示为:
FIELD:ENTRY_ID,
类型:bigint(20),
空:否,
密码:PRI,
默认值:NULL,
额外:auto_increment
该行被索引为PRIMARY。因此,一切似乎都井井有条。
我应该补充一点,该Web应用程序利用了运行在Glassfish 4.0社区服务器(最近从Glassfish 3.1.2.2嵌入式服务器升级)中的MySQL InnoDB数据库。 Eclipse Kepler是Windows 7 64位平台上的IDE。
我已经用尽了我微薄的能力的极限。任何帮助将不胜感激。
最佳答案
您会看到此问题,因为MySQL不会为行生成ID,EclipseLink会为行生成ID。您可以尝试使用GenerationType.IDENTITY
强制JPA使用标识列(这将强制从数据库重新读取以更新Java对象),或者可以还原以前的状态;我不知道EclipseLink如何实现GenerationType.AUTO
。