У меня есть следующая сущность:
@Entity
@Table(name = "sales", schema = "cust_tables")
@Multitenant(MultitenantType.TABLE_PER_TENANT)
@TenantTableDiscriminator(contextProperty = "customer_schema", type = TenantTableDiscriminatorType.SCHEMA)
@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class Sale implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "Sale")
@TableGenerator(name = "Sale", schema = "thehub", allocationSize = 5)
@Column(name = "id", unique = true, nullable = false, updatable = false)
@XmlElement
private Long id;
Во время операции сохранения я могу намеренно разрешить откат транзакции во время сбоя оптимистичной блокировки.
Однако я удивлен поведением JPA/EclipseLink во время этого сценария. JPA присваивает значение из последовательности id
, как и ожидалось. Однако при откате это значение не «стирается». Затем в следующий раз, когда я попытаюсь сохраниться, значение для id
уже есть. JPA пропускает извлечение нового числа из последовательности и пытается сохранить сущность.
Я терплю неудачу с исключением ограничения целостности SQL:
Caused by: javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130226-e0971b1): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '51' for key 'PRIMARY'
Error Code: 1062
Что я делаю неправильно?