次のエンティティがあります。
@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
私は何を間違っていますか?