[英]MySQL auto-increment set to 22378; new record assigned id = 1
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
據我了解,數據庫啟動時自動遞增將重置為max(id)+1,並且查詢結果證實確實如此。 我應該添加該表以前使用的:strategy = GenerationType.TABLE,並且使用此策略首先出現Duplicate Entry'1'錯誤(這就是我采用自動增量策略的原因)。 我已經刪除了序列表。 我還刪除了數據庫,並從Java類重新生成了架構,從而從備份中重新填充了數據。 一切都無濟於事。
描述ENTRIES將entry_id行的配置顯示為:
字段:ENTRY_ID,類型:bigint(20),空值:否,鍵:優先級,默認值:空值,額外:自動增量
該行被索引為PRIMARY。 因此,一切似乎都井井有條。
我應該補充一點,該Web應用程序利用了運行在Glassfish 4.0社區服務器(最近從Glassfish 3.1.2.2嵌入式服務器升級)中的MySQL InnoDB數據庫。 Eclipse Kepler是Windows 7 64位平台上的IDE。
我已經用盡了我微薄的能力的極限。 任何幫助將不勝感激。
使用@GeneratedValue(strategy = GenerationType.IDENTITY)
而不是@GeneratedValue(strategy = GenerationType.AUTO)
因為:
IDENTITY策略還在提交期間為每個新實體對象生成一個自動值。 不同之處在於,每個類型層次結構都管理一個單獨的標識生成器,因此生成的值僅在每個類型層次結構中都是唯一的。
您會看到此問題,因為MySQL不會為行生成ID,EclipseLink會為行生成ID。 您可以嘗試使用GenerationType.IDENTITY
強制JPA使用標識列(這將強制從數據庫中重新讀取以更新Java對象),或者可以還原以前的狀態; 我不知道EclipseLink如何實現GenerationType.AUTO
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.